Showing preview only (4,491K chars total). Download the full file or copy to clipboard to get everything.
Repository: Urinx/SublimeCode
Branch: master
Commit: 9d07c01d69e1
Files: 763
Total size: 87.4 MB
Directory structure:
gitextract_fjit1hwf/
├── .gitignore
├── LICENSE
├── README.md
├── Sublime/
│ ├── Cycript.framework/
│ │ ├── Cycript
│ │ └── Headers/
│ │ └── Cycript.h
│ ├── Podfile
│ ├── Pods/
│ │ ├── AASquaresLoading/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── Source/
│ │ │ └── AASquaresLoading.swift
│ │ ├── Alamofire/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── Source/
│ │ │ ├── Alamofire.swift
│ │ │ ├── Download.swift
│ │ │ ├── Error.swift
│ │ │ ├── Manager.swift
│ │ │ ├── MultipartFormData.swift
│ │ │ ├── NetworkReachabilityManager.swift
│ │ │ ├── Notifications.swift
│ │ │ ├── ParameterEncoding.swift
│ │ │ ├── Request.swift
│ │ │ ├── Response.swift
│ │ │ ├── ResponseSerialization.swift
│ │ │ ├── Result.swift
│ │ │ ├── ServerTrustPolicy.swift
│ │ │ ├── Stream.swift
│ │ │ ├── Timeline.swift
│ │ │ ├── Upload.swift
│ │ │ └── Validation.swift
│ │ ├── AlamofireRSSParser/
│ │ │ ├── LICENSE
│ │ │ ├── Pod/
│ │ │ │ └── Classes/
│ │ │ │ ├── AlamofireRSSParser.h
│ │ │ │ ├── AlamofireRSSParser.swift
│ │ │ │ ├── RSSFeed.swift
│ │ │ │ └── RSSItem.swift
│ │ │ └── README.md
│ │ ├── CYRTextView/
│ │ │ ├── CYRTextView/
│ │ │ │ ├── CYRLayoutManager.h
│ │ │ │ ├── CYRLayoutManager.m
│ │ │ │ ├── CYRTextStorage.h
│ │ │ │ ├── CYRTextStorage.m
│ │ │ │ ├── CYRTextView.h
│ │ │ │ ├── CYRTextView.m
│ │ │ │ ├── CYRToken.h
│ │ │ │ └── CYRToken.m
│ │ │ ├── LICENSE
│ │ │ └── README.md
│ │ ├── Charts/
│ │ │ ├── Charts/
│ │ │ │ └── Classes/
│ │ │ │ ├── Animation/
│ │ │ │ │ ├── ChartAnimationEasing.swift
│ │ │ │ │ └── ChartAnimator.swift
│ │ │ │ ├── Charts/
│ │ │ │ │ ├── BarChartView.swift
│ │ │ │ │ ├── BarLineChartViewBase.swift
│ │ │ │ │ ├── BubbleChartView.swift
│ │ │ │ │ ├── CandleStickChartView.swift
│ │ │ │ │ ├── ChartViewBase.swift
│ │ │ │ │ ├── CombinedChartView.swift
│ │ │ │ │ ├── HorizontalBarChartView.swift
│ │ │ │ │ ├── LineChartView.swift
│ │ │ │ │ ├── PieChartView.swift
│ │ │ │ │ ├── PieRadarChartViewBase.swift
│ │ │ │ │ ├── RadarChartView.swift
│ │ │ │ │ └── ScatterChartView.swift
│ │ │ │ ├── Components/
│ │ │ │ │ ├── ChartAxisBase.swift
│ │ │ │ │ ├── ChartComponentBase.swift
│ │ │ │ │ ├── ChartLegend.swift
│ │ │ │ │ ├── ChartLimitLine.swift
│ │ │ │ │ ├── ChartMarker.swift
│ │ │ │ │ ├── ChartXAxis.swift
│ │ │ │ │ └── ChartYAxis.swift
│ │ │ │ ├── Data/
│ │ │ │ │ ├── Implementations/
│ │ │ │ │ │ ├── ChartBaseDataSet.swift
│ │ │ │ │ │ └── Standard/
│ │ │ │ │ │ ├── BarChartData.swift
│ │ │ │ │ │ ├── BarChartDataEntry.swift
│ │ │ │ │ │ ├── BarChartDataSet.swift
│ │ │ │ │ │ ├── BarLineScatterCandleBubbleChartData.swift
│ │ │ │ │ │ ├── BarLineScatterCandleBubbleChartDataSet.swift
│ │ │ │ │ │ ├── BubbleChartData.swift
│ │ │ │ │ │ ├── BubbleChartDataEntry.swift
│ │ │ │ │ │ ├── BubbleChartDataSet.swift
│ │ │ │ │ │ ├── CandleChartData.swift
│ │ │ │ │ │ ├── CandleChartDataEntry.swift
│ │ │ │ │ │ ├── CandleChartDataSet.swift
│ │ │ │ │ │ ├── ChartData.swift
│ │ │ │ │ │ ├── ChartDataEntry.swift
│ │ │ │ │ │ ├── ChartDataSet.swift
│ │ │ │ │ │ ├── CombinedChartData.swift
│ │ │ │ │ │ ├── LineChartData.swift
│ │ │ │ │ │ ├── LineChartDataSet.swift
│ │ │ │ │ │ ├── LineRadarChartDataSet.swift
│ │ │ │ │ │ ├── LineScatterCandleRadarChartDataSet.swift
│ │ │ │ │ │ ├── PieChartData.swift
│ │ │ │ │ │ ├── PieChartDataSet.swift
│ │ │ │ │ │ ├── RadarChartData.swift
│ │ │ │ │ │ ├── RadarChartDataSet.swift
│ │ │ │ │ │ ├── ScatterChartData.swift
│ │ │ │ │ │ └── ScatterChartDataSet.swift
│ │ │ │ │ └── Interfaces/
│ │ │ │ │ ├── IBarChartDataSet.swift
│ │ │ │ │ ├── IBarLineScatterCandleBubbleChartDataSet.swift
│ │ │ │ │ ├── IBubbleChartDataSet.swift
│ │ │ │ │ ├── ICandleChartDataSet.swift
│ │ │ │ │ ├── IChartDataSet.swift
│ │ │ │ │ ├── ILineChartDataSet.swift
│ │ │ │ │ ├── ILineRadarChartDataSet.swift
│ │ │ │ │ ├── ILineScatterCandleRadarChartDataSet.swift
│ │ │ │ │ ├── IPieChartDataSet.swift
│ │ │ │ │ ├── IRadarChartDataSet.swift
│ │ │ │ │ └── IScatterChartDataSet.swift
│ │ │ │ ├── Filters/
│ │ │ │ │ ├── ChartDataApproximatorFilter.swift
│ │ │ │ │ └── ChartDataBaseFilter.swift
│ │ │ │ ├── Formatters/
│ │ │ │ │ ├── ChartDefaultFillFormatter.swift
│ │ │ │ │ ├── ChartDefaultXAxisValueFormatter.swift
│ │ │ │ │ ├── ChartFillFormatter.swift
│ │ │ │ │ └── ChartXAxisValueFormatter.swift
│ │ │ │ ├── Highlight/
│ │ │ │ │ ├── BarChartHighlighter.swift
│ │ │ │ │ ├── ChartHighlight.swift
│ │ │ │ │ ├── ChartHighlighter.swift
│ │ │ │ │ ├── ChartRange.swift
│ │ │ │ │ ├── CombinedHighlighter.swift
│ │ │ │ │ └── HorizontalBarChartHighlighter.swift
│ │ │ │ ├── Interfaces/
│ │ │ │ │ ├── BarChartDataProvider.swift
│ │ │ │ │ ├── BarLineScatterCandleBubbleChartDataProvider.swift
│ │ │ │ │ ├── BubbleChartDataProvider.swift
│ │ │ │ │ ├── CandleChartDataProvider.swift
│ │ │ │ │ ├── ChartDataProvider.swift
│ │ │ │ │ ├── LineChartDataProvider.swift
│ │ │ │ │ └── ScatterChartDataProvider.swift
│ │ │ │ ├── Jobs/
│ │ │ │ │ ├── AnimatedMoveViewJob.swift
│ │ │ │ │ ├── AnimatedViewPortJob.swift
│ │ │ │ │ ├── AnimatedZoomViewJob.swift
│ │ │ │ │ ├── ChartViewPortJob.swift
│ │ │ │ │ ├── MoveChartViewJob.swift
│ │ │ │ │ └── ZoomChartViewJob.swift
│ │ │ │ ├── Renderers/
│ │ │ │ │ ├── BarChartRenderer.swift
│ │ │ │ │ ├── BubbleChartRenderer.swift
│ │ │ │ │ ├── CandleStickChartRenderer.swift
│ │ │ │ │ ├── ChartAxisRendererBase.swift
│ │ │ │ │ ├── ChartDataRendererBase.swift
│ │ │ │ │ ├── ChartLegendRenderer.swift
│ │ │ │ │ ├── ChartRendererBase.swift
│ │ │ │ │ ├── ChartXAxisRenderer.swift
│ │ │ │ │ ├── ChartXAxisRendererBarChart.swift
│ │ │ │ │ ├── ChartXAxisRendererHorizontalBarChart.swift
│ │ │ │ │ ├── ChartXAxisRendererRadarChart.swift
│ │ │ │ │ ├── ChartYAxisRenderer.swift
│ │ │ │ │ ├── ChartYAxisRendererHorizontalBarChart.swift
│ │ │ │ │ ├── ChartYAxisRendererRadarChart.swift
│ │ │ │ │ ├── CombinedChartRenderer.swift
│ │ │ │ │ ├── HorizontalBarChartRenderer.swift
│ │ │ │ │ ├── LineChartRenderer.swift
│ │ │ │ │ ├── LineRadarChartRenderer.swift
│ │ │ │ │ ├── LineScatterCandleRadarChartRenderer.swift
│ │ │ │ │ ├── PieChartRenderer.swift
│ │ │ │ │ ├── RadarChartRenderer.swift
│ │ │ │ │ └── ScatterChartRenderer.swift
│ │ │ │ └── Utils/
│ │ │ │ ├── ChartColorTemplates.swift
│ │ │ │ ├── ChartFill.swift
│ │ │ │ ├── ChartPlatform.swift
│ │ │ │ ├── ChartSelectionDetail.swift
│ │ │ │ ├── ChartTransformer.swift
│ │ │ │ ├── ChartTransformerHorizontalBarChart.swift
│ │ │ │ ├── ChartUtils.swift
│ │ │ │ └── ChartViewPortHandler.swift
│ │ │ ├── LICENSE
│ │ │ └── README.md
│ │ ├── DGElasticPullToRefresh/
│ │ │ ├── DGElasticPullToRefresh/
│ │ │ │ ├── DGElasticPullToRefreshConstants.swift
│ │ │ │ ├── DGElasticPullToRefreshExtensions.swift
│ │ │ │ ├── DGElasticPullToRefreshLoadingView.swift
│ │ │ │ ├── DGElasticPullToRefreshLoadingViewCircle.swift
│ │ │ │ └── DGElasticPullToRefreshView.swift
│ │ │ ├── LICENSE
│ │ │ └── README.md
│ │ ├── EZAudio/
│ │ │ ├── EZAudio/
│ │ │ │ ├── AEFloatConverter.h
│ │ │ │ ├── AEFloatConverter.m
│ │ │ │ ├── EZAudio.h
│ │ │ │ ├── EZAudio.m
│ │ │ │ ├── EZAudioFile.h
│ │ │ │ ├── EZAudioFile.m
│ │ │ │ ├── EZAudioPlayer.h
│ │ │ │ ├── EZAudioPlayer.m
│ │ │ │ ├── EZAudioPlot.h
│ │ │ │ ├── EZAudioPlot.m
│ │ │ │ ├── EZAudioPlotGL.h
│ │ │ │ ├── EZAudioPlotGL.m
│ │ │ │ ├── EZAudioPlotGLKViewController.h
│ │ │ │ ├── EZAudioPlotGLKViewController.m
│ │ │ │ ├── EZMicrophone.h
│ │ │ │ ├── EZMicrophone.m
│ │ │ │ ├── EZOutput.h
│ │ │ │ ├── EZOutput.m
│ │ │ │ ├── EZPlot.h
│ │ │ │ ├── EZPlot.m
│ │ │ │ ├── EZRecorder.h
│ │ │ │ ├── EZRecorder.m
│ │ │ │ ├── TPCircularBuffer.c
│ │ │ │ └── TPCircularBuffer.h
│ │ │ ├── LICENSE
│ │ │ └── README.md
│ │ ├── Gifu/
│ │ │ ├── Carthage/
│ │ │ │ └── Checkouts/
│ │ │ │ └── Runes/
│ │ │ │ └── Source/
│ │ │ │ └── Runes.swift
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── Source/
│ │ │ ├── AnimatableImageView.swift
│ │ │ ├── AnimatedFrame.swift
│ │ │ ├── Animator.swift
│ │ │ ├── ArrayExtension.swift
│ │ │ ├── CGSizeExtension.swift
│ │ │ ├── FunctionalHelpers.swift
│ │ │ ├── Gifu.h
│ │ │ ├── ImageSourceHelpers.swift
│ │ │ └── UIImageExtension.swift
│ │ ├── NMSSH/
│ │ │ ├── LICENSE
│ │ │ ├── NMSSH/
│ │ │ │ ├── Config/
│ │ │ │ │ ├── NMSSH+Protected.h
│ │ │ │ │ ├── NMSSHLogger.h
│ │ │ │ │ ├── NMSSHLogger.m
│ │ │ │ │ ├── socket_helper.h
│ │ │ │ │ └── socket_helper.m
│ │ │ │ ├── NMSFTP.h
│ │ │ │ ├── NMSFTP.m
│ │ │ │ ├── NMSFTPFile.h
│ │ │ │ ├── NMSFTPFile.m
│ │ │ │ ├── NMSSH.h
│ │ │ │ ├── NMSSHChannel.h
│ │ │ │ ├── NMSSHChannel.m
│ │ │ │ ├── NMSSHConfig.h
│ │ │ │ ├── NMSSHConfig.m
│ │ │ │ ├── NMSSHHostConfig.h
│ │ │ │ ├── NMSSHHostConfig.m
│ │ │ │ ├── NMSSHSession.h
│ │ │ │ ├── NMSSHSession.m
│ │ │ │ └── Protocols/
│ │ │ │ ├── NMSSHChannelDelegate.h
│ │ │ │ └── NMSSHSessionDelegate.h
│ │ │ ├── NMSSH-iOS/
│ │ │ │ ├── Libraries/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── libssh2/
│ │ │ │ │ │ ├── libssh2.h
│ │ │ │ │ │ ├── libssh2_publickey.h
│ │ │ │ │ │ └── libssh2_sftp.h
│ │ │ │ │ └── lib/
│ │ │ │ │ ├── libcrypto.a
│ │ │ │ │ ├── libssh2.a
│ │ │ │ │ └── libssl.a
│ │ │ │ └── NMSSH.h
│ │ │ └── README.md
│ │ ├── Pods.xcodeproj/
│ │ │ └── project.pbxproj
│ │ ├── RongCloudIMKit/
│ │ │ └── Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/
│ │ │ ├── Emoji.plist
│ │ │ ├── RongCloud.bundle/
│ │ │ │ ├── sms-received.caf
│ │ │ │ └── unicode_to_hanyu_pinyin.txt
│ │ │ ├── RongIMKit.framework/
│ │ │ │ ├── Headers/
│ │ │ │ │ ├── RCAttributedLabel.h
│ │ │ │ │ ├── RCBaseViewController.h
│ │ │ │ │ ├── RCChatSessionInputBarControl.h
│ │ │ │ │ ├── RCContentView.h
│ │ │ │ │ ├── RCConversationBaseCell.h
│ │ │ │ │ ├── RCConversationCell.h
│ │ │ │ │ ├── RCConversationListViewController.h
│ │ │ │ │ ├── RCConversationModel.h
│ │ │ │ │ ├── RCConversationSettingTableViewController.h
│ │ │ │ │ ├── RCConversationSettingTableViewHeader.h
│ │ │ │ │ ├── RCConversationViewController.h
│ │ │ │ │ ├── RCEmojiBoardView.h
│ │ │ │ │ ├── RCIM.h
│ │ │ │ │ ├── RCImageMessageCell.h
│ │ │ │ │ ├── RCImageMessageProgressView.h
│ │ │ │ │ ├── RCImagePreviewController.h
│ │ │ │ │ ├── RCKitUtility.h
│ │ │ │ │ ├── RCLocationMessageCell.h
│ │ │ │ │ ├── RCLocationPickerViewController.h
│ │ │ │ │ ├── RCLocationViewController.h
│ │ │ │ │ ├── RCMessageBaseCell.h
│ │ │ │ │ ├── RCMessageBubbleTipView.h
│ │ │ │ │ ├── RCMessageCell.h
│ │ │ │ │ ├── RCMessageCellDelegate.h
│ │ │ │ │ ├── RCMessageCellNotificationModel.h
│ │ │ │ │ ├── RCMessageModel.h
│ │ │ │ │ ├── RCPluginBoardView.h
│ │ │ │ │ ├── RCPublicServiceChatViewController.h
│ │ │ │ │ ├── RCPublicServiceListViewController.h
│ │ │ │ │ ├── RCPublicServiceProfileViewController.h
│ │ │ │ │ ├── RCPublicServiceSearchViewController.h
│ │ │ │ │ ├── RCRichContentMessageCell.h
│ │ │ │ │ ├── RCSettingViewController.h
│ │ │ │ │ ├── RCTextMessageCell.h
│ │ │ │ │ ├── RCTextView.h
│ │ │ │ │ ├── RCThemeDefine.h
│ │ │ │ │ ├── RCTipLabel.h
│ │ │ │ │ ├── RCTipMessageCell.h
│ │ │ │ │ ├── RCUnknownMessageCell.h
│ │ │ │ │ ├── RCVoiceMessageCell.h
│ │ │ │ │ └── RongIMKit.h
│ │ │ │ ├── Info.plist
│ │ │ │ └── RongIMKit
│ │ │ ├── RongIMLib.framework/
│ │ │ │ ├── Headers/
│ │ │ │ │ ├── RCAMRDataConverter.h
│ │ │ │ │ ├── RCChatRoomInfo.h
│ │ │ │ │ ├── RCChatRoomMemberInfo.h
│ │ │ │ │ ├── RCCommandMessage.h
│ │ │ │ │ ├── RCCommandNotificationMessage.h
│ │ │ │ │ ├── RCContactNotificationMessage.h
│ │ │ │ │ ├── RCConversation.h
│ │ │ │ │ ├── RCDiscussion.h
│ │ │ │ │ ├── RCDiscussionNotificationMessage.h
│ │ │ │ │ ├── RCGroup.h
│ │ │ │ │ ├── RCGroupNotificationMessage.h
│ │ │ │ │ ├── RCHandShakeMessage.h
│ │ │ │ │ ├── RCIMClient.h
│ │ │ │ │ ├── RCImageMessage.h
│ │ │ │ │ ├── RCInformationNotificationMessage.h
│ │ │ │ │ ├── RCLocationMessage.h
│ │ │ │ │ ├── RCMessage.h
│ │ │ │ │ ├── RCMessageContent.h
│ │ │ │ │ ├── RCMessageContentView.h
│ │ │ │ │ ├── RCProfileNotificationMessage.h
│ │ │ │ │ ├── RCPublicServiceCommandMessage.h
│ │ │ │ │ ├── RCPublicServiceMenu.h
│ │ │ │ │ ├── RCPublicServiceMenuItem.h
│ │ │ │ │ ├── RCPublicServiceMultiRichContentMessage.h
│ │ │ │ │ ├── RCPublicServiceProfile.h
│ │ │ │ │ ├── RCPublicServiceRichContentMessage.h
│ │ │ │ │ ├── RCRealTimeLocationEndMessage.h
│ │ │ │ │ ├── RCRealTimeLocationManager.h
│ │ │ │ │ ├── RCRealTimeLocationStartMessage.h
│ │ │ │ │ ├── RCRichContentItem.h
│ │ │ │ │ ├── RCRichContentMessage.h
│ │ │ │ │ ├── RCStatusDefine.h
│ │ │ │ │ ├── RCStatusMessage.h
│ │ │ │ │ ├── RCSuspendMessage.h
│ │ │ │ │ ├── RCTextMessage.h
│ │ │ │ │ ├── RCUnknownMessage.h
│ │ │ │ │ ├── RCUploadImageStatusListener.h
│ │ │ │ │ ├── RCUserInfo.h
│ │ │ │ │ ├── RCUserTypingStatus.h
│ │ │ │ │ ├── RCUtilities.h
│ │ │ │ │ ├── RCVoiceMessage.h
│ │ │ │ │ ├── RCWatchKitStatusDelegate.h
│ │ │ │ │ ├── RongIMLib.h
│ │ │ │ │ ├── interf_dec.h
│ │ │ │ │ └── interf_enc.h
│ │ │ │ ├── Info.plist
│ │ │ │ ├── RCConfig.plist
│ │ │ │ └── RongIMLib
│ │ │ ├── en.lproj/
│ │ │ │ └── RongCloudKit.strings
│ │ │ ├── libopencore-amrnb.a
│ │ │ └── zh-Hans.lproj/
│ │ │ └── RongCloudKit.strings
│ │ ├── SJCSimplePDFView/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── SJCSimplePDFView/
│ │ │ ├── SJCSimplePDFView.h
│ │ │ └── SJCSimplePDFView.m
│ │ ├── SSZipArchive/
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.md
│ │ │ └── SSZipArchive/
│ │ │ ├── Common.h
│ │ │ ├── SSZipArchive.h
│ │ │ ├── SSZipArchive.m
│ │ │ ├── ZipArchive.h
│ │ │ ├── aes/
│ │ │ │ ├── aes.h
│ │ │ │ ├── aes_via_ace.h
│ │ │ │ ├── aescrypt.c
│ │ │ │ ├── aeskey.c
│ │ │ │ ├── aesopt.h
│ │ │ │ ├── aestab.c
│ │ │ │ ├── aestab.h
│ │ │ │ ├── brg_endian.h
│ │ │ │ ├── brg_types.h
│ │ │ │ ├── entropy.c
│ │ │ │ ├── entropy.h
│ │ │ │ ├── fileenc.c
│ │ │ │ ├── fileenc.h
│ │ │ │ ├── hmac.c
│ │ │ │ ├── hmac.h
│ │ │ │ ├── prng.c
│ │ │ │ ├── prng.h
│ │ │ │ ├── pwd2key.c
│ │ │ │ ├── pwd2key.h
│ │ │ │ ├── sha1.c
│ │ │ │ └── sha1.h
│ │ │ └── minizip/
│ │ │ ├── crypt.h
│ │ │ ├── ioapi.c
│ │ │ ├── ioapi.h
│ │ │ ├── mztools.c
│ │ │ ├── mztools.h
│ │ │ ├── unzip.c
│ │ │ ├── unzip.h
│ │ │ ├── zip.c
│ │ │ └── zip.h
│ │ ├── Swifter/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── Sources/
│ │ │ ├── DemoServer.swift
│ │ │ ├── File.swift
│ │ │ ├── HttpHandlers+Files.swift
│ │ │ ├── HttpHandlers+WebSockets.swift
│ │ │ ├── HttpHandlers.swift
│ │ │ ├── HttpParser.swift
│ │ │ ├── HttpRequest.swift
│ │ │ ├── HttpResponse.swift
│ │ │ ├── HttpRouter.swift
│ │ │ ├── HttpServer.swift
│ │ │ ├── HttpServerIO.swift
│ │ │ ├── Socket.swift
│ │ │ ├── String+BASE64.swift
│ │ │ ├── String+Misc.swift
│ │ │ └── String+SHA1.swift
│ │ ├── SwiftyJSON/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── Source/
│ │ │ └── SwiftyJSON.swift
│ │ ├── Target Support Files/
│ │ │ ├── AASquaresLoading/
│ │ │ │ ├── AASquaresLoading-dummy.m
│ │ │ │ ├── AASquaresLoading-prefix.pch
│ │ │ │ ├── AASquaresLoading-umbrella.h
│ │ │ │ ├── AASquaresLoading.modulemap
│ │ │ │ ├── AASquaresLoading.xcconfig
│ │ │ │ └── Info.plist
│ │ │ ├── Alamofire/
│ │ │ │ ├── Alamofire-dummy.m
│ │ │ │ ├── Alamofire-prefix.pch
│ │ │ │ ├── Alamofire-umbrella.h
│ │ │ │ ├── Alamofire.modulemap
│ │ │ │ ├── Alamofire.xcconfig
│ │ │ │ └── Info.plist
│ │ │ ├── AlamofireRSSParser/
│ │ │ │ ├── AlamofireRSSParser-dummy.m
│ │ │ │ ├── AlamofireRSSParser-prefix.pch
│ │ │ │ ├── AlamofireRSSParser-umbrella.h
│ │ │ │ ├── AlamofireRSSParser.modulemap
│ │ │ │ ├── AlamofireRSSParser.xcconfig
│ │ │ │ └── Info.plist
│ │ │ ├── CYRTextView/
│ │ │ │ ├── CYRTextView-dummy.m
│ │ │ │ ├── CYRTextView-prefix.pch
│ │ │ │ ├── CYRTextView-umbrella.h
│ │ │ │ ├── CYRTextView.modulemap
│ │ │ │ ├── CYRTextView.xcconfig
│ │ │ │ └── Info.plist
│ │ │ ├── Charts/
│ │ │ │ ├── Charts-dummy.m
│ │ │ │ ├── Charts-prefix.pch
│ │ │ │ ├── Charts-umbrella.h
│ │ │ │ ├── Charts.modulemap
│ │ │ │ ├── Charts.xcconfig
│ │ │ │ └── Info.plist
│ │ │ ├── DGElasticPullToRefresh/
│ │ │ │ ├── DGElasticPullToRefresh-dummy.m
│ │ │ │ ├── DGElasticPullToRefresh-prefix.pch
│ │ │ │ ├── DGElasticPullToRefresh-umbrella.h
│ │ │ │ ├── DGElasticPullToRefresh.modulemap
│ │ │ │ ├── DGElasticPullToRefresh.xcconfig
│ │ │ │ └── Info.plist
│ │ │ ├── EZAudio/
│ │ │ │ ├── EZAudio-dummy.m
│ │ │ │ ├── EZAudio-prefix.pch
│ │ │ │ ├── EZAudio-umbrella.h
│ │ │ │ ├── EZAudio.modulemap
│ │ │ │ ├── EZAudio.xcconfig
│ │ │ │ └── Info.plist
│ │ │ ├── Gifu/
│ │ │ │ ├── Gifu-dummy.m
│ │ │ │ ├── Gifu-prefix.pch
│ │ │ │ ├── Gifu-umbrella.h
│ │ │ │ ├── Gifu.modulemap
│ │ │ │ ├── Gifu.xcconfig
│ │ │ │ └── Info.plist
│ │ │ ├── NMSSH/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── NMSSH-dummy.m
│ │ │ │ ├── NMSSH-prefix.pch
│ │ │ │ ├── NMSSH-umbrella.h
│ │ │ │ ├── NMSSH.modulemap
│ │ │ │ └── NMSSH.xcconfig
│ │ │ ├── Pods/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Pods-acknowledgements.markdown
│ │ │ │ ├── Pods-acknowledgements.plist
│ │ │ │ ├── Pods-dummy.m
│ │ │ │ ├── Pods-frameworks.sh
│ │ │ │ ├── Pods-resources.sh
│ │ │ │ ├── Pods-umbrella.h
│ │ │ │ ├── Pods.debug.xcconfig
│ │ │ │ ├── Pods.modulemap
│ │ │ │ └── Pods.release.xcconfig
│ │ │ ├── SJCSimplePDFView/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── SJCSimplePDFView-dummy.m
│ │ │ │ ├── SJCSimplePDFView-prefix.pch
│ │ │ │ ├── SJCSimplePDFView-umbrella.h
│ │ │ │ ├── SJCSimplePDFView.modulemap
│ │ │ │ └── SJCSimplePDFView.xcconfig
│ │ │ ├── SSZipArchive/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── SSZipArchive-dummy.m
│ │ │ │ ├── SSZipArchive-prefix.pch
│ │ │ │ ├── SSZipArchive-umbrella.h
│ │ │ │ ├── SSZipArchive.modulemap
│ │ │ │ └── SSZipArchive.xcconfig
│ │ │ ├── Swifter/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Swifter-dummy.m
│ │ │ │ ├── Swifter-prefix.pch
│ │ │ │ ├── Swifter-umbrella.h
│ │ │ │ ├── Swifter.modulemap
│ │ │ │ └── Swifter.xcconfig
│ │ │ ├── SwiftyJSON/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── SwiftyJSON-dummy.m
│ │ │ │ ├── SwiftyJSON-prefix.pch
│ │ │ │ ├── SwiftyJSON-umbrella.h
│ │ │ │ ├── SwiftyJSON.modulemap
│ │ │ │ └── SwiftyJSON.xcconfig
│ │ │ ├── ZLMusicFlowWaveView/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── ZLMusicFlowWaveView-dummy.m
│ │ │ │ ├── ZLMusicFlowWaveView-prefix.pch
│ │ │ │ ├── ZLMusicFlowWaveView-umbrella.h
│ │ │ │ ├── ZLMusicFlowWaveView.modulemap
│ │ │ │ └── ZLMusicFlowWaveView.xcconfig
│ │ │ └── ZLSinusWaveView/
│ │ │ ├── Info.plist
│ │ │ ├── ZLSinusWaveView-dummy.m
│ │ │ ├── ZLSinusWaveView-prefix.pch
│ │ │ ├── ZLSinusWaveView-umbrella.h
│ │ │ ├── ZLSinusWaveView.modulemap
│ │ │ └── ZLSinusWaveView.xcconfig
│ │ ├── ZLMusicFlowWaveView/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── ZLMusicFlowWaveView/
│ │ │ ├── ZLMusicFlowDecorativeView.h
│ │ │ ├── ZLMusicFlowDecorativeView.m
│ │ │ ├── ZLMusicFlowWaveView.h
│ │ │ └── ZLMusicFlowWaveView.m
│ │ └── ZLSinusWaveView/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── ZLSinusWaveView/
│ │ ├── ZLSinusWaveView.h
│ │ └── ZLSinusWaveView.m
│ ├── Sublime/
│ │ ├── AppDelegate.swift
│ │ ├── AppInfoViewController.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── Repositories.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_douban_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_facebook_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_instagram.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_line_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_more_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_pinterest_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_qq_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_qzone_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_sina_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_twitter_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_wechat_session_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Share_wechat_timeline_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Stars.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── add_friend_icon_addfriend.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── add_friend_icon_group.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── add_friend_icon_offical.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── app_small_icon.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── code_share_btn.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── comment.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── config_cycript.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── config_full_screen_code_reading.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── config_show_hidden_file.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── donate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── donate1.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── donate2.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── donate3.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── donate4.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── donate5.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── donate_weixin.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── explore_codezZ.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_3fr.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_7z.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_aac.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_ai.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_asc.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_asp.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_avi.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_bas.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_cls.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_code_share.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_cpp.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_cr2.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_cs.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_css.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_csv.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_dll.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_dmg.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_dng.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_eps.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_exe.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_fff.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_flv.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_gif.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_gis.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_gpx.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_html.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_j2k.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_jp2.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_jpg.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_js.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_jsp.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_kml.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_kmz.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_mov.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_mp3.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_mp4.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_mpg.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_nef.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_nmea.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_ogg.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_osm.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_otf.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_pdf.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_png.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_ppt.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_pptx.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_ps.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_psd.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_py.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_rar.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_raw.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_svg.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_tar.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_tif.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_ttf.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_txt.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_unknown.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_vb.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_vbs.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_wav.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_wma.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_woff.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_word.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_wsh.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_xaml.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_xls.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_xml.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── file_zip.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── folder.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── function_rss.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── function_scan.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── gist_bg.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── github_avatar.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── github_folder.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── github_fork.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── github_login.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── github_star.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── github_watcher.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── open_safari.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── pdf_continuous.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── pdf_horizontal.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── pdf_vertical.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── repo_download.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── right_arrow.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_cache.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_configure.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_donate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_feedback.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_github.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_license.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_reading.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_server.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_ssh.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_storage.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_sublime.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── setting_themes.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ssh_done.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ssh_keyboard.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ssh_password.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ssh_port.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ssh_server.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ssh_user.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── tab_icon_explore.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── tab_icon_files.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── tab_icon_setting.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── user_author.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── user_info.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── user_robot.imageset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── BoardModel.swift
│ │ ├── BoardView.swift
│ │ ├── Code.swift
│ │ ├── CodeEngine.swift
│ │ ├── CodeViewController.swift
│ │ ├── ConfigTableViewController.swift
│ │ ├── Configure.swift
│ │ ├── Constant.swift
│ │ ├── ContactInfoViewController.swift
│ │ ├── ContactTableViewController.swift
│ │ ├── CustomServer.swift
│ │ ├── DonateViewController.swift
│ │ ├── ExploreTableViewController.swift
│ │ ├── FolderTableViewController.swift
│ │ ├── Gist.swift
│ │ ├── GistTable.swift
│ │ ├── GithubAccountTableViewController.swift
│ │ ├── GithubTableViewController.swift
│ │ ├── Global.swift
│ │ ├── GomokuAI.swift
│ │ ├── GomokuViewController.swift
│ │ ├── HTTPServerTableViewController.swift
│ │ ├── ImageFileViewController.swift
│ │ ├── ImagePageViewController.swift
│ │ ├── Info.plist
│ │ ├── LICENSE/
│ │ │ ├── AASquaresLoading.LICENSE
│ │ │ ├── Alamofire.LICENSE
│ │ │ ├── AlamofireRSSParser.LICENSE
│ │ │ ├── CYRTextView.LICENSE
│ │ │ ├── Charts.LICENSE
│ │ │ ├── DGElasticPullToRefresh.LICENSE
│ │ │ ├── EZAudio.LICENSE
│ │ │ ├── Gifu.LICENSE
│ │ │ ├── MobileVLCKit.LICENSE
│ │ │ ├── NMSSH.LICENSE
│ │ │ ├── RongCloudIMKit.LICENSE
│ │ │ ├── SJCSimplePDFView.LICENSE
│ │ │ ├── SSZipArchive.LICENSE
│ │ │ ├── Swifter.LICENSE
│ │ │ ├── SwiftyJSON.LICENSE
│ │ │ ├── ZLMusicFlowWaveView.LICENSE
│ │ │ └── ZLSinusWaveView.LICENSE
│ │ ├── LicenseTableViewController.swift
│ │ ├── LogoView.xib
│ │ ├── MainTableViewController.swift
│ │ ├── MessageListViewController.swift
│ │ ├── MusicViewController.swift
│ │ ├── NewFileViewController.swift
│ │ ├── PDFViewController.swift
│ │ ├── RCChatViewController.swift
│ │ ├── RSSItemListTableViewController.swift
│ │ ├── RSSListTableViewController.swift
│ │ ├── ReadingViewController.swift
│ │ ├── Repo.swift
│ │ ├── ReposTableViewController.swift
│ │ ├── SDK/
│ │ │ └── Weixin/
│ │ │ ├── WXApi.h
│ │ │ ├── WXApiObject.h
│ │ │ ├── WechatAuthSDK.h
│ │ │ └── libWeChatSDK.a
│ │ ├── SSHAddNewServerViewController.swift
│ │ ├── SSHServerListTableViewController.swift
│ │ ├── SSHTerminalViewController.swift
│ │ ├── SettingTableViewController.swift
│ │ ├── StorageViewController.swift
│ │ ├── Sublime-Bridging-Header.h
│ │ ├── SublimeSafari.swift
│ │ ├── SublimeServer.swift
│ │ ├── Utils/
│ │ │ ├── ActionSheet.swift
│ │ │ ├── Device.swift
│ │ │ ├── Extension/
│ │ │ │ ├── Array.swift
│ │ │ │ ├── Date.swift
│ │ │ │ ├── Number.swift
│ │ │ │ ├── Operation.swift
│ │ │ │ ├── Other.swift
│ │ │ │ ├── String.swift
│ │ │ │ ├── UIApplication.swift
│ │ │ │ ├── UIColor.swift
│ │ │ │ ├── UIImage.swift
│ │ │ │ ├── UIImageView.swift
│ │ │ │ ├── UITableView.swift
│ │ │ │ ├── UITextView.swift
│ │ │ │ ├── UIView.swift
│ │ │ │ └── UIViewController.swift
│ │ │ ├── File.swift
│ │ │ ├── Function.swift
│ │ │ ├── Github.swift
│ │ │ ├── Log.swift
│ │ │ ├── Network.swift
│ │ │ ├── NumberedTextView.swift
│ │ │ ├── Obj-C/
│ │ │ │ ├── MusicWave.h
│ │ │ │ ├── MusicWave.m
│ │ │ │ ├── ObjC.h
│ │ │ │ └── ObjC.m
│ │ │ ├── Plist.swift
│ │ │ ├── PopupMenu.swift
│ │ │ ├── QRCode.swift
│ │ │ ├── QRCodeReader.swift
│ │ │ ├── RCIM.swift
│ │ │ ├── RearrangeTable.swift
│ │ │ ├── ShareToWeixin.swift
│ │ │ ├── SublimeTable.swift
│ │ │ ├── UnitTest.swift
│ │ │ └── VideoPlayerTimeView.swift
│ │ ├── VideoViewController.swift
│ │ ├── Web/
│ │ │ ├── 404.html
│ │ │ ├── README.txt
│ │ │ ├── index.html
│ │ │ ├── js/
│ │ │ │ └── index.js
│ │ │ └── license.txt
│ │ ├── WebServerLog.swift
│ │ ├── en.lproj/
│ │ │ └── Localizable.strings
│ │ ├── zh-Hans.lproj/
│ │ │ └── Localizable.strings
│ │ └── 山外小楼夜听雨.m4a
│ ├── Sublime.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── Sublime.xcworkspace/
│ └── contents.xcworkspacedata
└── Sublime_icons.sketch
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
## Other
*.xccheckout
*.moved-aside
*.xcuserstate
*.xcscmblueprint
## Obj-C/Swift specific
*.hmap
*.ipa
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md
fastlane/report.xml
fastlane/screenshots
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# SublimeCode [](http://github.com/Urinx/SublimeCode) [](http://github.com/Urinx/SublimeCode/fork) [](https://github.com/Urinx/SublimeCode/blob/master/LICENSE)  [](https://github.com/Urinx/SublimeCode/releases)
一个代码阅读应用 - iOS
### 屏幕截图

## 功能说明
### 代码阅读
支持多种编程语言的语法高亮,全屏阅读模式,以及支持生成图片的形式分享代码到朋友圈等。

### 多种文件支持
支持查看多种格式的文件类型,包括图片,视频,音频,PDF等。

### Github支持
现在你可以在本应用里浏览Github里自己的项目和Star的项目了,也能够下载到本地离线阅读代码哟!是不是很方便呢。

### 本地HTTP服务器
还可以是一个本地HTTP服务器哦,支持Log纪录,在手机上方便的与朋友分享自己的网页。

### Cycript支持
Cycript是混合了objective-c与javascript语法的一个工具,让开发者在命令行下和应用交互,在运行时查看和修改应用。而我们的应用也集成了Cycript,是不是很酷炫呢!小伙伴们赶快来体验吧。

### 乱七八糟的功能
是的,你还可以像朋友圈一样的浏览Gist,还能SSH到自己的服务器,以及RSS订阅,与Github好友聊天,二维码扫描等等。没有做不到,只有想不到。

### 以及更多
其实里面还有超级多的功能等待着你去探索和发现,在关于页面里摇一摇还有彩蛋哟!如果你有好的想法和建议也可以告诉我们,说不定下次就加进去了呢。
### 如何安装
鉴于该应用没有上架App Store,同时也没有用企业证书签名,所以目前你只能通过以下两种方式安装,注意的是两者均需要在Mac环境下,以及安装了Xcode。推荐采取方案一的方式。
> 方案一:
>
> 1. 下载已经build好的[ipa文件](https://github.com/Urinx/SublimeCode/releases)。
> 2. 使用Xcode新建一个项目,bundle id可以为`com.xxx.Sublime`,生成相应的证书。
> 3. 使用[iOS App Signer](https://github.com/DanTheMan827/ios-app-signer)重签名本应用,注意选择上一步生成的对应的证书。
> 4. 然后就可以使用iTunes,Xcode等各种软件将重签名后的ipa文件安装到设备上。
> 方案二:
>
> 1. 下载本项目[源码](https://github.com/Urinx/SublimeCode/archive/v1.0.zip)。
> 2. 注意修改bundle id,再编译到设备上。
================================================
FILE: Sublime/Cycript.framework/Headers/Cycript.h
================================================
/* Cycript - Optimizing JavaScript Compiler/Runtime
* Copyright (C) 2009-2013 Jay Freeman (saurik)
*/
/* GNU General Public License, Version 3 {{{ */
/*
* Cycript is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* Cycript is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Cycript. If not, see <http://www.gnu.org/licenses/>.
**/
/* }}} */
#ifndef CYCRIPT_CYCRIPT_H
#define CYCRIPT_CYCRIPT_H
#ifdef __cplusplus
extern "C" {
#endif
void CYListenServer(short port);
#ifdef __cplusplus
}
#endif
#endif/*CYCRIPT_CYCRIPT_H*/
================================================
FILE: Sublime/Podfile
================================================
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'Alamofire', '~> 3.0'
pod 'CYRTextView'
pod 'ZLMusicFlowWaveView'
pod 'SJCSimplePDFView'
pod 'Swifter'
pod 'SwiftyJSON'
pod 'AASquaresLoading'
pod 'DGElasticPullToRefresh'
pod 'SSZipArchive'
pod 'Gifu'
pod 'RongCloudIMKit'
pod 'NMSSH'
pod 'AlamofireRSSParser'
pod 'Charts'
================================================
FILE: Sublime/Pods/AASquaresLoading/LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2015 Anas AIT ALI
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.
================================================
FILE: Sublime/Pods/AASquaresLoading/README.md
================================================
# AASquaresLoading
Simple loading animation using squares

## Example
```swift
let loadingSquare = AASquaresLoading(target: self.view, size: 40)
// Customize background
loadingSquare.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.4)
// Customize color
loadingSquare.color = UIColor.whiteColor()
// Start loading
loadingSquare.start()
....
// Stop loading
loadingSquare.stop()
```
More examples in the demo project.
## Installation
### CocoaPods
1. Add to your podfile : `pod 'AASquaresLoading'`
2. In your terminal : `pod install`
### Manual
1. Add `AASquaresLoading.swift` to your project
2. That's all you can use it!
## Usage
### Basic
1. As a UIView method
```swift
self.view.squareLoading.start(0.0)
...
self.view.squareLoading.stop(0.0)
```
2. As a standalone class
```swift
let loadingSquare = AASquaresLoading(target: self.view, size: 40)
loadingSquare.start()
....
loadingSquare.stop()
```
3. As a custom class interface builder by setting AASquareLoading as a custom class for a UIView
### Customization
##### Change background color
```swift
self.view.squareLoading.backgroundColor = UIColor.redColor()
```
##### Change squares color
```swift
self.view.squareLoading.color = UIColor.whiteColor()
```
##### Change the square size
```swift
self.view.squareLoading.setSquareSize(120)
```
## License
The MIT License (MIT)
Copyright (c) 2015 Anas AIT-ALI
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.
================================================
FILE: Sublime/Pods/AASquaresLoading/Source/AASquaresLoading.swift
================================================
//
// AASquaresLoading.swift
// Etix Mobile
//
// Created by Anas Ait Ali on 18/02/15.
// Copyright (c) 2015 Etix. All rights reserved.
//
import UIKit
//MARK: AASquareLoadingInterface
/**
Interface for the AASquareLoading class
*/
public protocol AASquareLoadingInterface: class {
var color : UIColor { get set }
var backgroundColor : UIColor? { get set }
func start(delay : NSTimeInterval)
func stop(delay : NSTimeInterval)
func setSquareSize(size: Float)
}
private var AASLAssociationKey: UInt8 = 0
//MARK: UIView extension
public extension UIView {
/**
Variable to allow access to the class AASquareLoading
*/
public var squareLoading: AASquareLoadingInterface {
get {
if let value = objc_getAssociatedObject(self, &AASLAssociationKey) as? AASquareLoadingInterface {
return value
} else {
let squareLoading = AASquaresLoading(target: self)
objc_setAssociatedObject(self, &AASLAssociationKey, squareLoading,
objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
return squareLoading
}
}
set {
objc_setAssociatedObject(self, &AASLAssociationKey, newValue,
objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
}
//MARK: AASquareLoading class
/**
Main class AASquareLoading
*/
public class AASquaresLoading : UIView, AASquareLoadingInterface {
public var view : UIView = UIView()
private(set) public var size : Float = 0
public var color : UIColor = UIColor(red: 0, green: 0.48, blue: 1, alpha: 1) {
didSet {
for layer in squares {
layer.backgroundColor = color.CGColor
}
}
}
public var parentView : UIView?
private var squareSize: Float?
private var gapSize: Float?
private var moveTime: Float?
private var squareStartX: Float?
private var squareStartY: Float?
private var squareStartOpacity: Float?
private var squareEndX: Float?
private var squareEndY: Float?
private var squareEndOpacity: Float?
private var squareOffsetX: [Float] = [Float](count: 9, repeatedValue: 0)
private var squareOffsetY: [Float] = [Float](count: 9, repeatedValue: 0)
private var squareOpacity: [Float] = [Float](count: 9, repeatedValue: 0)
private var squares : [CALayer] = [CALayer]()
private var frameHeightOffset: CGFloat = 0
public init(target: UIView) {
super.init(frame: target.frame)
parentView = target
setup(self.size)
}
public init(target: UIView, size: Float) {
super.init(frame: target.frame)
parentView = target
setup(size)
}
public init(target: UIView, size: Float, hasNavigation: Bool, hasTabbar: Bool) {
super.init(frame: target.frame)
if hasNavigation {
self.frameHeightOffset += 64
}
if hasTabbar {
self.frameHeightOffset += 49
}
parentView = target
setup(size)
}
override init(frame: CGRect) {
super.init(frame: frame)
setup(0)
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup(0)
}
public override func layoutSubviews() {
updateFrame()
super.layoutSubviews()
}
private func setup(size: Float) {
self.size = size
updateFrame()
self.initialize()
}
private func updateFrame() {
if parentView != nil {
self.frame = CGRectMake(0, 0, CGRectGetWidth(parentView!.frame), CGRectGetHeight(parentView!.frame) - self.frameHeightOffset)
}
if size == 0 {
let width = frame.size.width
let height = frame.size.height
size = width > height ? Float(height/8) : Float(width/8)
}
self.view.frame = CGRectMake(frame.width / 2 - CGFloat(size) / 2,
frame.height / 2 - CGFloat(size) / 2, CGFloat(size), CGFloat(size))
}
/**
Function to start the loading animation
- Parameter delay : The delay before the loading start
*/
public func start(delay : NSTimeInterval = 0.0) {
if (parentView != nil) {
self.layer.opacity = 0
self.parentView!.addSubview(self)
UIView.animateWithDuration(0.6, delay: delay, options: UIViewAnimationOptions.CurveEaseInOut,
animations: { () -> Void in
self.layer.opacity = 1
}, completion: nil)
}
}
/**
Function to start the loading animation
- Parameter delay : The delay before the loading start
*/
public func stop(delay : NSTimeInterval = 0.0) {
if (parentView != nil) {
self.layer.opacity = 1
UIView.animateWithDuration(0.6, delay: delay, options: UIViewAnimationOptions.CurveEaseInOut,
animations: { () -> Void in
self.layer.opacity = 0
}, completion: { (success: Bool) -> Void in
self.removeFromSuperview()
})
}
}
public func setSquareSize(size: Float) {
self.view.layer.sublayers = nil
setup(size)
}
private func initialize() {
let gap : Float = 0.04
gapSize = size * gap
squareSize = size * (1.0 - 2 * gap) / 3
moveTime = 0.15
squares = [CALayer]()
self.addSubview(view)
if (self.backgroundColor == nil) {
self.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.9)
}
for var i : Int = 0; i < 3; i++ {
for var j : Int = 0; j < 3; j++ {
var offsetX, offsetY : Float
let idx : Int = 3 * i + j
if i == 1 {
offsetX = squareSize! * (2 - Float(j)) + gapSize! * (2 - Float(j))
offsetY = squareSize! * Float(i) + gapSize! * Float(i)
} else {
offsetX = squareSize! * Float(j) + gapSize! * Float(j)
offsetY = squareSize! * Float(i) + gapSize! * Float(i)
}
squareOffsetX[idx] = offsetX
squareOffsetY[idx] = offsetY
squareOpacity[idx] = 0.1 * (Float(idx) + 1)
}
}
squareStartX = squareOffsetX[0]
squareStartY = squareOffsetY[0] - 2 * squareSize! - 2 * gapSize!
squareStartOpacity = 0.0
squareEndX = squareOffsetX[8]
squareEndY = squareOffsetY[8] + 2 * squareSize! + 2 * gapSize!
squareEndOpacity = 0.0
for var i = -1; i < 9; i++ {
self.addSquareAnimation(i)
}
}
private func addSquareAnimation(position: Int) {
let square : CALayer = CALayer()
if position == -1 {
square.frame = CGRectMake(CGFloat(squareStartX!), CGFloat(squareStartY!),
CGFloat(squareSize!), CGFloat(squareSize!))
square.opacity = squareStartOpacity!
} else {
square.frame = CGRectMake(CGFloat(squareOffsetX[position]),
CGFloat(squareOffsetY[position]), CGFloat(squareSize!), CGFloat(squareSize!))
square.opacity = squareOpacity[position]
}
square.backgroundColor = self.color.CGColor
squares.append(square)
self.view.layer.addSublayer(square)
var keyTimes = [Float]()
var alphas = [Float]()
keyTimes.append(0.0)
if position == -1 {
alphas.append(0.0)
} else {
alphas.append(squareOpacity[position])
}
if position == 0 {
square.opacity = 0.0
}
let sp : CGPoint = square.position
let path : CGMutablePathRef = CGPathCreateMutable()
CGPathMoveToPoint(path, nil, sp.x, sp.y)
var x, y, a : Float
if position == -1 {
x = squareOffsetX[0] - squareStartX!
y = squareOffsetY[0] - squareStartY!
a = squareOpacity[0]
} else if position == 8 {
x = squareEndX! - squareOffsetX[position]
y = squareEndY! - squareOffsetY[position]
a = squareEndOpacity!
} else {
x = squareOffsetX[position + 1] - squareOffsetX[position]
y = squareOffsetY[position + 1] - squareOffsetY[position]
a = squareOpacity[position + 1]
}
CGPathAddLineToPoint(path, nil, sp.x + CGFloat(x), sp.y + CGFloat(y))
keyTimes.append(1.0 / 8.0)
alphas.append(a)
CGPathAddLineToPoint(path, nil, sp.x + CGFloat(x), sp.y + CGFloat(y))
keyTimes.append(1.0)
alphas.append(a)
let posAnim : CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "position")
posAnim.removedOnCompletion = false
posAnim.duration = Double(moveTime! * 8)
posAnim.path = path
posAnim.keyTimes = keyTimes
let alphaAnim : CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "opacity")
alphaAnim.removedOnCompletion = false
alphaAnim.duration = Double(moveTime! * 8)
alphaAnim.values = alphas
alphaAnim.keyTimes = keyTimes
let blankAnim : CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "opacity")
blankAnim.removedOnCompletion = false
blankAnim.beginTime = Double(moveTime! * 8)
blankAnim.duration = Double(moveTime!)
blankAnim.values = [0.0, 0.0]
blankAnim.keyTimes = [0.0, 1.0]
var beginTime : Float
if position == -1 {
beginTime = 0
} else {
beginTime = moveTime! * Float(8 - position)
}
let group : CAAnimationGroup = CAAnimationGroup()
group.animations = [posAnim, alphaAnim, blankAnim]
group.beginTime = CACurrentMediaTime() + Double(beginTime)
group.repeatCount = HUGE
group.removedOnCompletion = false
group.delegate = self
group.duration = Double(9 * moveTime!)
square.addAnimation(group, forKey: "square-\(position)")
}
}
================================================
FILE: Sublime/Pods/Alamofire/LICENSE
================================================
Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
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.
================================================
FILE: Sublime/Pods/Alamofire/README.md
================================================

[](https://travis-ci.org/Alamofire/Alamofire)
[](https://img.shields.io/cocoapods/v/Alamofire.svg)
[](https://github.com/Carthage/Carthage)
[](http://cocoadocs.org/docsets/Alamofire)
[](http://twitter.com/AlamofireSF)
Alamofire is an HTTP networking library written in Swift.
## Features
- [x] Chainable Request / Response methods
- [x] URL / JSON / plist Parameter Encoding
- [x] Upload File / Data / Stream / MultipartFormData
- [x] Download using Request or Resume data
- [x] Authentication with NSURLCredential
- [x] HTTP Response Validation
- [x] TLS Certificate and Public Key Pinning
- [x] Progress Closure & NSProgress
- [x] cURL Debug Output
- [x] Comprehensive Unit Test Coverage
- [x] [Complete Documentation](http://cocoadocs.org/docsets/Alamofire)
## Requirements
- iOS 8.0+ / Mac OS X 10.9+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 7.2+
## Migration Guides
- [Alamofire 3.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%203.0%20Migration%20Guide.md)
- [Alamofire 2.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%202.0%20Migration%20Guide.md)
## Communication
- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). (Tag 'alamofire')
- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire).
- 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
> **Embedded frameworks require a minimum deployment target of iOS 8 or OS X Mavericks (10.9).**
>
> Alamofire is no longer supported on iOS 7 due to the lack of support for frameworks. Without frameworks, running Travis-CI against iOS 7 would require a second duplicated test target. The separate test suite would need to import all the Swift files and the tests would need to be duplicated and re-written. This split would be too difficult to maintain to ensure the highest possible quality of the Alamofire ecosystem.
### 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 0.39.0+ is required to build Alamofire 3.0.0+.
To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`:
```ruby
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'Alamofire', '~> 3.0'
```
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 Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`:
```ogdl
github "Alamofire/Alamofire" ~> 3.0
```
Run `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project.
### Manually
If you prefer not to use either of the aforementioned dependency managers, you can integrate Alamofire into your project manually.
#### Embedded Framework
- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository:
```bash
$ git init
```
- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command:
```bash
$ git submodule add https://github.com/Alamofire/Alamofire.git
```
- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project.
> It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.
- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.
- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar.
- In the tab bar at the top of that window, open the "General" panel.
- Click on the `+` button under the "Embedded Binaries" section.
- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.
> It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.
- Select the top `Alamofire.framework` for iOS and the bottom one for OS X.
> You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS` or `Alamofire OSX`.
- And that's it!
> The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.
---
## Usage
### Making a Request
```swift
import Alamofire
Alamofire.request(.GET, "https://httpbin.org/get")
```
### Response Handling
```swift
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
```
> Networking in Alamofire is done _asynchronously_. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are [very good reasons](https://developer.apple.com/library/ios/qa/qa1693/_index.html) for doing it this way.
> Rather than blocking execution to wait for a response from the server, a [callback](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29) is specified to handle the response once it's received. The result of a request is only available inside the scope of a response handler. Any execution contingent on the response or data received from the server must be done within a handler.
### Response Serialization
**Built-in Response Methods**
- `response()`
- `responseData()`
- `responseString(encoding: NSStringEncoding)`
- `responseJSON(options: NSJSONReadingOptions)`
- `responsePropertyList(options: NSPropertyListReadOptions)`
#### Response Handler
```swift
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.response { request, response, data, error in
print(request)
print(response)
print(data)
print(error)
}
```
> The `response` serializer does NOT evaluate any of the response data. It merely forwards on all the information directly from the URL session delegate. We strongly encourage you to leverage the other response serializers taking advantage of `Response` and `Result` types.
#### Response Data Handler
```swift
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.responseData { response in
print(response.request)
print(response.response)
print(response.result)
}
```
#### Response String Handler
```swift
Alamofire.request(.GET, "https://httpbin.org/get")
.responseString { response in
print("Success: \(response.result.isSuccess)")
print("Response String: \(response.result.value)")
}
```
#### Response JSON Handler
```swift
Alamofire.request(.GET, "https://httpbin.org/get")
.responseJSON { response in
debugPrint(response)
}
```
#### Chained Response Handlers
Response handlers can even be chained:
```swift
Alamofire.request(.GET, "https://httpbin.org/get")
.responseString { response in
print("Response String: \(response.result.value)")
}
.responseJSON { response in
print("Response JSON: \(response.result.value)")
}
```
### HTTP Methods
`Alamofire.Method` lists the HTTP methods defined in [RFC 7231 §4.3](http://tools.ietf.org/html/rfc7231#section-4.3):
```swift
public enum Method: String {
case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT
}
```
These values can be passed as the first argument of the `Alamofire.request` method:
```swift
Alamofire.request(.POST, "https://httpbin.org/post")
Alamofire.request(.PUT, "https://httpbin.org/put")
Alamofire.request(.DELETE, "https://httpbin.org/delete")
```
### Parameters
#### GET Request With URL-Encoded Parameters
```swift
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
// https://httpbin.org/get?foo=bar
```
#### POST Request With URL-Encoded Parameters
```swift
let parameters = [
"foo": "bar",
"baz": ["a", 1],
"qux": [
"x": 1,
"y": 2,
"z": 3
]
]
Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters)
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
```
### Parameter Encoding
Parameters can also be encoded as JSON, Property List, or any custom format, using the `ParameterEncoding` enum:
```swift
enum ParameterEncoding {
case URL
case URLEncodedInURL
case JSON
case PropertyList(format: NSPropertyListFormat, options: NSPropertyListWriteOptions)
case Custom((URLRequestConvertible, [String: AnyObject]?) -> (NSMutableURLRequest, NSError?))
func encode(request: NSURLRequest, parameters: [String: AnyObject]?) -> (NSURLRequest, NSError?)
{ ... }
}
```
- `URL`: A query string to be set as or appended to any existing URL query for `GET`, `HEAD`, and `DELETE` requests, or set as the body for requests with any other HTTP method. The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded`. _Since there is no published specification for how to encode collection types, Alamofire follows the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`)._
- `URLEncodedInURL`: Creates query string to be set as or appended to any existing URL query. Uses the same implementation as the `.URL` case, but always applies the encoded result to the URL.
- `JSON`: Uses `NSJSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.
- `PropertyList`: Uses `NSPropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`.
- `Custom`: Uses the associated closure value to construct a new request given an existing request and parameters.
#### Manual Parameter Encoding of an NSURLRequest
```swift
let URL = NSURL(string: "https://httpbin.org/get")!
var request = NSMutableURLRequest(URL: URL)
let parameters = ["foo": "bar"]
let encoding = Alamofire.ParameterEncoding.URL
(request, _) = encoding.encode(request, parameters: parameters)
```
#### POST Request with JSON-encoded Parameters
```swift
let parameters = [
"foo": [1,2,3],
"bar": [
"baz": "qux"
]
]
Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters, encoding: .JSON)
// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}}
```
### HTTP Headers
Adding a custom HTTP header to a `Request` is supported directly in the global `request` method. This makes it easy to attach HTTP headers to a `Request` that can be constantly changing.
> For HTTP headers that do not change, it is recommended to set them on the `NSURLSessionConfiguration` so they are automatically applied to any `NSURLSessionTask` created by the underlying `NSURLSession`.
```swift
let headers = [
"Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
"Content-Type": "application/x-www-form-urlencoded"
]
Alamofire.request(.GET, "https://httpbin.org/get", headers: headers)
.responseJSON { response in
debugPrint(response)
}
```
### Caching
Caching is handled on the system framework level by [`NSURLCache`](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/occ/cl/NSURLCache).
### Uploading
**Supported Upload Types**
- File
- Data
- Stream
- MultipartFormData
#### Uploading a File
```swift
let fileURL = NSBundle.mainBundle().URLForResource("Default", withExtension: "png")
Alamofire.upload(.POST, "https://httpbin.org/post", file: fileURL)
```
#### Uploading with Progress
```swift
Alamofire.upload(.POST, "https://httpbin.org/post", file: fileURL)
.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in
print(totalBytesWritten)
// This closure is NOT called on the main queue for performance
// reasons. To update your ui, dispatch to the main queue.
dispatch_async(dispatch_get_main_queue()) {
print("Total bytes written on main queue: \(totalBytesWritten)")
}
}
.responseJSON { response in
debugPrint(response)
}
```
#### Uploading MultipartFormData
```swift
Alamofire.upload(
.POST,
"https://httpbin.org/post",
multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(fileURL: unicornImageURL, name: "unicorn")
multipartFormData.appendBodyPart(fileURL: rainbowImageURL, name: "rainbow")
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseJSON { response in
debugPrint(response)
}
case .Failure(let encodingError):
print(encodingError)
}
}
)
```
### Downloading
**Supported Download Types**
- Request
- Resume Data
#### Downloading a File
```swift
Alamofire.download(.GET, "https://httpbin.org/stream/100") { temporaryURL, response in
let fileManager = NSFileManager.defaultManager()
let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
let pathComponent = response.suggestedFilename
return directoryURL.URLByAppendingPathComponent(pathComponent!)
}
```
#### Using the Default Download Destination
```swift
let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask)
Alamofire.download(.GET, "https://httpbin.org/stream/100", destination: destination)
```
#### Downloading a File w/Progress
```swift
Alamofire.download(.GET, "https://httpbin.org/stream/100", destination: destination)
.progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
print(totalBytesRead)
// This closure is NOT called on the main queue for performance
// reasons. To update your ui, dispatch to the main queue.
dispatch_async(dispatch_get_main_queue()) {
print("Total bytes read on main queue: \(totalBytesRead)")
}
}
.response { _, _, _, error in
if let error = error {
print("Failed with error: \(error)")
} else {
print("Downloaded file successfully")
}
}
```
#### Accessing Resume Data for Failed Downloads
```swift
Alamofire.download(.GET, "https://httpbin.org/stream/100", destination: destination)
.response { _, _, data, _ in
if let
data = data,
resumeDataString = NSString(data: data, encoding: NSUTF8StringEncoding)
{
print("Resume Data: \(resumeDataString)")
} else {
print("Resume Data was empty")
}
}
```
> The `data` parameter is automatically populated with the `resumeData` if available.
```swift
let download = Alamofire.download(.GET, "https://httpbin.org/stream/100", destination: destination)
download.response { _, _, _, _ in
if let
resumeData = download.resumeData,
resumeDataString = NSString(data: resumeData, encoding: NSUTF8StringEncoding)
{
print("Resume Data: \(resumeDataString)")
} else {
print("Resume Data was empty")
}
}
```
### Authentication
Authentication is handled on the system framework level by [`NSURLCredential` and `NSURLAuthenticationChallenge`](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLAuthenticationChallenge_Class/Reference/Reference.html).
**Supported Authentication Schemes**
- [HTTP Basic](http://en.wikipedia.org/wiki/Basic_access_authentication)
- [HTTP Digest](http://en.wikipedia.org/wiki/Digest_access_authentication)
- [Kerberos](http://en.wikipedia.org/wiki/Kerberos_%28protocol%29)
- [NTLM](http://en.wikipedia.org/wiki/NT_LAN_Manager)
#### HTTP Basic Authentication
The `authenticate` method on a `Request` will automatically provide an `NSURLCredential` to an `NSURLAuthenticationChallenge` when appropriate:
```swift
let user = "user"
let password = "password"
Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)")
.authenticate(user: user, password: password)
.responseJSON { response in
debugPrint(response)
}
```
Depending upon your server implementation, an `Authorization` header may also be appropriate:
```swift
let user = "user"
let password = "password"
let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": "Basic \(base64Credentials)"]
Alamofire.request(.GET, "https://httpbin.org/basic-auth/user/password", headers: headers)
.responseJSON { response in
debugPrint(response)
}
```
#### Authentication with NSURLCredential
```swift
let user = "user"
let password = "password"
let credential = NSURLCredential(user: user, password: password, persistence: .ForSession)
Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)")
.authenticate(usingCredential: credential)
.responseJSON { response in
debugPrint(response)
}
```
### Validation
By default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type.
#### Manual Validation
```swift
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.validate(statusCode: 200..<300)
.validate(contentType: ["application/json"])
.response { response in
print(response)
}
```
#### Automatic Validation
Automatically validates status code within `200...299` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided.
```swift
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.validate()
.responseJSON { response in
switch response.result {
case .Success:
print("Validation Successful")
case .Failure(let error):
print(error)
}
}
```
### Timeline
Alamofire collects timings throughout the lifecycle of a `Request` and creates a `Timeline` object exposed as a property on a `Response`.
```swift
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
.validate()
.responseJSON { response in
print(response.timeline)
}
```
The above reports the following `Timeline` info:
- `Latency`: 0.428 seconds
- `Request Duration`: 0.428 seconds
- `Serialization Duration`: 0.001 seconds
- `Total Duration`: 0.429 seconds
### Printable
```swift
let request = Alamofire.request(.GET, "https://httpbin.org/ip")
print(request)
// GET https://httpbin.org/ip (200)
```
### DebugPrintable
```swift
let request = Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
debugPrint(request)
```
#### Output (cURL)
```bash
$ curl -i \
-H "User-Agent: Alamofire" \
-H "Accept-Encoding: Accept-Encoding: gzip;q=1.0,compress;q=0.5" \
-H "Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5" \
"https://httpbin.org/get?foo=bar"
```
---
## Advanced Usage
> Alamofire is built on `NSURLSession` and the Foundation URL Loading System. To make the most of
this framework, it is recommended that you be familiar with the concepts and capabilities of the underlying networking stack.
**Recommended Reading**
- [URL Loading System Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html)
- [NSURLSession Class Reference](https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html#//apple_ref/occ/cl/NSURLSession)
- [NSURLCache Class Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/occ/cl/NSURLCache)
- [NSURLAuthenticationChallenge Class Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLAuthenticationChallenge_Class/Reference/Reference.html)
### Manager
Top-level convenience methods like `Alamofire.request` use a shared instance of `Alamofire.Manager`, which is configured with the default `NSURLSessionConfiguration`.
As such, the following two statements are equivalent:
```swift
Alamofire.request(.GET, "https://httpbin.org/get")
```
```swift
let manager = Alamofire.Manager.sharedInstance
manager.request(NSURLRequest(URL: NSURL(string: "https://httpbin.org/get")!))
```
Applications can create managers for background and ephemeral sessions, as well as new managers that customize the default session configuration, such as for default headers (`HTTPAdditionalHeaders`) or timeout interval (`timeoutIntervalForRequest`).
#### Creating a Manager with Default Configuration
```swift
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let manager = Alamofire.Manager(configuration: configuration)
```
#### Creating a Manager with Background Configuration
```swift
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.example.app.background")
let manager = Alamofire.Manager(configuration: configuration)
```
#### Creating a Manager with Ephemeral Configuration
```swift
let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
let manager = Alamofire.Manager(configuration: configuration)
```
#### Modifying Session Configuration
```swift
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]
defaultHeaders["DNT"] = "1 (Do Not Track Enabled)"
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders
let manager = Alamofire.Manager(configuration: configuration)
```
> This is **not** recommended for `Authorization` or `Content-Type` headers. Instead, use `URLRequestConvertible` and `ParameterEncoding`, respectively.
### Request
The result of a `request`, `upload`, or `download` method is an instance of `Alamofire.Request`. A request is always created using a constructor method from an owning manager, and never initialized directly.
Methods like `authenticate`, `validate` and `responseData` return the caller in order to facilitate chaining.
Requests can be suspended, resumed, and cancelled:
- `suspend()`: Suspends the underlying task and dispatch queue
- `resume()`: Resumes the underlying task and dispatch queue. If the owning manager does not have `startRequestsImmediately` set to `true`, the request must call `resume()` in order to start.
- `cancel()`: Cancels the underlying task, producing an error that is passed to any registered response handlers.
### Response Serialization
#### Creating a Custom Response Serializer
Alamofire provides built-in response serialization for strings, JSON, and property lists, but others can be added in extensions on `Alamofire.Request`.
For example, here's how a response handler using [Ono](https://github.com/mattt/Ono) might be implemented:
```swift
extension Request {
public static func XMLResponseSerializer() -> ResponseSerializer<ONOXMLDocument, NSError> {
return ResponseSerializer { request, response, data, error in
guard error == nil else { return .Failure(error!) }
guard let validData = data else {
let failureReason = "Data could not be serialized. Input data was nil."
let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason)
return .Failure(error)
}
do {
let XML = try ONOXMLDocument(data: validData)
return .Success(XML)
} catch {
return .Failure(error as NSError)
}
}
}
public func responseXMLDocument(completionHandler: Response<ONOXMLDocument, NSError> -> Void) -> Self {
return response(responseSerializer: Request.XMLResponseSerializer(), completionHandler: completionHandler)
}
}
```
#### Generic Response Object Serialization
Generics can be used to provide automatic, type-safe response object serialization.
```swift
public protocol ResponseObjectSerializable {
init?(response: NSHTTPURLResponse, representation: AnyObject)
}
extension Request {
public func responseObject<T: ResponseObjectSerializable>(completionHandler: Response<T, NSError> -> Void) -> Self {
let responseSerializer = ResponseSerializer<T, NSError> { request, response, data, error in
guard error == nil else { return .Failure(error!) }
let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
let result = JSONResponseSerializer.serializeResponse(request, response, data, error)
switch result {
case .Success(let value):
if let
response = response,
responseObject = T(response: response, representation: value)
{
return .Success(responseObject)
} else {
let failureReason = "JSON could not be serialized into response object: \(value)"
let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason)
return .Failure(error)
}
case .Failure(let error):
return .Failure(error)
}
}
return response(responseSerializer: responseSerializer, completionHandler: completionHandler)
}
}
```
```swift
final class User: ResponseObjectSerializable {
let username: String
let name: String
init?(response: NSHTTPURLResponse, representation: AnyObject) {
self.username = response.URL!.lastPathComponent!
self.name = representation.valueForKeyPath("name") as! String
}
}
```
```swift
Alamofire.request(.GET, "https://example.com/users/mattt")
.responseObject { (response: Response<User, NSError>) in
debugPrint(response)
}
```
The same approach can also be used to handle endpoints that return a representation of a collection of objects:
```swift
public protocol ResponseCollectionSerializable {
static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [Self]
}
extension Alamofire.Request {
public func responseCollection<T: ResponseCollectionSerializable>(completionHandler: Response<[T], NSError> -> Void) -> Self {
let responseSerializer = ResponseSerializer<[T], NSError> { request, response, data, error in
guard error == nil else { return .Failure(error!) }
let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
let result = JSONSerializer.serializeResponse(request, response, data, error)
switch result {
case .Success(let value):
if let response = response {
return .Success(T.collection(response: response, representation: value))
} else {
let failureReason = "Response collection could not be serialized due to nil response"
let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason)
return .Failure(error)
}
case .Failure(let error):
return .Failure(error)
}
}
return response(responseSerializer: responseSerializer, completionHandler: completionHandler)
}
}
```
```swift
final class User: ResponseObjectSerializable, ResponseCollectionSerializable {
let username: String
let name: String
init?(response: NSHTTPURLResponse, representation: AnyObject) {
self.username = response.URL!.lastPathComponent!
self.name = representation.valueForKeyPath("name") as! String
}
static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [User] {
var users: [User] = []
if let representation = representation as? [[String: AnyObject]] {
for userRepresentation in representation {
if let user = User(response: response, representation: userRepresentation) {
users.append(user)
}
}
}
return users
}
}
```
```swift
Alamofire.request(.GET, "http://example.com/users")
.responseCollection { (response: Response<[User], NSError>) in
debugPrint(response)
}
```
### URLStringConvertible
Types adopting the `URLStringConvertible` protocol can be used to construct URL strings, which are then used to construct URL requests. `NSString`, `NSURL`, `NSURLComponents`, and `NSURLRequest` conform to `URLStringConvertible` by default, allowing any of them to be passed as `URLString` parameters to the `request`, `upload`, and `download` methods:
```swift
let string = NSString(string: "https://httpbin.org/post")
Alamofire.request(.POST, string)
let URL = NSURL(string: string)!
Alamofire.request(.POST, URL)
let URLRequest = NSURLRequest(URL: URL)
Alamofire.request(.POST, URLRequest) // overrides `HTTPMethod` of `URLRequest`
let URLComponents = NSURLComponents(URL: URL, resolvingAgainstBaseURL: true)
Alamofire.request(.POST, URLComponents)
```
Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLStringConvertible` as a convenient way to map domain-specific models to server resources.
#### Type-Safe Routing
```swift
extension User: URLStringConvertible {
static let baseURLString = "http://example.com"
var URLString: String {
return User.baseURLString + "/users/\(username)/"
}
}
```
```swift
let user = User(username: "mattt")
Alamofire.request(.GET, user) // http://example.com/users/mattt
```
### URLRequestConvertible
Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests. `NSURLRequest` conforms to `URLRequestConvertible` by default, allowing it to be passed into `request`, `upload`, and `download` methods directly (this is the recommended way to specify custom HTTP body for individual requests):
```swift
let URL = NSURL(string: "https://httpbin.org/post")!
let mutableURLRequest = NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = "POST"
let parameters = ["foo": "bar"]
do {
mutableURLRequest.HTTPBody = try NSJSONSerialization.dataWithJSONObject(parameters, options: NSJSONWritingOptions())
} catch {
// No-op
}
mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
Alamofire.request(mutableURLRequest)
```
Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLRequestConvertible` as a way to ensure consistency of requested endpoints. Such an approach can be used to abstract away server-side inconsistencies and provide type-safe routing, as well as manage authentication credentials and other state.
#### API Parameter Abstraction
```swift
enum Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
static let perPage = 50
case Search(query: String, page: Int)
// MARK: URLRequestConvertible
var URLRequest: NSMutableURLRequest {
let result: (path: String, parameters: [String: AnyObject]) = {
switch self {
case .Search(let query, let page) where page > 1:
return ("/search", ["q": query, "offset": Router.perPage * page])
case .Search(let query, _):
return ("/search", ["q": query])
}
}()
let URL = NSURL(string: Router.baseURLString)!
let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(result.path))
let encoding = Alamofire.ParameterEncoding.URL
return encoding.encode(URLRequest, parameters: result.parameters).0
}
}
```
```swift
Alamofire.request(Router.Search(query: "foo bar", page: 1)) // ?q=foo%20bar&offset=50
```
#### CRUD & Authorization
```swift
enum Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
static var OAuthToken: String?
case CreateUser([String: AnyObject])
case ReadUser(String)
case UpdateUser(String, [String: AnyObject])
case DestroyUser(String)
var method: Alamofire.Method {
switch self {
case .CreateUser:
return .POST
case .ReadUser:
return .GET
case .UpdateUser:
return .PUT
case .DestroyUser:
return .DELETE
}
}
var path: String {
switch self {
case .CreateUser:
return "/users"
case .ReadUser(let username):
return "/users/\(username)"
case .UpdateUser(let username, _):
return "/users/\(username)"
case .DestroyUser(let username):
return "/users/\(username)"
}
}
// MARK: URLRequestConvertible
var URLRequest: NSMutableURLRequest {
let URL = NSURL(string: Router.baseURLString)!
let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableURLRequest.HTTPMethod = method.rawValue
if let token = Router.OAuthToken {
mutableURLRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}
switch self {
case .CreateUser(let parameters):
return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
case .UpdateUser(_, let parameters):
return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
default:
return mutableURLRequest
}
}
}
```
```swift
Alamofire.request(Router.ReadUser("mattt")) // GET /users/mattt
```
### Security
Using a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire will evaluate the certificate chain provided by the server using Apple's built in validation provided by the Security framework. While this guarantees the certificate chain is valid, it does not prevent man-in-the-middle (MITM) attacks or other potential vulnerabilities. In order to mitigate MITM attacks, applications dealing with sensitive customer data or financial information should use certificate or public key pinning provided by the `ServerTrustPolicy`.
#### ServerTrustPolicy
The `ServerTrustPolicy` enumeration evaluates the server trust generally provided by an `NSURLAuthenticationChallenge` when connecting to a server over a secure HTTPS connection.
```swift
let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
certificates: ServerTrustPolicy.certificatesInBundle(),
validateCertificateChain: true,
validateHost: true
)
```
There are many different cases of server trust evaluation giving you complete control over the validation process:
* `PerformDefaultEvaluation`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge.
* `PinCertificates`: Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned certificates match one of the server certificates.
* `PinPublicKeys`: Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned public keys match one of the server certificate public keys.
* `DisableEvaluation`: Disables all evaluation which in turn will always consider any server trust as valid.
* `CustomEvaluation`: Uses the associated closure to evaluate the validity of the server trust thus giving you complete control over the validation process. Use with caution.
#### Server Trust Policy Manager
The `ServerTrustPolicyManager` is responsible for storing an internal mapping of server trust policies to a particular host. This allows Alamofire to evaluate each host against a different server trust policy.
```swift
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"test.example.com": .PinCertificates(
certificates: ServerTrustPolicy.certificatesInBundle(),
validateCertificateChain: true,
validateHost: true
),
"insecure.expired-apis.com": .DisableEvaluation
]
let manager = Manager(
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
```
> Make sure to keep a reference to the new `Manager` instance, otherwise your requests will all get cancelled when your `manager` is deallocated.
These server trust policies will result in the following behavior:
* `test.example.com` will always use certificate pinning with certificate chain and host validation enabled thus requiring the following criteria to be met to allow the TLS handshake to succeed:
* Certificate chain MUST be valid.
* Certificate chain MUST include one of the pinned certificates.
* Challenge host MUST match the host in the certificate chain's leaf certificate.
* `insecure.expired-apis.com` will never evaluate the certificate chain and will always allow the TLS handshake to succeed.
* All other hosts will use the default evaluation provided by Apple.
##### Subclassing Server Trust Policy Manager
If you find yourself needing more flexible server trust policy matching behavior (i.e. wildcarded domains), then subclass the `ServerTrustPolicyManager` and override the `serverTrustPolicyForHost` method with your own custom implementation.
```swift
class CustomServerTrustPolicyManager: ServerTrustPolicyManager {
override func serverTrustPolicyForHost(host: String) -> ServerTrustPolicy? {
var policy: ServerTrustPolicy?
// Implement your custom domain matching behavior...
return policy
}
}
```
#### Validating the Host
The `.PerformDefaultEvaluation`, `.PinCertificates` and `.PinPublicKeys` server trust policies all take a `validateHost` parameter. Setting the value to `true` will cause the server trust evaluation to verify that hostname in the certificate matches the hostname of the challenge. If they do not match, evaluation will fail. A `validateHost` value of `false` will still evaluate the full certificate chain, but will not validate the hostname of the leaf certificate.
> It is recommended that `validateHost` always be set to `true` in production environments.
#### Validating the Certificate Chain
Pinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certficates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check.
There are several cases where it may make sense to disable certificate chain validation. The most common use cases for disabling validation are self-signed and expired certificates. The evaluation would always fail in both of these cases, but the byte equality check will still ensure you are receiving the certificate you expect from the server.
> It is recommended that `validateCertificateChain` always be set to `true` in production environments.
#### App Transport Security
With the addition of App Transport Security (ATS) in iOS 9, it is possible that using a custom `ServerTrustPolicyManager` with several `ServerTrustPolicy` objects will have no effect. If you continuously see `CFNetwork SSLHandshake failed (-9806)` errors, you have probably run into this problem. Apple's ATS system overrides the entire challenge system unless you configure the ATS settings in your app's plist to disable enough of it to allow your app to evaluate the server trust.
If you run into this problem (high probability with self-signed certificates), you can work around this issue by adding the following to your `Info.plist`.
```xml
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
<!-- Optional: Specify minimum TLS version -->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
</dict>
</dict>
</dict>
</dict>
```
Whether you need to set the `NSExceptionRequiresForwardSecrecy` to `NO` depends on whether your TLS connection is using an allowed cipher suite. In certain cases, it will need to be set to `NO`. The `NSExceptionAllowsInsecureHTTPLoads` MUST be set to `YES` in order to allow the `SessionDelegate` to receive challenge callbacks. Once the challenge callbacks are being called, the `ServerTrustPolicyManager` will take over the server trust evaluation. You may also need to specify the `NSTemporaryExceptionMinimumTLSVersion` if you're trying to connect to a host that only supports TLS versions less than `1.2`.
> It is recommended to always use valid certificates in production environments.
### Network Reachability
The `NetworkReachabilityManager` listens for reachability changes of hosts and addresses for both WWAN and WiFi network interfaces.
```swift
let manager = NetworkReachabilityManager(host: "www.apple.com")
manager?.listener = { status in
print("Network Status Changed: \(status)")
}
manager?.startListening()
```
> Make sure to remember to retain the `manager` in the above example, or no status changes will be reported.
There are some important things to remember when using network reachability to determine what to do next.
* **Do NOT** use Reachability to determine if a network request should be sent.
* You should **ALWAYS** send it.
* When Reachability is restored, use the event to retry failed network requests.
* Even though the network requests may still fail, this is a good moment to retry them.
* The network reachability status can be useful for determining why a network request may have failed.
* If a network request fails, it is more useful to tell the user that the network request failed due to being offline rather than a more technical errror, such as "request timed out."
> It is recommended to check out [WWDC 2012 Session 706, "Networking Best Practices"](https://developer.apple.com/videos/play/wwdc2012-706/) for more info.
---
## Component Libraries
In order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the [Alamofire Software Foundation](https://github.com/Alamofire/Foundation) to bring additional functionality to the Alamofire ecosystem.
* [AlamofireImage](https://github.com/Alamofire/AlamofireImage) - An image library including image response serializers, `UIImage` and `UIImageView` extensions, custom image filters, an auto-purging in-memory cache and a priority-based image downloading system.
## Open Rdars
The following rdars have some affect on the current implementation of Alamofire.
* [rdar://21349340](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in test case
## FAQ
### What's the origin of the name Alamofire?
Alamofire is named after the [Alamo Fire flower](https://aggie-horticulture.tamu.edu/wildseed/alamofire.html), a hybrid variant of the Bluebonnet, the official state flower of Texas.
---
## Credits
Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases.
### Security Disclosure
If you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker.
## License
Alamofire is released under the MIT license. See LICENSE for details.
================================================
FILE: Sublime/Pods/Alamofire/Source/Alamofire.swift
================================================
// Alamofire.swift
//
// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
//
// 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
// MARK: - URLStringConvertible
/**
Types adopting the `URLStringConvertible` protocol can be used to construct URL strings, which are then used to
construct URL requests.
*/
public protocol URLStringConvertible {
/**
A URL that conforms to RFC 2396.
Methods accepting a `URLStringConvertible` type parameter parse it according to RFCs 1738 and 1808.
See https://tools.ietf.org/html/rfc2396
See https://tools.ietf.org/html/rfc1738
See https://tools.ietf.org/html/rfc1808
*/
var URLString: String { get }
}
extension String: URLStringConvertible {
public var URLString: String {
return self
}
}
extension NSURL: URLStringConvertible {
public var URLString: String {
return absoluteString
}
}
extension NSURLComponents: URLStringConvertible {
public var URLString: String {
return URL!.URLString
}
}
extension NSURLRequest: URLStringConvertible {
public var URLString: String {
return URL!.URLString
}
}
// MARK: - URLRequestConvertible
/**
Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests.
*/
public protocol URLRequestConvertible {
/// The URL request.
var URLRequest: NSMutableURLRequest { get }
}
extension NSURLRequest: URLRequestConvertible {
public var URLRequest: NSMutableURLRequest {
return self.mutableCopy() as! NSMutableURLRequest
}
}
// MARK: - Convenience
func URLRequest(
method: Method,
_ URLString: URLStringConvertible,
headers: [String: String]? = nil)
-> NSMutableURLRequest
{
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URLString.URLString)!)
mutableURLRequest.HTTPMethod = method.rawValue
if let headers = headers {
for (headerField, headerValue) in headers {
mutableURLRequest.setValue(headerValue, forHTTPHeaderField: headerField)
}
}
return mutableURLRequest
}
// MARK: - Request Methods
/**
Creates a request using the shared manager instance for the specified method, URL string, parameters, and
parameter encoding.
- parameter method: The HTTP method.
- parameter URLString: The URL string.
- parameter parameters: The parameters. `nil` by default.
- parameter encoding: The parameter encoding. `.URL` by default.
- parameter headers: The HTTP headers. `nil` by default.
- returns: The created request.
*/
public func request(
method: Method,
_ URLString: URLStringConvertible,
parameters: [String: AnyObject]? = nil,
encoding: ParameterEncoding = .URL,
headers: [String: String]? = nil)
-> Request
{
return Manager.sharedInstance.request(
method,
URLString,
parameters: parameters,
encoding: encoding,
headers: headers
)
}
/**
Creates a request using the shared manager instance for the specified URL request.
If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.
- parameter URLRequest: The URL request
- returns: The created request.
*/
public func request(URLRequest: URLRequestConvertible) -> Request {
return Manager.sharedInstance.request(URLRequest.URLRequest)
}
// MARK: - Upload Methods
// MARK: File
/**
Creates an upload request using the shared manager instance for the specified method, URL string, and file.
- parameter method: The HTTP method.
- parameter URLString: The URL string.
- parameter headers: The HTTP headers. `nil` by default.
- parameter file: The file to upload.
- returns: The created upload request.
*/
public func upload(
method: Method,
_ URLString: URLStringConvertible,
headers: [String: String]? = nil,
file: NSURL)
-> Request
{
return Manager.sharedInstance.upload(method, URLString, headers: headers, file: file)
}
/**
Creates an upload request using the shared manager instance for the specified URL request and file.
- parameter URLRequest: The URL request.
- parameter file: The file to upload.
- returns: The created upload request.
*/
public func upload(URLRequest: URLRequestConvertible, file: NSURL) -> Request {
return Manager.sharedInstance.upload(URLRequest, file: file)
}
// MARK: Data
/**
Creates an upload request using the shared manager instance for the specified method, URL string, and data.
- parameter method: The HTTP method.
- parameter URLString: The URL string.
- parameter headers: The HTTP headers. `nil` by default.
- parameter data: The data to upload.
- returns: The created upload request.
*/
public func upload(
method: Method,
_ URLString: URLStringConvertible,
headers: [String: String]? = nil,
data: NSData)
-> Request
{
return Manager.sharedInstance.upload(method, URLString, headers: headers, data: data)
}
/**
Creates an upload request using the shared manager instance for the specified URL request and data.
- parameter URLRequest: The URL request.
- parameter data: The data to upload.
- returns: The created upload request.
*/
public func upload(URLRequest: URLRequestConvertible, data: NSData) -> Request {
return Manager.sharedInstance.upload(URLRequest, data: data)
}
// MARK: Stream
/**
Creates an upload request using the shared manager instance for the specified method, URL string, and stream.
- parameter method: The HTTP method.
- parameter URLString: The URL string.
- parameter headers: The HTTP headers. `nil` by default.
- parameter stream: The stream to upload.
- returns: The created upload request.
*/
public func upload(
method: Method,
_ URLString: URLStringConvertible,
headers: [String: String]? = nil,
stream: NSInputStream)
-> Request
{
return Manager.sharedInstance.upload(method, URLString, headers: headers, stream: stream)
}
/**
Creates an upload request using the shared manager instance for the specified URL request and stream.
- parameter URLRequest: The URL request.
- parameter stream: The stream to upload.
- returns: The created upload request.
*/
public func upload(URLRequest: URLRequestConvertible, stream: NSInputStream) -> Request {
return Manager.sharedInstance.upload(URLRequest, stream: stream)
}
// MARK: MultipartFormData
/**
Creates an upload request using the shared manager instance for the specified method and URL string.
- parameter method: The HTTP method.
- parameter URLString: The URL string.
- parameter headers: The HTTP headers. `nil` by default.
- parameter multipartFormData: The closure used to append body parts to the `MultipartFormData`.
- parameter encodingMemoryThreshold: The encoding memory threshold in bytes.
`MultipartFormDataEncodingMemoryThreshold` by default.
- parameter encodingCompletion: The closure called when the `MultipartFormData` encoding is complete.
*/
public func upload(
method: Method,
_ URLString: URLStringConvertible,
headers: [String: String]? = nil,
multipartFormData: MultipartFormData -> Void,
encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold,
encodingCompletion: (Manager.MultipartFormDataEncodingResult -> Void)?)
{
return Manager.sharedInstance.upload(
method,
URLString,
headers: headers,
multipartFormData: multipartFormData,
encodingMemoryThreshold: encodingMemoryThreshold,
encodingCompletion: encodingCompletion
)
}
/**
Creates an upload request using the shared manager instance for the specified method and URL string.
- parameter URLRequest: The URL request.
- parameter multipartFormData: The closure used to append body parts to the `MultipartFormData`.
- parameter encodingMemoryThreshold: The encoding memory threshold in bytes.
`MultipartFormDataEncodingMemoryThreshold` by default.
- parameter encodingCompletion: The closure called when the `MultipartFormData` encoding is complete.
*/
public func upload(
URLRequest: URLRequestConvertible,
multipartFormData: MultipartFormData -> Void,
encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold,
encodingCompletion: (Manager.MultipartFormDataEncodingResult -> Void)?)
{
return Manager.sharedInstance.upload(
URLRequest,
multipartFormData: multipartFormData,
encodingMemoryThreshold: encodingMemoryThreshold,
encodingCompletion: encodingCompletion
)
}
// MARK: - Download Methods
// MARK: URL Request
/**
Creates a download request using the shared manager instance for the specified method and URL string.
- parameter method: The HTTP method.
- parameter URLString: The URL string.
- parameter parameters: The parameters. `nil` by default.
- parameter encoding: The parameter encoding. `.URL` by default.
- parameter headers: The HTTP headers. `nil` by default.
- parameter destination: The closure used to determine the destination of the downloaded file.
- returns: The created download request.
*/
public func download(
method: Method,
_ URLString: URLStringConvertible,
parameters: [String: AnyObject]? = nil,
encoding: ParameterEncoding = .URL,
headers: [String: String]? = nil,
destination: Request.DownloadFileDestination)
-> Request
{
return Manager.sharedInstance.download(
method,
URLString,
parameters: parameters,
encoding: encoding,
headers: headers,
destination: destination
)
}
/**
Creates a download request using the shared manager instance for the specified URL request.
- parameter URLRequest: The URL request.
- parameter destination: The closure used to determine the destination of the downloaded file.
- returns: The created download request.
*/
public func download(URLRequest: URLRequestConvertible, destination: Request.DownloadFileDestination) -> Request {
return Manager.sharedInstance.download(URLRequest, destination: destination)
}
// MARK: Resume Data
/**
Creates a request using the shared manager instance for downloading from the resume data produced from a
previous request cancellation.
- parameter resumeData: The resume data. This is an opaque data blob produced by `NSURLSessionDownloadTask`
when a task is cancelled. See `NSURLSession -downloadTaskWithResumeData:` for additional
information.
- parameter destination: The closure used to determine the destination of the downloaded file.
- returns: The created download request.
*/
public func download(resumeData data: NSData, destination: Request.DownloadFileDestination) -> Request {
return Manager.sharedInstance.download(data, destination: destination)
}
================================================
FILE: Sublime/Pods/Alamofire/Source/Download.swift
================================================
// Download.swift
//
// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
//
// 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
extension Manager {
private enum Downloadable {
case Request(NSURLRequest)
case ResumeData(NSData)
}
private func download(downloadable: Downloadable, destination: Request.DownloadFileDestination) -> Request {
var downloadTask: NSURLSessionDownloadTask!
switch downloadable {
case .Request(let request):
dispatch_sync(queue) {
downloadTask = self.session.downloadTaskWithRequest(request)
}
case .ResumeData(let resumeData):
dispatch_sync(queue) {
downloadTask = self.session.downloadTaskWithResumeData(resumeData)
}
}
let request = Request(session: session, task: downloadTask)
if let downloadDelegate = request.delegate as? Request.DownloadTaskDelegate {
downloadDelegate.downloadTaskDidFinishDownloadingToURL = { session, downloadTask, URL in
return destination(URL, downloadTask.response as! NSHTTPURLResponse)
}
}
delegate[request.delegate.task] = request.delegate
if startRequestsImmediately {
request.resume()
}
return request
}
// MARK: Request
/**
Creates a download request for the specified method, URL string, parameters, parameter encoding, headers
and destination.
If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.
- parameter method: The HTTP method.
- parameter URLString: The URL string.
- parameter parameters: The parameters. `nil` by default.
- parameter encoding: The parameter encoding. `.URL` by default.
- parameter headers: The HTTP headers. `nil` by default.
- parameter destination: The closure used to determine the destination of the downloaded file.
- returns: The created download request.
*/
public func download(
method: Method,
_ URLString: URLStringConvertible,
parameters: [String: AnyObject]? = nil,
encoding: ParameterEncoding = .URL,
headers: [String: String]? = nil,
destination: Request.DownloadFileDestination)
-> Request
{
let mutableURLRequest = URLRequest(method, URLString, headers: headers)
let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0
return download(encodedURLRequest, destination: destination)
}
/**
Creates a request for downloading from the specified URL request.
If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.
- parameter URLRequest: The URL request
- parameter destination: The closure used to determine the destination of the downloaded file.
- returns: The created download request.
*/
public func download(URLRequest: URLRequestConvertible, destination: Request.DownloadFileDestination) -> Request {
return download(.Request(URLRequest.URLRequest), destination: destination)
}
// MARK: Resume Data
/**
Creates a request for downloading from the resume data produced from a previous request cancellation.
If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.
- parameter resumeData: The resume data. This is an opaque data blob produced by `NSURLSessionDownloadTask`
when a task is cancelled. See `NSURLSession -downloadTaskWithResumeData:` for
additional information.
- parameter destination: The closure used to determine the destination of the downloaded file.
- returns: The created download request.
*/
public func download(resumeData: NSData, destination: Request.DownloadFileDestination) -> Request {
return download(.ResumeData(resumeData), destination: destination)
}
}
// MARK: -
extension Request {
/**
A closure executed once a request has successfully completed in order to determine where to move the temporary
file written to during the download process. The closure takes two arguments: the temporary file URL and the URL
response, and returns a single argument: the file URL where the temporary file should be moved.
*/
public typealias DownloadFileDestination = (NSURL, NSHTTPURLResponse) -> NSURL
/**
Creates a download file destination closure which uses the default file manager to move the temporary file to a
file URL in the first available directory with the specified search path directory and search path domain mask.
- parameter directory: The search path directory. `.DocumentDirectory` by default.
- parameter domain: The search path domain mask. `.UserDomainMask` by default.
- returns: A download file destination closure.
*/
public class func suggestedDownloadDestination(
directory directory: NSSearchPathDirectory = .DocumentDirectory,
domain: NSSearchPathDomainMask = .UserDomainMask)
-> DownloadFileDestination
{
return { temporaryURL, response -> NSURL in
let directoryURLs = NSFileManager.defaultManager().URLsForDirectory(directory, inDomains: domain)
if !directoryURLs.isEmpty {
return directoryURLs[0].URLByAppendingPathComponent(response.suggestedFilename!)
}
return temporaryURL
}
}
/// The resume data of the underlying download task if available after a failure.
public var resumeData: NSData? {
var data: NSData?
if let delegate = delegate as? DownloadTaskDelegate {
data = delegate.resumeData
}
return data
}
// MARK: - DownloadTaskDelegate
class DownloadTaskDelegate: TaskDelegate, NSURLSessionDownloadDelegate {
var downloadTask: NSURLSessionDownloadTask? { return task as? NSURLSessionDownloadTask }
var downloadProgress: ((Int64, Int64, Int64) -> Void)?
var resumeData: NSData?
override var data: NSData? { return resumeData }
// MARK: - NSURLSessionDownloadDelegate
// MARK: Override Closures
var downloadTaskDidFinishDownloadingToURL: ((NSURLSession, NSURLSessionDownloadTask, NSURL) -> NSURL)?
var downloadTaskDidWriteData: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64, Int64) -> Void)?
var downloadTaskDidResumeAtOffset: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64) -> Void)?
// MARK: Delegate Methods
func URLSession(
session: NSURLSession,
downloadTask: NSURLSessionDownloadTask,
didFinishDownloadingToURL location: NSURL)
{
if let downloadTaskDidFinishDownloadingToURL = downloadTaskDidFinishDownloadingToURL {
do {
let destination = downloadTaskDidFinishDownloadingToURL(session, downloadTask, location)
try NSFileManager.defaultManager().moveItemAtURL(location, toURL: destination)
} catch {
self.error = error as NSError
}
}
}
func URLSession(
session: NSURLSession,
downloadTask: NSURLSessionDownloadTask,
didWriteData bytesWritten: Int64,
totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64)
{
if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }
if let downloadTaskDidWriteData = downloadTaskDidWriteData {
downloadTaskDidWriteData(
session,
downloadTask,
bytesWritten,
totalBytesWritten,
totalBytesExpectedToWrite
)
} else {
progress.totalUnitCount = totalBytesExpectedToWrite
progress.completedUnitCount = totalBytesWritten
downloadProgress?(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite)
}
}
func URLSession(
session: NSURLSession,
downloadTask: NSURLSessionDownloadTask,
didResumeAtOffset fileOffset: Int64,
expectedTotalBytes: Int64)
{
if let downloadTaskDidResumeAtOffset = downloadTaskDidResumeAtOffset {
downloadTaskDidResumeAtOffset(session, downloadTask, fileOffset, expectedTotalBytes)
} else {
progress.totalUnitCount = expectedTotalBytes
progress.completedUnitCount = fileOffset
}
}
}
}
================================================
FILE: Sublime/Pods/Alamofire/Source/Error.swift
================================================
// Error.swift
//
// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
//
// 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
/// The `Error` struct provides a convenience for creating custom Alamofire NSErrors.
public struct Error {
/// The domain used for creating all Alamofire errors.
public static let Domain = "com.alamofire.error"
/// The custom error codes generated by Alamofire.
public enum Code: Int {
case InputStreamReadFailed = -6000
case OutputStreamWriteFailed = -6001
case ContentTypeValidationFailed = -6002
case StatusCodeValidationFailed = -6003
case DataSerializationFailed = -6004
case StringSerializationFailed = -6005
case JSONSerializationFailed = -6006
case PropertyListSerializationFailed = -6007
}
/**
Creates an `NSError` with the given error code and failure reason.
- parameter code: The error code.
- parameter failureReason: The failure reason.
- returns: An `NSError` with the given error code and failure reason.
*/
public static func errorWithCode(code: Code, failureReason: String) -> NSError {
return errorWithCode(code.rawValue, failureReason: failureReason)
}
/**
Creates an `NSError` with the given error code and failure reason.
- parameter code: The error code.
- parameter failureReason: The failure reason.
- returns: An `NSError` with the given error code and failure reason.
*/
public static func errorWithCode(code: Int, failureReason: String) -> NSError {
let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason]
return NSError(domain: Domain, code: code, userInfo: userInfo)
}
}
================================================
FILE: Sublime/Pods/Alamofire/Source/Manager.swift
================================================
// Manager.swift
//
// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
//
// 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
/**
Responsible for creating and managing `Request` objects, as well as their underlying `NSURLSession`.
*/
public class Manager {
// MARK: - Properties
/**
A shared instance of `Manager`, used by top-level Alamofire request methods, and suitable for use directly
for any ad hoc requests.
*/
public static let sharedInstance: Manager = {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders
return Manager(configuration: configuration)
}()
/**
Creates default values for the "Accept-Encoding", "Accept-Language" and "User-Agent" headers.
*/
public static let defaultHTTPHeaders: [String: String] = {
// Accept-Encoding HTTP Header; see https://tools.ietf.org/html/rfc7230#section-4.2.3
let acceptEncoding: String = "gzip;q=1.0, compress;q=0.5"
// Accept-Language HTTP Header; see https://tools.ietf.org/html/rfc7231#section-5.3.5
let acceptLanguage = NSLocale.preferredLanguages().prefix(6).enumerate().map { index, languageCode in
let quality = 1.0 - (Double(index) * 0.1)
return "\(languageCode);q=\(quality)"
}.joinWithSeparator(", ")
// User-Agent Header; see https://tools.ietf.org/html/rfc7231#section-5.5.3
let userAgent: String = {
if let info = NSBundle.mainBundle().infoDictionary {
let executable: AnyObject = info[kCFBundleExecutableKey as String] ?? "Unknown"
let bundle: AnyObject = info[kCFBundleIdentifierKey as String] ?? "Unknown"
let version: AnyObject = info[kCFBundleVersionKey as String] ?? "Unknown"
let os: AnyObject = NSProcessInfo.processInfo().operatingSystemVersionString ?? "Unknown"
var mutableUserAgent = NSMutableString(string: "\(executable)/\(bundle) (\(version); OS \(os))") as CFMutableString
let transform = NSString(string: "Any-Latin; Latin-ASCII; [:^ASCII:] Remove") as CFString
if CFStringTransform(mutableUserAgent, UnsafeMutablePointer<CFRange>(nil), transform, false) {
return mutableUserAgent as String
}
}
return "Alamofire"
}()
return [
"Accept-Encoding": acceptEncoding,
"Accept-Language": acceptLanguage,
"User-Agent": userAgent
]
}()
let queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)
/// The underlying session.
public let session: NSURLSession
/// The session delegate handling all the task and session delegate callbacks.
public let delegate: SessionDelegate
/// Whether to start requests immediately after being constructed. `true` by default.
public var startRequestsImmediately: Bool = true
/**
The background completion handler closure provided by the UIApplicationDelegate
`application:handleEventsForBackgroundURLSession:completionHandler:` method. By setting the background
completion handler, the SessionDelegate `sessionDidFinishEventsForBackgroundURLSession` closure implementation
will automatically call the handler.
If you need to handle your own events before the handler is called, then you need to override the
SessionDelegate `sessionDidFinishEventsForBackgroundURLSession` and manually call the handler when finished.
`nil` by default.
*/
public var backgroundCompletionHandler: (() -> Void)?
// MARK: - Lifecycle
/**
Initializes the `Manager` instance with the specified configuration, delegate and server trust policy.
- parameter configuration: The configuration used to construct the managed session.
`NSURLSessionConfiguration.defaultSessionConfiguration()` by default.
- parameter delegate: The delegate used when initializing the session. `SessionDelegate()` by
default.
- parameter serverTrustPolicyManager: The server trust policy manager to use for evaluating all server trust
challenges. `nil` by default.
- returns: The new `Manager` instance.
*/
public init(
configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration(),
delegate: SessionDelegate = SessionDelegate(),
serverTrustPolicyManager: ServerTrustPolicyManager? = nil)
{
self.delegate = delegate
self.session = NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
commonInit(serverTrustPolicyManager: serverTrustPolicyManager)
}
/**
Initializes the `Manager` instance with the specified session, delegate and server trust policy.
- parameter session: The URL session.
- parameter delegate: The delegate of the URL session. Must equal the URL session's delegate.
- parameter serverTrustPolicyManager: The server trust policy manager to use for evaluating all server trust
challenges. `nil` by default.
- returns: The new `Manager` instance if the URL session's delegate matches the delegate parameter.
*/
public init?(
session: NSURLSession,
delegate: SessionDelegate,
serverTrustPolicyManager: ServerTrustPolicyManager? = nil)
{
self.delegate = delegate
self.session = session
guard delegate === session.delegate else { return nil }
commonInit(serverTrustPolicyManager: serverTrustPolicyManager)
}
private func commonInit(serverTrustPolicyManager serverTrustPolicyManager: ServerTrustPolicyManager?) {
session.serverTrustPolicyManager = serverTrustPolicyManager
delegate.sessionDidFinishEventsForBackgroundURLSession = { [weak self] session in
guard let strongSelf = self else { return }
dispatch_async(dispatch_get_main_queue()) { strongSelf.backgroundCompletionHandler?() }
}
}
deinit {
session.invalidateAndCancel()
}
// MARK: - Request
/**
Creates a request for the specified method, URL string, parameters, parameter encoding and headers.
- parameter method: The HTTP method.
- parameter URLString: The URL string.
- parameter parameters: The parameters. `nil` by default.
- parameter encoding: The parameter encoding. `.URL` by default.
- parameter headers: The HTTP headers. `nil` by default.
- returns: The created request.
*/
public func request(
method: Method,
_ URLString: URLStringConvertible,
parameters: [String: AnyObject]? = nil,
encoding: ParameterEncoding = .URL,
headers: [String: String]? = nil)
-> Request
{
let mutableURLRequest = URLRequest(method, URLString, headers: headers)
let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0
return request(encodedURLRequest)
}
/**
Creates a request for the specified URL request.
If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.
- parameter URLRequest: The URL request
- returns: The created request.
*/
public func request(URLRequest: URLRequestConvertible) -> Request {
var dataTask: NSURLSessionDataTask!
dispatch_sync(queue) { dataTask = self.session.dataTaskWithRequest(URLRequest.URLRequest) }
let request = Request(session: session, task: dataTask)
delegate[request.delegate.task] = request.delegate
if startRequestsImmediately {
request.resume()
}
return request
}
// MARK: - SessionDelegate
/**
Responsible for handling all delegate callbacks for the underlying session.
*/
public final class SessionDelegate: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate {
private var subdelegates: [Int: Request.TaskDelegate] = [:]
private let subdelegateQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT)
subscript(task: NSURLSessionTask) -> Request.TaskDelegate? {
get {
var subdelegate: Request.TaskDelegate?
dispatch_sync(subdelegateQueue) { subdelegate = self.subdelegates[task.taskIdentifier] }
return subdelegate
}
set {
dispatch_barrier_async(subdelegateQueue) { self.subdelegates[task.taskIdentifier] = newValue }
}
}
/**
Initializes the `SessionDelegate` instance.
- returns: The new `SessionDelegate` instance.
*/
public override init() {
super.init()
}
// MARK: - NSURLSessionDelegate
// MARK: Override Closures
/// Overrides default behavior for NSURLSessionDelegate method `URLSession:didBecomeInvalidWithError:`.
public var sessionDidBecomeInvalidWithError: ((NSURLSession, NSError?) -> Void)?
/// Overrides default behavior for NSURLSessionDelegate method `URLSession:didReceiveChallenge:completionHandler:`.
public var sessionDidReceiveChallenge: ((NSURLSession, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))?
/// Overrides default behavior for NSURLSessionDelegate method `URLSessionDidFinishEventsForBackgroundURLSession:`.
public var sessionDidFinishEventsForBackgroundURLSession: ((NSURLSession) -> Void)?
// MARK: Delegate Methods
/**
Tells the delegate that the session has been invalidated.
- parameter session: The session object that was invalidated.
- parameter error: The error that caused invalidation, or nil if the invalidation was explicit.
*/
public func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) {
sessionDidBecomeInvalidWithError?(session, error)
}
/**
Requests credentials from the delegate in response to a session-level authentication request from the remote server.
- parameter session: The session containing the task that requested authentication.
- parameter challenge: An object that contains the request for authentication.
- parameter completionHandler: A handler that your delegate method must call providing the disposition and credential.
*/
public func URLSession(
session: NSURLSession,
didReceiveChallenge challenge: NSURLAuthenticationChallenge,
completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void))
{
var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling
var credential: NSURLCredential?
if let sessionDidReceiveChallenge = sessionDidReceiveChallenge {
(disposition, credential) = sessionDidReceiveChallenge(session, challenge)
} else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
let host = challenge.protectionSpace.host
if let
serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicyForHost(host),
serverTrust = challenge.protectionSpace.serverTrust
{
if serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host) {
disposition = .UseCredential
credential = NSURLCredential(forTrust: serverTrust)
} else {
disposition = .CancelAuthenticationChallenge
}
}
}
completionHandler(disposition, credential)
}
/**
Tells the delegate that all messages enqueued for a session have been delivered.
- parameter session: The session that no longer has any outstanding requests.
*/
public func URLSessionDidFinishEventsForBackgroundURLSession(session: NSURLSession) {
sessionDidFinishEventsForBackgroundURLSession?(session)
}
// MARK: - NSURLSessionTaskDelegate
// MARK: Override Closures
/// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:`.
public var taskWillPerformHTTPRedirection: ((NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest) -> NSURLRequest?)?
/// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didReceiveChallenge:completionHandler:`.
public var taskDidReceiveChallenge: ((NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))?
/// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:session:task:needNewBodyStream:`.
public var taskNeedNewBodyStream: ((NSURLSession, NSURLSessionTask) -> NSInputStream!)?
/// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`.
public var taskDidSendBodyData: ((NSURLSession, NSURLSessionTask, Int64, Int64, Int64) -> Void)?
/// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didCompleteWithError:`.
public var taskDidComplete: ((NSURLSession, NSURLSessionTask, NSError?) -> Void)?
// MARK: Delegate Methods
/**
Tells the delegate that the remote server requested an HTTP redirect.
- parameter session: The session containing the task whose request resulted in a redirect.
- parameter task: The task whose request resulted in a redirect.
- parameter response: An object containing the server’s response to the original request.
- parameter request: A URL request object filled out with the new location.
- parameter completionHandler: A closure that your handler should call with either the value of the request
parameter, a modified URL request object, or NULL to refuse the redirect and
return the body of the redirect response.
*/
public func URLSession(
session: NSURLSession,
task: NSURLSessionTask,
willPerformHTTPRedirection response: NSHTTPURLResponse,
newRequest request: NSURLRequest,
completionHandler: ((NSURLRequest?) -> Void))
{
var redirectRequest: NSURLRequest? = request
if let taskWillPerformHTTPRedirection = taskWillPerformHTTPRedirection {
redirectRequest = taskWillPerformHTTPRedirection(session, task, response, request)
}
completionHandler(redirectRequest)
}
/**
Requests credentials from the delegate in response to an authentication request from the remote server.
- parameter session: The session containing the task whose request requires authentication.
- parameter task: The task whose request requires authentication.
- parameter challenge: An object that contains the request for authentication.
- parameter completionHandler: A handler that your delegate method must call providing the disposition and credential.
*/
public func URLSession(
session: NSURLSession,
task: NSURLSessionTask,
didReceiveChallenge challenge: NSURLAuthenticationChallenge,
completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void))
{
if let taskDidReceiveChallenge = taskDidReceiveChallenge {
completionHandler(taskDidReceiveChallenge(session, task, challenge))
} else if let delegate = self[task] {
delegate.URLSession(
session,
task: task,
didReceiveChallenge: challenge,
completionHandler: completionHandler
)
} else {
URLSession(session, didReceiveChallenge: challenge, completionHandler: completionHandler)
}
}
/**
Tells the delegate when a task requires a new request body stream to send to the remote server.
- parameter session: The session containing the task that needs a new body stream.
- parameter task: The task that needs a new body stream.
- parameter completionHandler: A completion handler that your delegate method should call with the new body stream.
*/
public func URLSession(
session: NSURLSession,
task: NSURLSessionTask,
needNewBodyStream completionHandler: ((NSInputStream?) -> Void))
{
if let taskNeedNewBodyStream = taskNeedNewBodyStream {
completionHandler(taskNeedNewBodyStream(session, task))
} else if let delegate = self[task] {
delegate.URLSession(session, task: task, needNewBodyStream: completionHandler)
}
}
/**
Periodically informs the delegate of the progress of sending body content to the server.
- parameter session: The session containing the data task.
- parameter task: The data task.
- parameter bytesSent: The number of bytes sent since the last time this delegate method was called.
- parameter totalBytesSent: The total number of bytes sent so far.
- parameter totalBytesExpectedToSend: The expected length of the body data.
*/
public func URLSession(
session: NSURLSession,
task: NSURLSessionTask,
didSendBodyData bytesSent: Int64,
totalBytesSent: Int64,
totalBytesExpectedToSend: Int64)
{
if let taskDidSendBodyData = taskDidSendBodyData {
taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend)
} else if let delegate = self[task] as? Request.UploadTaskDelegate {
delegate.URLSession(
session,
task: task,
didSendBodyData: bytesSent,
totalBytesSent: totalBytesSent,
totalBytesExpectedToSend: totalBytesExpectedToSend
)
}
}
/**
Tells the delegate that the task finished transferring data.
- parameter session: The session containing the task whose request finished transferring data.
- parameter task: The task whose request finished transferring data.
- parameter error: If an error occurred, an error object indicating how the transfer failed, otherwise nil.
*/
public func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
if let taskDidComplete = taskDidComplete {
taskDidComplete(session, task, error)
} else if let delegate = self[task] {
delegate.URLSession(session, task: task, didCompleteWithError: error)
}
NSNotificationCenter.defaultCenter().postNotificationName(Notifications.Task.DidComplete, object: task)
self[task] = nil
}
// MARK: - NSURLSessionDataDelegate
// MARK: Override Closures
/// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didReceiveResponse:completionHandler:`.
public var dataTaskDidReceiveResponse: ((NSURLSession, NSURLSessionDataTask, NSURLResponse) -> NSURLSessionResponseDisposition)?
/// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didBecomeDownloadTask:`.
public var dataTaskDidBecomeDownloadTask: ((NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask) -> Void)?
/// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didReceiveData:`.
public var dataTaskDidReceiveData: ((NSURLSession, NSURLSessionDataTask, NSData) -> Void)?
/// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:willCacheResponse:completionHandler:`.
public var dataTaskWillCacheResponse: ((NSURLSession, NSURLSessionDataTask, NSCachedURLResponse) -> NSCachedURLResponse!)?
// MARK: Delegate Methods
/**
Tells the delegate that the data task received the initial reply (headers) from the server.
- parameter session: The session containing the data task that received an initial reply.
- parameter dataTask: The data task that received an initial reply.
- parameter response: A URL response object populated with headers.
- parameter completionHandler: A completion handler that your code calls to continue the transfer, passing a
constant to indicate whether the transfer should continue as a data task or
should become a download task.
*/
public func URLSession(
session: NSURLSession,
dataTask: NSURLSessionDataTask,
didReceiveResponse response: NSURLResponse,
completionHandler: ((NSURLSessionResponseDisposition) -> Void))
{
var disposition: NSURLSessionResponseDisposition = .Allow
if let dataTaskDidReceiveResponse = dataTaskDidReceiveResponse {
disposition = dataTaskDidReceiveResponse(session, dataTask, response)
}
completionHandler(disposition)
}
/**
Tells the delegate that the data task was changed to a download task.
- parameter session: The session containing the task that was replaced by a download task.
- parameter dataTask: The data task that was replaced by a download task.
- parameter downloadTask: The new download task that replaced the data task.
*/
public func URLSession(
session: NSURLSession,
dataTask: NSURLSessionDataTask,
didBecomeDownloadTask downloadTask: NSURLSessionDownloadTask)
{
if let dataTaskDidBecomeDownloadTask = dataTaskDidBecomeDownloadTask {
dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask)
} else {
let downloadDelegate = Request.DownloadTaskDelegate(task: downloadTask)
self[downloadTask] = downloadDelegate
}
}
/**
Tells the delegate that the data task has received some of the expected data.
- parameter session: The session containing the data task that provided data.
- parameter dataTask: The data task that provided data.
- parameter data: A data object containing the transferred data.
*/
public func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
if let dataTaskDidReceiveData = dataTaskDidReceiveData {
dataTaskDidReceiveData(session, dataTask, data)
} else if let delegate = self[dataTask] as? Request.DataTaskDelegate {
delegate.URLSession(session, dataTask: dataTask, didReceiveData: data)
}
}
/**
Asks the delegate whether the data (or upload) task should store the response in the cache.
- parameter session: The session containing the data (or upload) task.
- parameter dataTask: The data (or upload) task.
- parameter proposedResponse: The default caching behavior. This behavior is determined based on the current
caching policy and the values of certain received headers, such as the Pragma
and Cache-Control headers.
- parameter completionHandler: A block that your handler must call, providing either the original proposed
response, a modified version of that response, or NULL to prevent caching the
response. If your delegate implements this method, it must call this completion
handler; otherwise, your app leaks memory.
*/
public func URLSession(
session: NSURLSession,
dataTask: NSURLSessionDataTask,
willCacheResponse proposedResponse: NSCachedURLResponse,
completionHandler: ((NSCachedURLResponse?) -> Void))
{
if let dataTaskWillCacheResponse = dataTaskWillCacheResponse {
completionHandler(dataTaskWillCacheResponse(session, dataTask, proposedResponse))
} else if let delegate = self[dataTask] as? Request.DataTaskDelegate {
delegate.URLSession(
session,
dataTask: dataTask,
willCacheResponse: proposedResponse,
completionHandler: completionHandler
)
} else {
completionHandler(proposedResponse)
}
}
// MARK: - NSURLSessionDownloadDelegate
// MARK: Override Closures
/// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didFinishDownloadingToURL:`.
public var downloadTaskDidFinishDownloadingToURL: ((NSURLSession, NSURLSessionDownloadTask, NSURL) -> Void)?
/// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:`.
public var downloadTaskDidWriteData: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64, Int64) -> Void)?
/// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`.
public var downloadTaskDidResumeAtOffset: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64) -> Void)?
// MARK: Delegate Methods
/**
Tells the delegate that a download task has finished downloading.
- parameter session: The session containing the download task that finished.
- parameter downloadTask: The download task that finished.
- parameter location: A file URL for the temporary file. Because the file is temporary, you must either
open the file for reading or move it to a permanent location in your app’s sandbox
container directory before returning from this delegate method.
*/
public func URLSession(
session: NSURLSession,
downloadTask: NSURLSessionDownloadTask,
didFinishDownloadingToURL location: NSURL)
{
if let downloadTaskDidFinishDownloadingToURL = downloadTaskDidFinishDownloadingToURL {
downloadTaskDidFinishDownloadingToURL(session, downloadTask, location)
} else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate {
delegate.URLSession(session, downloadTask: downloadTask, didFinishDownloadingToURL: location)
}
}
/**
Periodically informs the delegate about the download’s progress.
- parameter session: The session containing the download task.
- parameter downloadTask: The download task.
- parameter bytesWritten: The number of bytes transferred since the last time this delegate
method was called.
- parameter totalBytesWritten: The total number of bytes transferred so far.
- parameter totalBytesExpectedToWrite: The expected length of the file, as provided by the Content-Length
header. If this header was not provided, the value is
`NSURLSessionTransferSizeUnknown`.
*/
public func URLSession(
session: NSURLSession,
downloadTask: NSURLSessionDownloadTask,
didWriteData bytesWritten: Int64,
totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64)
{
if let downloadTaskDidWriteData = downloadTaskDidWriteData {
downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite)
} else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate {
delegate.URLSession(
session,
downloadTask: downloadTask,
didWriteData: bytesWritten,
totalBytesWritten: totalBytesWritten,
totalBytesExpectedToWrite: totalBytesExpectedToWrite
)
}
}
/**
Tells the delegate that the download task has resumed downloading.
- parameter session: The session containing the download task that finished.
- parameter downloadTask: The download task that resumed. See explanation in the discussion.
- parameter fileOffset: If the file's cache policy or last modified date prevents reuse of the
existing content, then this value is zero. Otherwise, this value is an
integer representing the number of bytes on disk that do not need to be
retrieved again.
- parameter expectedTotalBytes: The expected length of the file, as provided by the Content-Length header.
If this header was not provided, the value is NSURLSessionTransferSizeUnknown.
*/
public func URLSession(
session: NSURLSession,
downloadTask: NSURLSessionDownloadTask,
didResumeAtOffset fileOffset: Int64,
expectedTotalBytes: Int64)
{
if let downloadTaskDidResumeAtOffset = downloadTaskDidResumeAtOffset {
downloadTaskDidResumeAtOffset(session, downloadTask, fileOffset, expectedTotalBytes)
} else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate {
delegate.URLSession(
session,
downloadTask: downloadTask,
didResumeAtOffset: fileOffset,
expectedTotalBytes: expectedTotalBytes
)
}
}
// MARK: - NSURLSessionStreamDelegate
var _streamTaskReadClosed: Any?
var _streamTaskWriteClosed: Any?
var _streamTaskBetterRouteDiscovered: Any?
var _streamTaskDidBecomeInputStream: Any?
// MARK: - NSObject
public override func respondsToSelector(selector: Selector) -> Bool {
switch selector {
case "URLSession:didBecomeInvalidWithError:":
return sessionDidBecomeInvalidWithError != nil
case "URLSession:didReceiveChallenge:completionHandler:":
return sessionDidReceiveChallenge != nil
case "URLSessionDidFinishEventsForBackgroundURLSession:":
return sessionDidFinishEventsForBackgroundURLSession != nil
case "URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:":
return taskWillPerformHTTPRedirection != nil
case "URLSession:dataTask:didReceiveResponse:completionHandler:":
return dataTaskDidReceiveResponse != nil
default:
return self.dynamicType.instancesRespondToSelector(selector)
}
}
}
}
================================================
FILE: Sublime/Pods/Alamofire/Source/MultipartFormData.swift
================================================
// MultipartFormData.swift
//
// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
//
// 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 os(iOS) || os(watchOS) || os(tvOS)
import MobileCoreServices
#elseif os(OSX)
import CoreServices
#endif
/**
Constructs `multipart/form-data` for uploads within an HTTP or HTTPS body. There are currently two ways to encode
multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead
to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the
data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for
larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset.
For more information on `multipart/form-data` in general, please refer to the RFC-2388 and RFC-2045 specs as well
and the w3 form documentation.
- https://www.ietf.org/rfc/rfc2388.txt
- https://www.ietf.org/rfc/rfc2045.txt
- https://www.w3.org/TR/html401/interact/forms.html#h-17.13
*/
public class MultipartFormData {
// MARK: - Helper Types
struct EncodingCharacters {
static let CRLF = "\r\n"
}
struct BoundaryGenerator {
enum BoundaryType {
case Initial, Encapsulated, Final
}
static func randomBoundary() -> String {
return String(format: "alamofire.boundary.%08x%08x", arc4random(), arc4random())
}
static func boundaryData(boundaryType boundaryType: BoundaryType, boundary: String) -> NSData {
let boundaryText: String
switch boundaryType {
case .Initial:
boundaryText = "--\(boundary)\(EncodingCharacters.CRLF)"
case .Encapsulated:
boundaryText = "\(EncodingCharacters.CRLF)--\(boundary)\(EncodingCharacters.CRLF)"
case .Final:
boundaryText = "\(EncodingCharacters.CRLF)--\(boundary)--\(EncodingCharacters.CRLF)"
}
return boundaryText.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
}
}
class BodyPart {
let headers: [String: String]
let bodyStream: NSInputStream
let bodyContentLength: UInt64
var hasInitialBoundary = false
var hasFinalBoundary = false
init(headers: [String: String], bodyStream: NSInputStream, bodyContentLength: UInt64) {
self.headers = headers
self.bodyStream = bodyStream
self.bodyContentLength = bodyContentLength
}
}
// MARK: - Properties
/// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`.
public var contentType: String { return "multipart/form-data; boundary=\(boundary)" }
/// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries.
public var contentLength: UInt64 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } }
/// The boundary used to separate the body parts in the encoded form data.
public let boundary: String
private var bodyParts: [BodyPart]
private var bodyPartError: NSError?
private let streamBufferSize: Int
// MARK: - Lifecycle
/**
Creates a multipart form data object.
- returns: The multipart form data object.
*/
public init() {
self.boundary = BoundaryGenerator.randomBoundary()
self.bodyParts = []
/**
* The optimal read/write buffer size in bytes for input and output streams is 1024 (1KB). For more
* information, please refer to the following article:
* - https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html
*/
self.streamBufferSize = 1024
}
// MARK: - Body Parts
/**
Creates a body part from the data and appends it to the multipart form data object.
The body part data will be encoded using the following format:
- `Content-Disposition: form-data; name=#{name}` (HTTP Header)
- Encoded data
- Multipart form boundary
- parameter data: The data to encode into the multipart form data.
- parameter name: The name to associate with the data in the `Content-Disposition` HTTP header.
*/
public func appendBodyPart(data data: NSData, name: String) {
let headers = contentHeaders(name: name)
let stream = NSInputStream(data: data)
let length = UInt64(data.length)
appendBodyPart(stream: stream, length: length, headers: headers)
}
/**
Creates a body part from the data and appends it to the multipart form data object.
The body part data will be encoded using the following format:
- `Content-Disposition: form-data; name=#{name}` (HTTP Header)
- `Content-Type: #{generated mimeType}` (HTTP Header)
- Encoded data
- Multipart form boundary
- parameter data: The data to encode into the multipart form data.
- parameter name: The name to associate with the data in the `Content-Disposition` HTTP header.
- parameter mimeType: The MIME type to associate with the data content type in the `Content-Type` HTTP header.
*/
public func appendBodyPart(data data: NSData, name: String, mimeType: String) {
let headers = contentHeaders(name: name, mimeType: mimeType)
let stream = NSInputStream(data: data)
let length = UInt64(data.length)
appendBodyPart(stream: stream, length: length, headers: headers)
}
/**
Creates a body part from the data and appends it to the multipart form data object.
The body part data will be encoded using the following format:
- `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header)
- `Content-Type: #{mimeType}` (HTTP Header)
- Encoded file data
- Multipart form boundary
- parameter data: The data to encode into the multipart form data.
- parameter name: The name to associate with the data in the `Content-Disposition` HTTP header.
- parameter fileName: The filename to associate with the data in the `Content-Disposition` HTTP header.
- parameter mimeType: The MIME type to associate with the data in the `Content-Type` HTTP header.
*/
public func appendBodyPart(data data: NSData, name: String, fileName: String, mimeType: String) {
let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType)
let stream = NSInputStream(data: data)
let length = UInt64(data.length)
appendBodyPart(stream: stream, length: length, headers: headers)
}
/**
Creates a body part from the file and appends it to the multipart form data object.
The body part data will be encoded using the following format:
- `Content-Disposition: form-data; name=#{name}; filename=#{generated filename}` (HTTP Header)
- `Content-Type: #{generated mimeType}` (HTTP Header)
- Encoded file data
- Multipart form boundary
The filename in the `Content-Disposition` HTTP header is generated from the last path component of the
`fileURL`. The `Content-Type` HTTP header MIME type is generated by mapping the `fileURL` extension to the
system associated MIME type.
- parameter fileURL: The URL of the file whose content will be encoded into the multipart form data.
- parameter name: The name to associate with the file content in the `Content-Disposition` HTTP header.
*/
public func appendBodyPart(fileURL fileURL: NSURL, name: String) {
if let
fileName = fileURL.lastPathComponent,
pathExtension = fileURL.pathExtension
{
let mimeType = mimeTypeForPathExtension(pathExtension)
appendBodyPart(fileURL: fileURL, name: name, fileName: fileName, mimeType: mimeType)
} else {
let failureReason = "Failed to extract the fileName of the provided URL: \(fileURL)"
setBodyPartError(Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason))
}
}
/**
Creates a body part from the file and appends it to the multipart form data object.
The body part data will be encoded using the following format:
- Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)
- Content-Type: #{mimeType} (HTTP Header)
- Encoded file data
- Multipart form boundary
- parameter fileURL: The URL of the file whose content will be encoded into the multipart form data.
- parameter name: The name to associate with the file content in the `Content-Disposition` HTTP header.
- parameter fileName: The filename to associate with the file content in the `Content-Disposition` HTTP header.
- parameter mimeType: The MIME type to associate with the file content in the `Content-Type` HTTP header.
*/
public func appendBodyPart(fileURL fileURL: NSURL, name: String, fileName: String, mimeType: String) {
let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType)
//============================================================
// Check 1 - is file URL?
//============================================================
guard fileURL.fileURL else {
let failureReason = "The file URL does not point to a file URL: \(fileURL)"
let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)
setBodyPartError(error)
return
}
//============================================================
// Check 2 - is file URL reachable?
//============================================================
var isReachable = true
if #available(OSX 10.10, *) {
isReachable = fileURL.checkPromisedItemIsReachableAndReturnError(nil)
}
guard isReachable else {
let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: "The file URL is not reachable: \(fileURL)")
setBodyPartError(error)
return
}
//============================================================
// Check 3 - is file URL a directory?
//============================================================
var isDirectory: ObjCBool = false
guard let
path = fileURL.path
where NSFileManager.defaultManager().fileExistsAtPath(path, isDirectory: &isDirectory) && !isDirectory else
{
let failureReason = "The file URL is a directory, not a file: \(fileURL)"
let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)
setBodyPartError(error)
return
}
//============================================================
// Check 4 - can the file size be extracted?
//============================================================
var bodyContentLength: UInt64?
do {
if let
path = fileURL.path,
fileSize = try NSFileManager.defaultManager().attributesOfItemAtPath(path)[NSFileSize] as? NSNumber
{
bodyContentLength = fileSize.unsignedLongLongValue
}
} catch {
// No-op
}
guard let length = bodyContentLength else {
let failureReason = "Could not fetch attributes from the file URL: \(fileURL)"
let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)
setBodyPartError(error)
return
}
//============================================================
// Check 5 - can a stream be created from file URL?
//============================================================
guard let stream = NSInputStream(URL: fileURL) else {
let failureReason = "Failed to create an input stream from the file URL: \(fileURL)"
let error = Error.errorWithCode(NSURLErrorCannotOpenFile, failureReason: failureReason)
setBodyPartError(error)
return
}
appendBodyPart(stream: stream, length: length, headers: headers)
}
/**
Creates a body part from the stream and appends it to the multipart form data object.
The body part data will be encoded using the following format:
- `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header)
- `Content-Type: #{mimeType}` (HTTP Header)
- Encoded stream data
- Multipart form boundary
- parameter stream: The input stream to encode in the multipart form data.
- parameter length: The content length of the stream.
- parameter name: The name to associate with the stream content in the `Content-Disposition` HTTP header.
- parameter fileName: The filename to associate with the stream content in the `Content-Disposition` HTTP header.
- parameter mimeType: The MIME type to associate with the stream content in the `Content-Type` HTTP header.
*/
public func appendBodyPart(
stream stream: NSInputStream,
length: UInt64,
name: String,
fileName: String,
mimeType: String)
{
let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType)
appendBodyPart(stream: stream, length: length, headers: headers)
}
/**
Creates a body part with the headers, stream and length and appends it to the multipart form data object.
The body part data will be encoded using the following format:
- HTTP headers
- Encoded stream data
- Multipart form boundary
- parameter stream: The input stream to encode in the multipart form data.
- parameter length: The content length of the stream.
- parameter headers: The HTTP headers for the body part.
*/
public func appendBodyPart(stream stream: NSInputStream, length: UInt64, headers: [String: String]) {
let bodyPart = BodyPart(headers: headers, bodyStream: stream, bodyContentLength: length)
bodyParts.append(bodyPart)
}
// MARK: - Data Encoding
/**
Encodes all the appended body parts into a single `NSData` object.
It is important to note that this method will load all the appended body parts into memory all at the same
time. This method should only be used when the encoded data will have a small memory footprint. For large data
cases, please use the `writeEncodedDataToDisk(fileURL:completionHandler:)` method.
- throws: An `NSError` if encoding encounters an error.
- returns: The encoded `NSData` if encoding is successful.
*/
public func encode() throws -> NSData {
if let bodyPartError = bodyPartError {
throw bodyPartError
}
let encoded = NSMutableData()
bodyParts.first?.hasInitialBoundary = true
bodyParts.last?.hasFinalBoundary = true
for bodyPart in bodyParts {
let encodedData = try encodeBodyPart(bodyPart)
encoded.appendData(encodedData)
}
return encoded
}
/**
Writes the appended body parts into the given file URL.
This process is facilitated by reading and writing with input and output streams, respectively. Thus,
this approach is very memory efficient and should be used for large body part data.
- parameter fileURL: The file URL to write the multipart form data into.
- throws: An `NSError` if encoding encounters an error.
*/
public func writeEncodedDataToDisk(fileURL: NSURL) throws {
if let bodyPartError = bodyPartError {
throw bodyPartError
}
if let path = fileURL.path where NSFileManager.defaultManager().fileExistsAtPath(path) {
let failureReason = "A file already exists at the given file URL: \(fileURL)"
throw Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)
} else if !fileURL.fileURL {
let failureReason = "The URL does not point to a valid file: \(fileURL)"
throw Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)
}
let outputStream: NSOutputStream
if let possibleOutputStream = NSOutputStream(URL: fileURL, append: false) {
outputStream = possibleOutputStream
} else {
let failureReason = "Failed to create an output stream with the given URL: \(fileURL)"
throw Error.errorWithCode(NSURLErrorCannotOpenFile, failureReason: failureReason)
}
outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream.open()
self.bodyParts.first?.hasInitialBoundary = true
self.bodyParts.last?.hasFinalBoundary = true
for bodyPart in self.bodyParts {
try writeBodyPart(bodyPart, toOutputStream: outputStream)
}
outputStream.close()
outputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
}
// MARK: - Private - Body Part Encoding
private func encodeBodyPart(bodyPart: BodyPart) throws -> NSData {
let encoded = NSMutableData()
let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData()
encoded.appendData(initialData)
let headerData = encodeHeaderDataForBodyPart(bodyPart)
encoded.appendData(headerData)
let bodyStreamData = try encodeBodyStreamDataForBodyPart(bodyPart)
encoded.appendData(bodyStreamData)
if bodyPart.hasFinalBoundary {
encoded.appendData(finalBoundaryData())
}
return encoded
}
private func encodeHeaderDataForBodyPart(bodyPart: BodyPart) -> NSData {
var headerText = ""
for (key, value) in bodyPart.headers {
headerText += "\(key): \(value)\(EncodingCharacters.CRLF)"
}
headerText += EncodingCharacters.CRLF
return headerText.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
}
private func encodeBodyStreamDataForBodyPart(bodyPart: BodyPart) throws -> NSData {
let inputStream = bodyPart.bodyStream
inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputStream.open()
var error: NSError?
let encoded = NSMutableData()
while inputStream.hasBytesAvailable {
var buffer = [UInt8](count: streamBufferSize, repeatedValue: 0)
let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize)
if inputStream.streamError != nil {
error = inputStream.streamError
break
}
if bytesRead > 0 {
encoded.appendBytes(buffer, length: bytesRead)
} else if bytesRead < 0 {
let failureReason = "Failed to read from input stream: \(inputStream)"
error = Error.errorWithCode(.InputStreamReadFailed, failureReason: failureReason)
break
} else {
break
}
}
inputStream.close()
inputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
if let error = error {
throw error
}
return encoded
}
// MARK: - Private - Writing Body Part to Output Stream
private func writeBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws {
try writeInitialBoundaryDataForBodyPart(bodyPart, toOutputStream: outputStream)
try writeHeaderDataForBodyPart(bodyPart, toOutputStream: outputStream)
try writeBodyStreamForBodyPart(bodyPart, toOutputStream: outputStream)
try writeFinalBoundaryDataForBodyPart(bodyPart, toOutputStream: outputStream)
}
private func writeInitialBoundaryDataForBodyPart(
bodyPart: BodyPart,
toOutputStream outputStream: NSOutputStream)
throws
{
let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData()
return try writeData(initialData, toOutputStream: outputStream)
}
private func writeHeaderDataForBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws {
let headerData = encodeHeaderDataForBodyPart(bodyPart)
return try writeData(headerData, toOutputStream: outputStream)
}
private func writeBodyStreamForBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws {
let inputStream = bodyPart.bodyStream
inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputStream.open()
while inputStream.hasBytesAvailable {
var buffer = [UInt8](count: streamBufferSize, repeatedValue: 0)
let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize)
if let streamError = inputStream.streamError {
throw streamError
}
if bytesRead > 0 {
if buffer.count != bytesRead {
buffer = Array(buffer[0..<bytesRead])
}
try writeBuffer(&buffer, toOutputStream: outputStream)
} else if bytesRead < 0 {
let failureReason = "Failed to read from input stream: \(inputStream)"
throw Error.errorWithCode(.InputStreamReadFailed, failureReason: failureReason)
} else {
break
}
}
inputStream.close()
inputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
}
private func writeFinalBoundaryDataForBodyPart(
bodyPart: BodyPart,
toOutputStream outputStream: NSOutputStream)
throws
{
if bodyPart.hasFinalBoundary {
return try writeData(finalBoundaryData(), toOutputStream: outputStream)
}
}
// MARK: - Private - Writing Buffered Data to Output Stream
private func writeData(data: NSData, toOutputStream outputStream: NSOutputStream) throws {
var buffer = [UInt8](count: data.length, repeatedValue: 0)
data.getBytes(&buffer, length: data.length)
return try writeBuffer(&buffer, toOutputStream: outputStream)
}
private func writeBuffer(inout buffer: [UInt8], toOutputStream outputStream: NSOutputStream) throws {
var bytesToWrite = buffer.count
while bytesToWrite > 0 {
if outputStream.hasSpaceAvailable {
let bytesWritten = outputStream.write(buffer, maxLength: bytesToWrite)
if let streamError = outputStream.streamError {
throw streamError
}
if bytesWritten < 0 {
let failureReason = "Failed to write to output stream: \(outputStream)"
throw Error.errorWithCode(.OutputStreamWriteFailed, failureReason: failureReason)
}
bytesToWrite -= bytesWritten
if bytesToWrite > 0 {
buffer = Array(buffer[bytesWritten..<buffer.count])
}
} else if let streamError = outputStream.streamError {
throw streamError
}
}
}
// MARK: - Private - Mime Type
private func mimeTypeForPathExtension(pathExtension: String) -> String {
if let
id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil)?.takeRetainedValue(),
contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue()
{
return contentType as String
}
return "application/octet-stream"
}
// MARK: - Private - Content Headers
private func contentHeaders(name name: String) -> [String: String] {
return ["Content-Disposition": "form-data; name=\"\(name)\""]
}
private func contentHeaders(name name: String, mimeType: String) -> [String: String] {
return [
"Content-Disposition": "form-data; name=\"\(name)\"",
"Content-Type": "\(mimeType)"
]
}
private func contentHeaders(name name: String, fileName: String, mimeType: String) -> [String: String] {
return [
"Content-Disposition": "form-data; name=\"\(name)\"; filename=\"\(fileName)\"",
"Content-Type": "\(mimeType)"
]
}
// MARK: - Private - Boundary Encoding
private func initialBoundaryData() -> NSData {
return BoundaryGenerator.boundaryData(boundaryType: .Initial, boundary: boundary)
}
private func encapsulatedBoundaryData() -> NSData {
return BoundaryGenerator.boundaryData(boundaryType: .Encapsulated, boundary: boundary)
}
private func finalBoundaryData() -> NSData {
return BoundaryGenerator.boundaryData(boundaryType: .Final, boundary: boundary)
}
// MARK: - Private - Errors
private func setBodyPartError(error: NSError) {
if bodyPartError == nil {
bodyPartError = error
}
}
}
================================================
FILE: Sublime/Pods/Alamofire/Source/NetworkReachabilityManager.swift
================================================
// NetworkReachabilityManager.swift
//
// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
//
// 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 !os(watchOS)
import Foundation
import SystemConfiguration
/**
The `NetworkReachabilityManager` class listens for reachability changes of hosts and addresses for both WWAN and
WiFi network interfaces.
Reachability can be used to determine background information about why a network operation failed, or to retry
network requests when a connection is established. It should not be used to prevent a user from initiating a network
request, as it's possible that an initial request may be required to establish reachability.
*/
public class NetworkReachabilityManager {
/**
Defines the various states of network reachability.
- Unknown: It is unknown whether the network is reachable.
- NotReachable: The network is not reachable.
- ReachableOnWWAN: The network is reachable over the WWAN connection.
- ReachableOnWiFi: The network is reachable over the WiFi connection.
*/
public enum NetworkReachabilityStatus {
case Unknown
case NotReachable
case Reachable(ConnectionType)
}
/**
Defines the various connection types detected by reachability flags.
- EthernetOrWiFi: The connection type is either over Ethernet or WiFi.
- WWAN: The connection type is a WWAN connection.
*/
public enum ConnectionType {
case EthernetOrWiFi
case WWAN
}
/// A closure executed when the network reachability status changes. The closure takes a single argument: the
/// network reachability status.
public typealias Listener = NetworkReachabilityStatus -> Void
// MARK: - Properties
/// Whether the network is currently reachable.
public var isReachable: Bool { return isReachableOnWWAN || isReachableOnEthernetOrWiFi }
/// Whether the network is currently reachable over the WWAN interface.
public var isReachableOnWWAN: Bool { return networkReachabilityStatus == .Reachable(.WWAN) }
/// Whether the network is currently reachable over Ethernet or WiFi interface.
public var isReachableOnEthernetOrWiFi: Bool { return networkReachabilityStatus == .Reachable(.EthernetOrWiFi) }
/// The current network reachability status.
public var networkReachabilityStatus: NetworkReachabilityStatus {
guard let flags = self.flags else { return .Unknown }
return networkReachabilityStatusForFlags(flags)
}
/// The dispatch queue to execute the `listener` closure on.
public var listenerQueue: dispatch_queue_t = dispatch_get_main_queue()
/// A closure executed when the network reachability status changes.
public var listener: Listener?
private var flags: SCNetworkReachabilityFlags? {
var flags = SCNetworkReachabilityFlags()
if SCNetworkReachabilityGetFlags(reachability, &flags) {
return flags
}
return nil
}
private let reachability: SCNetworkReachability
private var previousFlags: SCNetworkReachabilityFlags
// MARK: - Initialization
/**
Creates a `NetworkReachabilityManager` instance with the specified host.
- parameter host: The host used to evaluate network reachability.
- returns: The new `NetworkReachabilityManager` instance.
*/
public convenience init?(host: String) {
guard let reachability = SCNetworkReachabilityCreateWithName(nil, host) else { return nil }
self.init(reachability: reachability)
}
/**
Creates a `NetworkReachabilityManager` instance with the default socket address (`sockaddr_in6`).
- returns: The new `NetworkReachabilityManager` instance.
*/
public convenience init?() {
var address = sockaddr_in6()
address.sin6_len = UInt8(sizeofValue(address))
address.sin6_family = sa_family_t(AF_INET6)
guard let reachability = withUnsafePointer(&address, {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}) else { return nil }
self.init(reachability: reachability)
}
private init(reachability: SCNetworkReachability) {
self.reachability = reachability
self.previousFlags = SCNetworkReachabilityFlags()
}
deinit {
stopListening()
}
// MARK: - Listening
/**
Starts listening for changes in network reachability status.
- returns: `true` if listening was started successfully, `false` otherwise.
*/
public func startListening() -> Bool {
var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
context.info = UnsafeMutablePointer(Unmanaged.passUnretained(self).toOpaque())
let callbackEnabled = SCNetworkReachabilitySetCallback(
reachability,
{ (_, flags, info) in
let reachability = Unmanaged<NetworkReachabilityManager>.fromOpaque(COpaquePointer(info)).takeUnretainedValue()
reachability.notifyListener(flags)
},
&context
)
let queueEnabled = SCNetworkReachabilitySetDispatchQueue(reachability, listenerQueue)
dispatch_async(listenerQueue) {
self.previousFlags = SCNetworkReachabilityFlags()
self.notifyListener(self.flags ?? SCNetworkReachabilityFlags())
}
return callbackEnabled && queueEnabled
}
/**
Stops listening for changes in network reachability status.
*/
public func stopListening() {
SCNetworkReachabilitySetCallback(reachability, nil, nil)
SCNetworkReachabilitySetDispatchQueue(reachability, nil)
}
// MARK: - Internal - Listener Notification
func notifyListener(flags: SCNetworkReachabilityFlags) {
guard previousFlags != flags else { return }
previousFlags = flags
listener?(networkReachabilityStatusForFlags(flags))
}
// MARK: - Internal - Network Reachability Status
func networkReachabilityStatusForFlags(flags: SCNetworkReachabilityFlags) -> NetworkReachabilityStatus {
guard flags.contains(.Reachable) else { return .NotReachable }
var networkStatus: NetworkReachabilityStatus = .NotReachable
if !flags.contains(.ConnectionRequired) { networkStatus = .Reachable(.EthernetOrWiFi) }
if flags.contains(.ConnectionOnDemand) || flags.contains(.ConnectionOnTraffic) {
if !flags.contains(.InterventionRequired) { networkStatus = .Reachable(.EthernetOrWiFi) }
}
#if os(iOS)
if flags.contains(.IsWWAN) { networkStatus = .Reachable(.WWAN) }
#endif
return networkStatus
}
}
// MARK: -
extension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable {}
/**
Returns whether the two network reachability status values are equal.
- parameter lhs: The left-hand side value to compare.
- parameter rhs: The right-hand side value to compare.
- returns: `true` if the two values are equal, `false` otherwise.
*/
public func ==(
lhs: NetworkReachabilityManager.NetworkReachabilityStatus,
rhs: NetworkReachabilityManager.NetworkReachabilityStatus)
-> Bool
{
switch (lhs, rhs) {
case (.Unknown, .Unknown):
return true
case (.NotReachable, .NotReachable):
return true
case let (.Reachable(lhsConnectionType), .Reachable(rhsConnectionType)):
return lhsConnectionType == rhsConnectionType
default:
return false
}
}
#endif
================================================
FILE: Sublime/Pods/Alamofire/Source/Notifications.swift
================================================
// Notifications.swift
//
// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
//
// 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
/// Contains all the `NSNotification` names posted by Alamofire with descriptions of each notification's payload.
public struct Notifications {
/// Used as a namespace for all `NSURLSessionTask` related notifications.
public struct Task {
/// Notification posted when an `NSURLSessionTask` is resumed. The notification `object` contains the resumed
/// `NSURLSessionTask`.
public static let DidResume = "com.alamofire.notifications.task.didResume"
/// Notification posted when an `NSURLSessionTask` is suspended. The notification `object` contains the
/// suspended `NSURLSessionTask`.
public static let DidSuspend
gitextract_fjit1hwf/ ├── .gitignore ├── LICENSE ├── README.md ├── Sublime/ │ ├── Cycript.framework/ │ │ ├── Cycript │ │ └── Headers/ │ │ └── Cycript.h │ ├── Podfile │ ├── Pods/ │ │ ├── AASquaresLoading/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── Source/ │ │ │ └── AASquaresLoading.swift │ │ ├── Alamofire/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── Source/ │ │ │ ├── Alamofire.swift │ │ │ ├── Download.swift │ │ │ ├── Error.swift │ │ │ ├── Manager.swift │ │ │ ├── MultipartFormData.swift │ │ │ ├── NetworkReachabilityManager.swift │ │ │ ├── Notifications.swift │ │ │ ├── ParameterEncoding.swift │ │ │ ├── Request.swift │ │ │ ├── Response.swift │ │ │ ├── ResponseSerialization.swift │ │ │ ├── Result.swift │ │ │ ├── ServerTrustPolicy.swift │ │ │ ├── Stream.swift │ │ │ ├── Timeline.swift │ │ │ ├── Upload.swift │ │ │ └── Validation.swift │ │ ├── AlamofireRSSParser/ │ │ │ ├── LICENSE │ │ │ ├── Pod/ │ │ │ │ └── Classes/ │ │ │ │ ├── AlamofireRSSParser.h │ │ │ │ ├── AlamofireRSSParser.swift │ │ │ │ ├── RSSFeed.swift │ │ │ │ └── RSSItem.swift │ │ │ └── README.md │ │ ├── CYRTextView/ │ │ │ ├── CYRTextView/ │ │ │ │ ├── CYRLayoutManager.h │ │ │ │ ├── CYRLayoutManager.m │ │ │ │ ├── CYRTextStorage.h │ │ │ │ ├── CYRTextStorage.m │ │ │ │ ├── CYRTextView.h │ │ │ │ ├── CYRTextView.m │ │ │ │ ├── CYRToken.h │ │ │ │ └── CYRToken.m │ │ │ ├── LICENSE │ │ │ └── README.md │ │ ├── Charts/ │ │ │ ├── Charts/ │ │ │ │ └── Classes/ │ │ │ │ ├── Animation/ │ │ │ │ │ ├── ChartAnimationEasing.swift │ │ │ │ │ └── ChartAnimator.swift │ │ │ │ ├── Charts/ │ │ │ │ │ ├── BarChartView.swift │ │ │ │ │ ├── BarLineChartViewBase.swift │ │ │ │ │ ├── BubbleChartView.swift │ │ │ │ │ ├── CandleStickChartView.swift │ │ │ │ │ ├── ChartViewBase.swift │ │ │ │ │ ├── CombinedChartView.swift │ │ │ │ │ ├── HorizontalBarChartView.swift │ │ │ │ │ ├── LineChartView.swift │ │ │ │ │ ├── PieChartView.swift │ │ │ │ │ ├── PieRadarChartViewBase.swift │ │ │ │ │ ├── RadarChartView.swift │ │ │ │ │ └── ScatterChartView.swift │ │ │ │ ├── Components/ │ │ │ │ │ ├── ChartAxisBase.swift │ │ │ │ │ ├── ChartComponentBase.swift │ │ │ │ │ ├── ChartLegend.swift │ │ │ │ │ ├── ChartLimitLine.swift │ │ │ │ │ ├── ChartMarker.swift │ │ │ │ │ ├── ChartXAxis.swift │ │ │ │ │ └── ChartYAxis.swift │ │ │ │ ├── Data/ │ │ │ │ │ ├── Implementations/ │ │ │ │ │ │ ├── ChartBaseDataSet.swift │ │ │ │ │ │ └── Standard/ │ │ │ │ │ │ ├── BarChartData.swift │ │ │ │ │ │ ├── BarChartDataEntry.swift │ │ │ │ │ │ ├── BarChartDataSet.swift │ │ │ │ │ │ ├── BarLineScatterCandleBubbleChartData.swift │ │ │ │ │ │ ├── BarLineScatterCandleBubbleChartDataSet.swift │ │ │ │ │ │ ├── BubbleChartData.swift │ │ │ │ │ │ ├── BubbleChartDataEntry.swift │ │ │ │ │ │ ├── BubbleChartDataSet.swift │ │ │ │ │ │ ├── CandleChartData.swift │ │ │ │ │ │ ├── CandleChartDataEntry.swift │ │ │ │ │ │ ├── CandleChartDataSet.swift │ │ │ │ │ │ ├── ChartData.swift │ │ │ │ │ │ ├── ChartDataEntry.swift │ │ │ │ │ │ ├── ChartDataSet.swift │ │ │ │ │ │ ├── CombinedChartData.swift │ │ │ │ │ │ ├── LineChartData.swift │ │ │ │ │ │ ├── LineChartDataSet.swift │ │ │ │ │ │ ├── LineRadarChartDataSet.swift │ │ │ │ │ │ ├── LineScatterCandleRadarChartDataSet.swift │ │ │ │ │ │ ├── PieChartData.swift │ │ │ │ │ │ ├── PieChartDataSet.swift │ │ │ │ │ │ ├── RadarChartData.swift │ │ │ │ │ │ ├── RadarChartDataSet.swift │ │ │ │ │ │ ├── ScatterChartData.swift │ │ │ │ │ │ └── ScatterChartDataSet.swift │ │ │ │ │ └── Interfaces/ │ │ │ │ │ ├── IBarChartDataSet.swift │ │ │ │ │ ├── IBarLineScatterCandleBubbleChartDataSet.swift │ │ │ │ │ ├── IBubbleChartDataSet.swift │ │ │ │ │ ├── ICandleChartDataSet.swift │ │ │ │ │ ├── IChartDataSet.swift │ │ │ │ │ ├── ILineChartDataSet.swift │ │ │ │ │ ├── ILineRadarChartDataSet.swift │ │ │ │ │ ├── ILineScatterCandleRadarChartDataSet.swift │ │ │ │ │ ├── IPieChartDataSet.swift │ │ │ │ │ ├── IRadarChartDataSet.swift │ │ │ │ │ └── IScatterChartDataSet.swift │ │ │ │ ├── Filters/ │ │ │ │ │ ├── ChartDataApproximatorFilter.swift │ │ │ │ │ └── ChartDataBaseFilter.swift │ │ │ │ ├── Formatters/ │ │ │ │ │ ├── ChartDefaultFillFormatter.swift │ │ │ │ │ ├── ChartDefaultXAxisValueFormatter.swift │ │ │ │ │ ├── ChartFillFormatter.swift │ │ │ │ │ └── ChartXAxisValueFormatter.swift │ │ │ │ ├── Highlight/ │ │ │ │ │ ├── BarChartHighlighter.swift │ │ │ │ │ ├── ChartHighlight.swift │ │ │ │ │ ├── ChartHighlighter.swift │ │ │ │ │ ├── ChartRange.swift │ │ │ │ │ ├── CombinedHighlighter.swift │ │ │ │ │ └── HorizontalBarChartHighlighter.swift │ │ │ │ ├── Interfaces/ │ │ │ │ │ ├── BarChartDataProvider.swift │ │ │ │ │ ├── BarLineScatterCandleBubbleChartDataProvider.swift │ │ │ │ │ ├── BubbleChartDataProvider.swift │ │ │ │ │ ├── CandleChartDataProvider.swift │ │ │ │ │ ├── ChartDataProvider.swift │ │ │ │ │ ├── LineChartDataProvider.swift │ │ │ │ │ └── ScatterChartDataProvider.swift │ │ │ │ ├── Jobs/ │ │ │ │ │ ├── AnimatedMoveViewJob.swift │ │ │ │ │ ├── AnimatedViewPortJob.swift │ │ │ │ │ ├── AnimatedZoomViewJob.swift │ │ │ │ │ ├── ChartViewPortJob.swift │ │ │ │ │ ├── MoveChartViewJob.swift │ │ │ │ │ └── ZoomChartViewJob.swift │ │ │ │ ├── Renderers/ │ │ │ │ │ ├── BarChartRenderer.swift │ │ │ │ │ ├── BubbleChartRenderer.swift │ │ │ │ │ ├── CandleStickChartRenderer.swift │ │ │ │ │ ├── ChartAxisRendererBase.swift │ │ │ │ │ ├── ChartDataRendererBase.swift │ │ │ │ │ ├── ChartLegendRenderer.swift │ │ │ │ │ ├── ChartRendererBase.swift │ │ │ │ │ ├── ChartXAxisRenderer.swift │ │ │ │ │ ├── ChartXAxisRendererBarChart.swift │ │ │ │ │ ├── ChartXAxisRendererHorizontalBarChart.swift │ │ │ │ │ ├── ChartXAxisRendererRadarChart.swift │ │ │ │ │ ├── ChartYAxisRenderer.swift │ │ │ │ │ ├── ChartYAxisRendererHorizontalBarChart.swift │ │ │ │ │ ├── ChartYAxisRendererRadarChart.swift │ │ │ │ │ ├── CombinedChartRenderer.swift │ │ │ │ │ ├── HorizontalBarChartRenderer.swift │ │ │ │ │ ├── LineChartRenderer.swift │ │ │ │ │ ├── LineRadarChartRenderer.swift │ │ │ │ │ ├── LineScatterCandleRadarChartRenderer.swift │ │ │ │ │ ├── PieChartRenderer.swift │ │ │ │ │ ├── RadarChartRenderer.swift │ │ │ │ │ └── ScatterChartRenderer.swift │ │ │ │ └── Utils/ │ │ │ │ ├── ChartColorTemplates.swift │ │ │ │ ├── ChartFill.swift │ │ │ │ ├── ChartPlatform.swift │ │ │ │ ├── ChartSelectionDetail.swift │ │ │ │ ├── ChartTransformer.swift │ │ │ │ ├── ChartTransformerHorizontalBarChart.swift │ │ │ │ ├── ChartUtils.swift │ │ │ │ └── ChartViewPortHandler.swift │ │ │ ├── LICENSE │ │ │ └── README.md │ │ ├── DGElasticPullToRefresh/ │ │ │ ├── DGElasticPullToRefresh/ │ │ │ │ ├── DGElasticPullToRefreshConstants.swift │ │ │ │ ├── DGElasticPullToRefreshExtensions.swift │ │ │ │ ├── DGElasticPullToRefreshLoadingView.swift │ │ │ │ ├── DGElasticPullToRefreshLoadingViewCircle.swift │ │ │ │ └── DGElasticPullToRefreshView.swift │ │ │ ├── LICENSE │ │ │ └── README.md │ │ ├── EZAudio/ │ │ │ ├── EZAudio/ │ │ │ │ ├── AEFloatConverter.h │ │ │ │ ├── AEFloatConverter.m │ │ │ │ ├── EZAudio.h │ │ │ │ ├── EZAudio.m │ │ │ │ ├── EZAudioFile.h │ │ │ │ ├── EZAudioFile.m │ │ │ │ ├── EZAudioPlayer.h │ │ │ │ ├── EZAudioPlayer.m │ │ │ │ ├── EZAudioPlot.h │ │ │ │ ├── EZAudioPlot.m │ │ │ │ ├── EZAudioPlotGL.h │ │ │ │ ├── EZAudioPlotGL.m │ │ │ │ ├── EZAudioPlotGLKViewController.h │ │ │ │ ├── EZAudioPlotGLKViewController.m │ │ │ │ ├── EZMicrophone.h │ │ │ │ ├── EZMicrophone.m │ │ │ │ ├── EZOutput.h │ │ │ │ ├── EZOutput.m │ │ │ │ ├── EZPlot.h │ │ │ │ ├── EZPlot.m │ │ │ │ ├── EZRecorder.h │ │ │ │ ├── EZRecorder.m │ │ │ │ ├── TPCircularBuffer.c │ │ │ │ └── TPCircularBuffer.h │ │ │ ├── LICENSE │ │ │ └── README.md │ │ ├── Gifu/ │ │ │ ├── Carthage/ │ │ │ │ └── Checkouts/ │ │ │ │ └── Runes/ │ │ │ │ └── Source/ │ │ │ │ └── Runes.swift │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── Source/ │ │ │ ├── AnimatableImageView.swift │ │ │ ├── AnimatedFrame.swift │ │ │ ├── Animator.swift │ │ │ ├── ArrayExtension.swift │ │ │ ├── CGSizeExtension.swift │ │ │ ├── FunctionalHelpers.swift │ │ │ ├── Gifu.h │ │ │ ├── ImageSourceHelpers.swift │ │ │ └── UIImageExtension.swift │ │ ├── NMSSH/ │ │ │ ├── LICENSE │ │ │ ├── NMSSH/ │ │ │ │ ├── Config/ │ │ │ │ │ ├── NMSSH+Protected.h │ │ │ │ │ ├── NMSSHLogger.h │ │ │ │ │ ├── NMSSHLogger.m │ │ │ │ │ ├── socket_helper.h │ │ │ │ │ └── socket_helper.m │ │ │ │ ├── NMSFTP.h │ │ │ │ ├── NMSFTP.m │ │ │ │ ├── NMSFTPFile.h │ │ │ │ ├── NMSFTPFile.m │ │ │ │ ├── NMSSH.h │ │ │ │ ├── NMSSHChannel.h │ │ │ │ ├── NMSSHChannel.m │ │ │ │ ├── NMSSHConfig.h │ │ │ │ ├── NMSSHConfig.m │ │ │ │ ├── NMSSHHostConfig.h │ │ │ │ ├── NMSSHHostConfig.m │ │ │ │ ├── NMSSHSession.h │ │ │ │ ├── NMSSHSession.m │ │ │ │ └── Protocols/ │ │ │ │ ├── NMSSHChannelDelegate.h │ │ │ │ └── NMSSHSessionDelegate.h │ │ │ ├── NMSSH-iOS/ │ │ │ │ ├── Libraries/ │ │ │ │ │ ├── include/ │ │ │ │ │ │ └── libssh2/ │ │ │ │ │ │ ├── libssh2.h │ │ │ │ │ │ ├── libssh2_publickey.h │ │ │ │ │ │ └── libssh2_sftp.h │ │ │ │ │ └── lib/ │ │ │ │ │ ├── libcrypto.a │ │ │ │ │ ├── libssh2.a │ │ │ │ │ └── libssl.a │ │ │ │ └── NMSSH.h │ │ │ └── README.md │ │ ├── Pods.xcodeproj/ │ │ │ └── project.pbxproj │ │ ├── RongCloudIMKit/ │ │ │ └── Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/ │ │ │ ├── Emoji.plist │ │ │ ├── RongCloud.bundle/ │ │ │ │ ├── sms-received.caf │ │ │ │ └── unicode_to_hanyu_pinyin.txt │ │ │ ├── RongIMKit.framework/ │ │ │ │ ├── Headers/ │ │ │ │ │ ├── RCAttributedLabel.h │ │ │ │ │ ├── RCBaseViewController.h │ │ │ │ │ ├── RCChatSessionInputBarControl.h │ │ │ │ │ ├── RCContentView.h │ │ │ │ │ ├── RCConversationBaseCell.h │ │ │ │ │ ├── RCConversationCell.h │ │ │ │ │ ├── RCConversationListViewController.h │ │ │ │ │ ├── RCConversationModel.h │ │ │ │ │ ├── RCConversationSettingTableViewController.h │ │ │ │ │ ├── RCConversationSettingTableViewHeader.h │ │ │ │ │ ├── RCConversationViewController.h │ │ │ │ │ ├── RCEmojiBoardView.h │ │ │ │ │ ├── RCIM.h │ │ │ │ │ ├── RCImageMessageCell.h │ │ │ │ │ ├── RCImageMessageProgressView.h │ │ │ │ │ ├── RCImagePreviewController.h │ │ │ │ │ ├── RCKitUtility.h │ │ │ │ │ ├── RCLocationMessageCell.h │ │ │ │ │ ├── RCLocationPickerViewController.h │ │ │ │ │ ├── RCLocationViewController.h │ │ │ │ │ ├── RCMessageBaseCell.h │ │ │ │ │ ├── RCMessageBubbleTipView.h │ │ │ │ │ ├── RCMessageCell.h │ │ │ │ │ ├── RCMessageCellDelegate.h │ │ │ │ │ ├── RCMessageCellNotificationModel.h │ │ │ │ │ ├── RCMessageModel.h │ │ │ │ │ ├── RCPluginBoardView.h │ │ │ │ │ ├── RCPublicServiceChatViewController.h │ │ │ │ │ ├── RCPublicServiceListViewController.h │ │ │ │ │ ├── RCPublicServiceProfileViewController.h │ │ │ │ │ ├── RCPublicServiceSearchViewController.h │ │ │ │ │ ├── RCRichContentMessageCell.h │ │ │ │ │ ├── RCSettingViewController.h │ │ │ │ │ ├── RCTextMessageCell.h │ │ │ │ │ ├── RCTextView.h │ │ │ │ │ ├── RCThemeDefine.h │ │ │ │ │ ├── RCTipLabel.h │ │ │ │ │ ├── RCTipMessageCell.h │ │ │ │ │ ├── RCUnknownMessageCell.h │ │ │ │ │ ├── RCVoiceMessageCell.h │ │ │ │ │ └── RongIMKit.h │ │ │ │ ├── Info.plist │ │ │ │ └── RongIMKit │ │ │ ├── RongIMLib.framework/ │ │ │ │ ├── Headers/ │ │ │ │ │ ├── RCAMRDataConverter.h │ │ │ │ │ ├── RCChatRoomInfo.h │ │ │ │ │ ├── RCChatRoomMemberInfo.h │ │ │ │ │ ├── RCCommandMessage.h │ │ │ │ │ ├── RCCommandNotificationMessage.h │ │ │ │ │ ├── RCContactNotificationMessage.h │ │ │ │ │ ├── RCConversation.h │ │ │ │ │ ├── RCDiscussion.h │ │ │ │ │ ├── RCDiscussionNotificationMessage.h │ │ │ │ │ ├── RCGroup.h │ │ │ │ │ ├── RCGroupNotificationMessage.h │ │ │ │ │ ├── RCHandShakeMessage.h │ │ │ │ │ ├── RCIMClient.h │ │ │ │ │ ├── RCImageMessage.h │ │ │ │ │ ├── RCInformationNotificationMessage.h │ │ │ │ │ ├── RCLocationMessage.h │ │ │ │ │ ├── RCMessage.h │ │ │ │ │ ├── RCMessageContent.h │ │ │ │ │ ├── RCMessageContentView.h │ │ │ │ │ ├── RCProfileNotificationMessage.h │ │ │ │ │ ├── RCPublicServiceCommandMessage.h │ │ │ │ │ ├── RCPublicServiceMenu.h │ │ │ │ │ ├── RCPublicServiceMenuItem.h │ │ │ │ │ ├── RCPublicServiceMultiRichContentMessage.h │ │ │ │ │ ├── RCPublicServiceProfile.h │ │ │ │ │ ├── RCPublicServiceRichContentMessage.h │ │ │ │ │ ├── RCRealTimeLocationEndMessage.h │ │ │ │ │ ├── RCRealTimeLocationManager.h │ │ │ │ │ ├── RCRealTimeLocationStartMessage.h │ │ │ │ │ ├── RCRichContentItem.h │ │ │ │ │ ├── RCRichContentMessage.h │ │ │ │ │ ├── RCStatusDefine.h │ │ │ │ │ ├── RCStatusMessage.h │ │ │ │ │ ├── RCSuspendMessage.h │ │ │ │ │ ├── RCTextMessage.h │ │ │ │ │ ├── RCUnknownMessage.h │ │ │ │ │ ├── RCUploadImageStatusListener.h │ │ │ │ │ ├── RCUserInfo.h │ │ │ │ │ ├── RCUserTypingStatus.h │ │ │ │ │ ├── RCUtilities.h │ │ │ │ │ ├── RCVoiceMessage.h │ │ │ │ │ ├── RCWatchKitStatusDelegate.h │ │ │ │ │ ├── RongIMLib.h │ │ │ │ │ ├── interf_dec.h │ │ │ │ │ └── interf_enc.h │ │ │ │ ├── Info.plist │ │ │ │ ├── RCConfig.plist │ │ │ │ └── RongIMLib │ │ │ ├── en.lproj/ │ │ │ │ └── RongCloudKit.strings │ │ │ ├── libopencore-amrnb.a │ │ │ └── zh-Hans.lproj/ │ │ │ └── RongCloudKit.strings │ │ ├── SJCSimplePDFView/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── SJCSimplePDFView/ │ │ │ ├── SJCSimplePDFView.h │ │ │ └── SJCSimplePDFView.m │ │ ├── SSZipArchive/ │ │ │ ├── LICENSE.txt │ │ │ ├── README.md │ │ │ └── SSZipArchive/ │ │ │ ├── Common.h │ │ │ ├── SSZipArchive.h │ │ │ ├── SSZipArchive.m │ │ │ ├── ZipArchive.h │ │ │ ├── aes/ │ │ │ │ ├── aes.h │ │ │ │ ├── aes_via_ace.h │ │ │ │ ├── aescrypt.c │ │ │ │ ├── aeskey.c │ │ │ │ ├── aesopt.h │ │ │ │ ├── aestab.c │ │ │ │ ├── aestab.h │ │ │ │ ├── brg_endian.h │ │ │ │ ├── brg_types.h │ │ │ │ ├── entropy.c │ │ │ │ ├── entropy.h │ │ │ │ ├── fileenc.c │ │ │ │ ├── fileenc.h │ │ │ │ ├── hmac.c │ │ │ │ ├── hmac.h │ │ │ │ ├── prng.c │ │ │ │ ├── prng.h │ │ │ │ ├── pwd2key.c │ │ │ │ ├── pwd2key.h │ │ │ │ ├── sha1.c │ │ │ │ └── sha1.h │ │ │ └── minizip/ │ │ │ ├── crypt.h │ │ │ ├── ioapi.c │ │ │ ├── ioapi.h │ │ │ ├── mztools.c │ │ │ ├── mztools.h │ │ │ ├── unzip.c │ │ │ ├── unzip.h │ │ │ ├── zip.c │ │ │ └── zip.h │ │ ├── Swifter/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── Sources/ │ │ │ ├── DemoServer.swift │ │ │ ├── File.swift │ │ │ ├── HttpHandlers+Files.swift │ │ │ ├── HttpHandlers+WebSockets.swift │ │ │ ├── HttpHandlers.swift │ │ │ ├── HttpParser.swift │ │ │ ├── HttpRequest.swift │ │ │ ├── HttpResponse.swift │ │ │ ├── HttpRouter.swift │ │ │ ├── HttpServer.swift │ │ │ ├── HttpServerIO.swift │ │ │ ├── Socket.swift │ │ │ ├── String+BASE64.swift │ │ │ ├── String+Misc.swift │ │ │ └── String+SHA1.swift │ │ ├── SwiftyJSON/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── Source/ │ │ │ └── SwiftyJSON.swift │ │ ├── Target Support Files/ │ │ │ ├── AASquaresLoading/ │ │ │ │ ├── AASquaresLoading-dummy.m │ │ │ │ ├── AASquaresLoading-prefix.pch │ │ │ │ ├── AASquaresLoading-umbrella.h │ │ │ │ ├── AASquaresLoading.modulemap │ │ │ │ ├── AASquaresLoading.xcconfig │ │ │ │ └── Info.plist │ │ │ ├── Alamofire/ │ │ │ │ ├── Alamofire-dummy.m │ │ │ │ ├── Alamofire-prefix.pch │ │ │ │ ├── Alamofire-umbrella.h │ │ │ │ ├── Alamofire.modulemap │ │ │ │ ├── Alamofire.xcconfig │ │ │ │ └── Info.plist │ │ │ ├── AlamofireRSSParser/ │ │ │ │ ├── AlamofireRSSParser-dummy.m │ │ │ │ ├── AlamofireRSSParser-prefix.pch │ │ │ │ ├── AlamofireRSSParser-umbrella.h │ │ │ │ ├── AlamofireRSSParser.modulemap │ │ │ │ ├── AlamofireRSSParser.xcconfig │ │ │ │ └── Info.plist │ │ │ ├── CYRTextView/ │ │ │ │ ├── CYRTextView-dummy.m │ │ │ │ ├── CYRTextView-prefix.pch │ │ │ │ ├── CYRTextView-umbrella.h │ │ │ │ ├── CYRTextView.modulemap │ │ │ │ ├── CYRTextView.xcconfig │ │ │ │ └── Info.plist │ │ │ ├── Charts/ │ │ │ │ ├── Charts-dummy.m │ │ │ │ ├── Charts-prefix.pch │ │ │ │ ├── Charts-umbrella.h │ │ │ │ ├── Charts.modulemap │ │ │ │ ├── Charts.xcconfig │ │ │ │ └── Info.plist │ │ │ ├── DGElasticPullToRefresh/ │ │ │ │ ├── DGElasticPullToRefresh-dummy.m │ │ │ │ ├── DGElasticPullToRefresh-prefix.pch │ │ │ │ ├── DGElasticPullToRefresh-umbrella.h │ │ │ │ ├── DGElasticPullToRefresh.modulemap │ │ │ │ ├── DGElasticPullToRefresh.xcconfig │ │ │ │ └── Info.plist │ │ │ ├── EZAudio/ │ │ │ │ ├── EZAudio-dummy.m │ │ │ │ ├── EZAudio-prefix.pch │ │ │ │ ├── EZAudio-umbrella.h │ │ │ │ ├── EZAudio.modulemap │ │ │ │ ├── EZAudio.xcconfig │ │ │ │ └── Info.plist │ │ │ ├── Gifu/ │ │ │ │ ├── Gifu-dummy.m │ │ │ │ ├── Gifu-prefix.pch │ │ │ │ ├── Gifu-umbrella.h │ │ │ │ ├── Gifu.modulemap │ │ │ │ ├── Gifu.xcconfig │ │ │ │ └── Info.plist │ │ │ ├── NMSSH/ │ │ │ │ ├── Info.plist │ │ │ │ ├── NMSSH-dummy.m │ │ │ │ ├── NMSSH-prefix.pch │ │ │ │ ├── NMSSH-umbrella.h │ │ │ │ ├── NMSSH.modulemap │ │ │ │ └── NMSSH.xcconfig │ │ │ ├── Pods/ │ │ │ │ ├── Info.plist │ │ │ │ ├── Pods-acknowledgements.markdown │ │ │ │ ├── Pods-acknowledgements.plist │ │ │ │ ├── Pods-dummy.m │ │ │ │ ├── Pods-frameworks.sh │ │ │ │ ├── Pods-resources.sh │ │ │ │ ├── Pods-umbrella.h │ │ │ │ ├── Pods.debug.xcconfig │ │ │ │ ├── Pods.modulemap │ │ │ │ └── Pods.release.xcconfig │ │ │ ├── SJCSimplePDFView/ │ │ │ │ ├── Info.plist │ │ │ │ ├── SJCSimplePDFView-dummy.m │ │ │ │ ├── SJCSimplePDFView-prefix.pch │ │ │ │ ├── SJCSimplePDFView-umbrella.h │ │ │ │ ├── SJCSimplePDFView.modulemap │ │ │ │ └── SJCSimplePDFView.xcconfig │ │ │ ├── SSZipArchive/ │ │ │ │ ├── Info.plist │ │ │ │ ├── SSZipArchive-dummy.m │ │ │ │ ├── SSZipArchive-prefix.pch │ │ │ │ ├── SSZipArchive-umbrella.h │ │ │ │ ├── SSZipArchive.modulemap │ │ │ │ └── SSZipArchive.xcconfig │ │ │ ├── Swifter/ │ │ │ │ ├── Info.plist │ │ │ │ ├── Swifter-dummy.m │ │ │ │ ├── Swifter-prefix.pch │ │ │ │ ├── Swifter-umbrella.h │ │ │ │ ├── Swifter.modulemap │ │ │ │ └── Swifter.xcconfig │ │ │ ├── SwiftyJSON/ │ │ │ │ ├── Info.plist │ │ │ │ ├── SwiftyJSON-dummy.m │ │ │ │ ├── SwiftyJSON-prefix.pch │ │ │ │ ├── SwiftyJSON-umbrella.h │ │ │ │ ├── SwiftyJSON.modulemap │ │ │ │ └── SwiftyJSON.xcconfig │ │ │ ├── ZLMusicFlowWaveView/ │ │ │ │ ├── Info.plist │ │ │ │ ├── ZLMusicFlowWaveView-dummy.m │ │ │ │ ├── ZLMusicFlowWaveView-prefix.pch │ │ │ │ ├── ZLMusicFlowWaveView-umbrella.h │ │ │ │ ├── ZLMusicFlowWaveView.modulemap │ │ │ │ └── ZLMusicFlowWaveView.xcconfig │ │ │ └── ZLSinusWaveView/ │ │ │ ├── Info.plist │ │ │ ├── ZLSinusWaveView-dummy.m │ │ │ ├── ZLSinusWaveView-prefix.pch │ │ │ ├── ZLSinusWaveView-umbrella.h │ │ │ ├── ZLSinusWaveView.modulemap │ │ │ └── ZLSinusWaveView.xcconfig │ │ ├── ZLMusicFlowWaveView/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── ZLMusicFlowWaveView/ │ │ │ ├── ZLMusicFlowDecorativeView.h │ │ │ ├── ZLMusicFlowDecorativeView.m │ │ │ ├── ZLMusicFlowWaveView.h │ │ │ └── ZLMusicFlowWaveView.m │ │ └── ZLSinusWaveView/ │ │ ├── LICENSE │ │ ├── README.md │ │ └── ZLSinusWaveView/ │ │ ├── ZLSinusWaveView.h │ │ └── ZLSinusWaveView.m │ ├── Sublime/ │ │ ├── AppDelegate.swift │ │ ├── AppInfoViewController.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── Repositories.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_douban_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_facebook_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_instagram.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_line_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_more_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_pinterest_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_qq_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_qzone_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_sina_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_twitter_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_wechat_session_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Share_wechat_timeline_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Stars.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── add_friend_icon_addfriend.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── add_friend_icon_group.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── add_friend_icon_offical.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── app_small_icon.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── code_share_btn.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── comment.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── config_cycript.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── config_full_screen_code_reading.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── config_show_hidden_file.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── donate.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── donate1.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── donate2.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── donate3.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── donate4.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── donate5.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── donate_weixin.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── explore_codezZ.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_3fr.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_7z.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_aac.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_ai.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_asc.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_asp.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_avi.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_bas.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_cls.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_code_share.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_cpp.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_cr2.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_cs.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_css.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_csv.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_dll.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_dmg.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_dng.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_eps.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_exe.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_fff.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_flv.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_gif.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_gis.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_gpx.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_html.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_j2k.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_jp2.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_jpg.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_js.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_jsp.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_kml.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_kmz.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_mov.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_mp3.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_mp4.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_mpg.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_nef.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_nmea.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_ogg.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_osm.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_otf.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_pdf.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_png.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_ppt.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_pptx.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_ps.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_psd.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_py.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_rar.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_raw.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_svg.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_tar.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_tif.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_ttf.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_txt.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_unknown.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_vb.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_vbs.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_wav.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_wma.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_woff.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_word.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_wsh.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_xaml.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_xls.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_xml.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── file_zip.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── folder.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── function_rss.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── function_scan.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── gist_bg.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── github_avatar.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── github_folder.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── github_fork.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── github_login.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── github_star.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── github_watcher.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── open_safari.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── pdf_continuous.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── pdf_horizontal.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── pdf_vertical.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── repo_download.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── right_arrow.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_cache.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_configure.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_donate.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_feedback.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_github.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_license.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_reading.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_server.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_ssh.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_storage.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_sublime.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── setting_themes.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── ssh_done.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── ssh_keyboard.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── ssh_password.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── ssh_port.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── ssh_server.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── ssh_user.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tab_icon_explore.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tab_icon_files.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tab_icon_setting.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── user_author.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── user_info.imageset/ │ │ │ │ └── Contents.json │ │ │ └── user_robot.imageset/ │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── BoardModel.swift │ │ ├── BoardView.swift │ │ ├── Code.swift │ │ ├── CodeEngine.swift │ │ ├── CodeViewController.swift │ │ ├── ConfigTableViewController.swift │ │ ├── Configure.swift │ │ ├── Constant.swift │ │ ├── ContactInfoViewController.swift │ │ ├── ContactTableViewController.swift │ │ ├── CustomServer.swift │ │ ├── DonateViewController.swift │ │ ├── ExploreTableViewController.swift │ │ ├── FolderTableViewController.swift │ │ ├── Gist.swift │ │ ├── GistTable.swift │ │ ├── GithubAccountTableViewController.swift │ │ ├── GithubTableViewController.swift │ │ ├── Global.swift │ │ ├── GomokuAI.swift │ │ ├── GomokuViewController.swift │ │ ├── HTTPServerTableViewController.swift │ │ ├── ImageFileViewController.swift │ │ ├── ImagePageViewController.swift │ │ ├── Info.plist │ │ ├── LICENSE/ │ │ │ ├── AASquaresLoading.LICENSE │ │ │ ├── Alamofire.LICENSE │ │ │ ├── AlamofireRSSParser.LICENSE │ │ │ ├── CYRTextView.LICENSE │ │ │ ├── Charts.LICENSE │ │ │ ├── DGElasticPullToRefresh.LICENSE │ │ │ ├── EZAudio.LICENSE │ │ │ ├── Gifu.LICENSE │ │ │ ├── MobileVLCKit.LICENSE │ │ │ ├── NMSSH.LICENSE │ │ │ ├── RongCloudIMKit.LICENSE │ │ │ ├── SJCSimplePDFView.LICENSE │ │ │ ├── SSZipArchive.LICENSE │ │ │ ├── Swifter.LICENSE │ │ │ ├── SwiftyJSON.LICENSE │ │ │ ├── ZLMusicFlowWaveView.LICENSE │ │ │ └── ZLSinusWaveView.LICENSE │ │ ├── LicenseTableViewController.swift │ │ ├── LogoView.xib │ │ ├── MainTableViewController.swift │ │ ├── MessageListViewController.swift │ │ ├── MusicViewController.swift │ │ ├── NewFileViewController.swift │ │ ├── PDFViewController.swift │ │ ├── RCChatViewController.swift │ │ ├── RSSItemListTableViewController.swift │ │ ├── RSSListTableViewController.swift │ │ ├── ReadingViewController.swift │ │ ├── Repo.swift │ │ ├── ReposTableViewController.swift │ │ ├── SDK/ │ │ │ └── Weixin/ │ │ │ ├── WXApi.h │ │ │ ├── WXApiObject.h │ │ │ ├── WechatAuthSDK.h │ │ │ └── libWeChatSDK.a │ │ ├── SSHAddNewServerViewController.swift │ │ ├── SSHServerListTableViewController.swift │ │ ├── SSHTerminalViewController.swift │ │ ├── SettingTableViewController.swift │ │ ├── StorageViewController.swift │ │ ├── Sublime-Bridging-Header.h │ │ ├── SublimeSafari.swift │ │ ├── SublimeServer.swift │ │ ├── Utils/ │ │ │ ├── ActionSheet.swift │ │ │ ├── Device.swift │ │ │ ├── Extension/ │ │ │ │ ├── Array.swift │ │ │ │ ├── Date.swift │ │ │ │ ├── Number.swift │ │ │ │ ├── Operation.swift │ │ │ │ ├── Other.swift │ │ │ │ ├── String.swift │ │ │ │ ├── UIApplication.swift │ │ │ │ ├── UIColor.swift │ │ │ │ ├── UIImage.swift │ │ │ │ ├── UIImageView.swift │ │ │ │ ├── UITableView.swift │ │ │ │ ├── UITextView.swift │ │ │ │ ├── UIView.swift │ │ │ │ └── UIViewController.swift │ │ │ ├── File.swift │ │ │ ├── Function.swift │ │ │ ├── Github.swift │ │ │ ├── Log.swift │ │ │ ├── Network.swift │ │ │ ├── NumberedTextView.swift │ │ │ ├── Obj-C/ │ │ │ │ ├── MusicWave.h │ │ │ │ ├── MusicWave.m │ │ │ │ ├── ObjC.h │ │ │ │ └── ObjC.m │ │ │ ├── Plist.swift │ │ │ ├── PopupMenu.swift │ │ │ ├── QRCode.swift │ │ │ ├── QRCodeReader.swift │ │ │ ├── RCIM.swift │ │ │ ├── RearrangeTable.swift │ │ │ ├── ShareToWeixin.swift │ │ │ ├── SublimeTable.swift │ │ │ ├── UnitTest.swift │ │ │ └── VideoPlayerTimeView.swift │ │ ├── VideoViewController.swift │ │ ├── Web/ │ │ │ ├── 404.html │ │ │ ├── README.txt │ │ │ ├── index.html │ │ │ ├── js/ │ │ │ │ └── index.js │ │ │ └── license.txt │ │ ├── WebServerLog.swift │ │ ├── en.lproj/ │ │ │ └── Localizable.strings │ │ ├── zh-Hans.lproj/ │ │ │ └── Localizable.strings │ │ └── 山外小楼夜听雨.m4a │ ├── Sublime.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ └── contents.xcworkspacedata │ └── Sublime.xcworkspace/ │ └── contents.xcworkspacedata └── Sublime_icons.sketch
SYMBOL INDEX (337 symbols across 42 files)
FILE: Sublime/Pods/EZAudio/EZAudio/EZAudioPlot.h
function interface (line 48) | interface EZAudioPlot : EZPlot
FILE: Sublime/Pods/EZAudio/EZAudio/EZAudioPlotGL.h
type EZAudioPlotGLPoint (line 58) | typedef struct {
FILE: Sublime/Pods/EZAudio/EZAudio/EZPlot.h
type EZPlotTypeBuffer (line 34) | typedef NS_ENUM(NSInteger,EZPlotType){
FILE: Sublime/Pods/EZAudio/EZAudio/EZRecorder.h
type EZRecorderFileTypeAIFF (line 37) | typedef NS_ENUM(NSInteger, EZRecorderFileType)
FILE: Sublime/Pods/EZAudio/EZAudio/TPCircularBuffer.c
function _reportResult (line 35) | static inline bool _reportResult(kern_return_t result, const char *opera...
function TPCircularBufferInit (line 43) | bool TPCircularBufferInit(TPCircularBuffer *buffer, int length) {
function TPCircularBufferCleanup (line 126) | void TPCircularBufferCleanup(TPCircularBuffer *buffer) {
function TPCircularBufferClear (line 131) | void TPCircularBufferClear(TPCircularBuffer *buffer) {
FILE: Sublime/Pods/EZAudio/EZAudio/TPCircularBuffer.h
type TPCircularBuffer (line 53) | typedef struct {
function TPCircularBufferConsume (line 116) | static __inline__ __attribute__((always_inline)) void TPCircularBufferCo...
function TPCircularBufferConsumeNoBarrier (line 125) | static __inline__ __attribute__((always_inline)) void TPCircularBufferCo...
function TPCircularBufferProduce (line 157) | static __inline__ __attribute__((always_inline)) void TPCircularBufferPr...
function TPCircularBufferProduceNoBarrier (line 166) | static __inline__ __attribute__((always_inline)) void TPCircularBufferPr...
function TPCircularBufferProduceBytes (line 182) | static __inline__ __attribute__((always_inline)) bool TPCircularBufferPr...
FILE: Sublime/Pods/NMSSH/NMSSH-iOS/Libraries/include/libssh2/libssh2.h
type libssh2_uint64_t (line 130) | typedef unsigned __int64 libssh2_uint64_t;
type __int64 (line 131) | typedef __int64 libssh2_int64_t;
type SSIZE_T (line 133) | typedef SSIZE_T ssize_t;
type libssh2_uint64_t (line 136) | typedef unsigned long long libssh2_uint64_t;
type libssh2_int64_t (line 137) | typedef long long libssh2_int64_t;
type SOCKET (line 141) | typedef SOCKET libssh2_socket_t;
type libssh2_socket_t (line 144) | typedef int libssh2_socket_t;
type LIBSSH2_USERAUTH_KBDINT_PROMPT (line 189) | typedef struct _LIBSSH2_USERAUTH_KBDINT_PROMPT
type LIBSSH2_USERAUTH_KBDINT_RESPONSE (line 196) | typedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE
type LIBSSH2_SESSION (line 278) | typedef struct _LIBSSH2_SESSION LIBSSH2_SESSION;
type LIBSSH2_CHANNEL (line 279) | typedef struct _LIBSSH2_CHANNEL LIBSSH2_CHANNEL;
type LIBSSH2_LISTENER (line 280) | typedef struct _LIBSSH2_LISTENER LIBSSH2_LISTENER;
type LIBSSH2_KNOWNHOSTS (line 281) | typedef struct _LIBSSH2_KNOWNHOSTS LIBSSH2_KNOWNHOSTS;
type LIBSSH2_AGENT (line 282) | typedef struct _LIBSSH2_AGENT LIBSSH2_AGENT;
type LIBSSH2_POLLFD (line 284) | typedef struct _LIBSSH2_POLLFD {
type stat (line 810) | struct stat
type libssh2_knownhost (line 832) | struct libssh2_knownhost {
type libssh2_knownhost (line 895) | struct libssh2_knownhost
type libssh2_knownhost (line 930) | struct libssh2_knownhost
type libssh2_knownhost (line 960) | struct libssh2_knownhost
type libssh2_knownhost (line 969) | struct libssh2_knownhost
type libssh2_knownhost (line 980) | struct libssh2_knownhost
type libssh2_knownhost (line 1034) | struct libssh2_knownhost
type libssh2_knownhost (line 1066) | struct libssh2_knownhost
type libssh2_knownhost (line 1067) | struct libssh2_knownhost
type libssh2_agent_publickey (line 1071) | struct libssh2_agent_publickey {
type libssh2_agent_publickey (line 1122) | struct libssh2_agent_publickey
type libssh2_agent_publickey (line 1123) | struct libssh2_agent_publickey
type libssh2_agent_publickey (line 1135) | struct libssh2_agent_publickey
FILE: Sublime/Pods/NMSSH/NMSSH-iOS/Libraries/include/libssh2/libssh2_publickey.h
type LIBSSH2_PUBLICKEY (line 51) | typedef struct _LIBSSH2_PUBLICKEY LIBSSH2_PUBLICKEY;
type libssh2_publickey_attribute (line 53) | typedef struct _libssh2_publickey_attribute {
type libssh2_publickey_list (line 61) | typedef struct _libssh2_publickey_list {
FILE: Sublime/Pods/NMSSH/NMSSH-iOS/Libraries/include/libssh2/libssh2_sftp.h
type LIBSSH2_SFTP (line 58) | typedef struct _LIBSSH2_SFTP LIBSSH2_SFTP;
type LIBSSH2_SFTP_HANDLE (line 59) | typedef struct _LIBSSH2_SFTP_HANDLE LIBSSH2_SFTP_HANDLE;
type LIBSSH2_SFTP_ATTRIBUTES (line 60) | typedef struct _LIBSSH2_SFTP_ATTRIBUTES LIBSSH2_SFTP_ATTRIBUTES;
type LIBSSH2_SFTP_STATVFS (line 61) | typedef struct _LIBSSH2_SFTP_STATVFS LIBSSH2_SFTP_STATVFS;
type _LIBSSH2_SFTP_ATTRIBUTES (line 93) | struct _LIBSSH2_SFTP_ATTRIBUTES {
type _LIBSSH2_SFTP_STATVFS (line 105) | struct _LIBSSH2_SFTP_STATVFS {
FILE: Sublime/Pods/NMSSH/NMSSH/NMSSHChannel.h
type NMSSHChannelExecutionError (line 6) | typedef NS_ENUM(NSInteger, NMSSHChannelError) {
type NMSSHChannelPtyTerminalVanilla (line 17) | typedef NS_ENUM(NSInteger, NMSSHChannelPtyTerminal) {
type NMSSHChannelTypeClosed (line 26) | typedef NS_ENUM(NSInteger, NMSSHChannelType) {
FILE: Sublime/Pods/NMSSH/NMSSH/NMSSHSession.h
type NMSSHSessionHashMD5 (line 6) | typedef NS_ENUM(NSInteger, NMSSHSessionHash) {
type NMSSHKnownHostStatusMatch (line 11) | typedef NS_ENUM(NSInteger, NMSSHKnownHostStatus) {
FILE: Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCMessageBubbleTipView.h
type RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_TOP_LEFT (line 14) | typedef NS_ENUM(NSInteger, RCMessageBubbleTipViewAlignment) {
FILE: Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCRealTimeLocationManager.h
type RC_REAL_TIME_LOCATION_STATUS_IDLE (line 16) | typedef NS_ENUM(NSInteger, RCRealTimeLocationStatus) {
type RC_REAL_TIME_LOCATION_NOT_SUPPORT (line 38) | typedef NS_ENUM(NSInteger, RCRealTimeLocationErrorCode) {
FILE: Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/interf_enc.h
type Mode (line 28) | enum Mode {
type Mode (line 44) | enum Mode
FILE: Sublime/Pods/SJCSimplePDFView/SJCSimplePDFView/SJCSimplePDFView.h
type kSJCPDFViewModeContinuous (line 26) | typedef NS_ENUM(NSUInteger, SJCPDFViewMode) {
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/Common.h
type tm_unz (line 5) | typedef struct tm_unz_s
type unz_file_info (line 15) | typedef struct unz_file_info_s
type unz_file_info64 (line 37) | typedef struct unz_file_info64_s
type unz_global_info (line 60) | typedef struct unz_global_info_s
type unz_global_info64 (line 71) | typedef struct unz_global_info64
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/aes.h
type aes_inf (line 71) | typedef union
type aes_encrypt_ctx (line 76) | typedef struct
type aes_decrypt_ctx (line 81) | typedef struct
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/aes_via_ace.h
function INLINE (line 335) | INLINE int has_cpuid(void)
function INLINE (line 351) | INLINE int is_via_cpu(void)
function INLINE (line 370) | INLINE int read_via_flags(void)
function INLINE (line 387) | INLINE int via_rng_in(void *buf)
function INLINE (line 399) | INLINE volatile void via_ecb_op5(
function INLINE (line 413) | INLINE volatile void via_cbc_op6(
function INLINE (line 428) | INLINE volatile void via_cbc_op7(
function INLINE (line 446) | INLINE volatile void via_cfb_op6(
function INLINE (line 461) | INLINE volatile void via_cfb_op7(
function INLINE (line 479) | INLINE volatile void via_ofb_op6(
function INLINE (line 498) | INLINE int via_ace_test(void)
function INLINE (line 506) | INLINE int via_rng_test(void)
function INLINE (line 514) | INLINE int read_via_rng(void *buf, int count)
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/aeskey.c
function AES_RETURN (line 75) | AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx ...
function AES_RETURN (line 123) | AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx ...
function AES_RETURN (line 174) | AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx ...
function AES_RETURN (line 211) | AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_en...
function AES_RETURN (line 312) | AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx ...
function AES_RETURN (line 391) | AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx ...
function AES_RETURN (line 482) | AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx ...
function AES_RETURN (line 531) | AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_de...
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/aestab.c
function AES_RETURN (line 187) | AES_RETURN aes_init(void)
function uint_8t (line 211) | static uint_8t hibit(const uint_32t x)
function uint_8t (line 221) | static uint_8t gf_inv(const uint_8t x)
function uint_8t (line 256) | uint_8t fwd_affine(const uint_8t x)
function uint_8t (line 262) | uint_8t inv_affine(const uint_8t x)
function AES_RETURN (line 270) | AES_RETURN aes_init(void)
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/brg_types.h
type uint_8t (line 55) | typedef unsigned char uint_8t;
type uint_16t (line 64) | typedef unsigned short uint_16t;
type uint_32t (line 74) | typedef unsigned int uint_32t;
type uint_32t (line 77) | typedef unsigned long uint_32t;
type uint_64t (line 89) | typedef unsigned __int64 uint_64t;
type uint_64t (line 93) | typedef unsigned __int64 uint_64t;
type uint_64t (line 97) | typedef unsigned long long uint_64t;
type uint_64t (line 101) | typedef unsigned int long long uint_64t;
type uint_64t (line 106) | typedef unsigned int uint_64t;
type uint_64t (line 112) | typedef unsigned long uint_64t;
type uint_64t (line 118) | typedef unsigned long long uint_64t;
type uint_64t (line 124) | typedef unsigned long long uint_64t;
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/entropy.c
function entropy_fun (line 15) | int entropy_fun(unsigned char buf[], unsigned int len)
function entropy_fun (line 39) | int entropy_fun(unsigned char buf[], unsigned int len)
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/fileenc.c
function encr_data (line 52) | static void encr_data(unsigned char data[], unsigned long d_len, fcrypt_...
function fcrypt_init (line 73) | int fcrypt_init(
function fcrypt_encrypt (line 120) | void fcrypt_encrypt(unsigned char data[], unsigned int data_len, fcrypt_...
function fcrypt_decrypt (line 128) | void fcrypt_decrypt(unsigned char data[], unsigned int data_len, fcrypt_...
function fcrypt_end (line 136) | int fcrypt_end(unsigned char mac[], fcrypt_ctx cx[1])
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/fileenc.h
type fcrypt_ctx (line 84) | typedef struct
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/hmac.c
function hmac_sha_begin (line 44) | void hmac_sha_begin(hmac_ctx cx[1])
function hmac_sha_key (line 50) | int hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_...
function hmac_sha_data (line 74) | void hmac_sha_data(const unsigned char data[], unsigned long data_len, h...
function hmac_sha_end (line 106) | void hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx c...
function hmac_sha (line 132) | void hmac_sha(const unsigned char key[], unsigned long key_len,
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/hmac.h
type hmac_ctx (line 81) | typedef struct
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/prng.c
function prng_mix (line 52) | static void prng_mix(unsigned char buf[])
function update_pool (line 81) | static void update_pool(prng_ctx ctx[1])
function prng_init (line 100) | void prng_init(prng_entropy_fn fun, prng_ctx ctx[1])
function prng_rand (line 122) | void prng_rand(unsigned char data[], unsigned int data_len, prng_ctx ctx...
function prng_end (line 146) | void prng_end(prng_ctx ctx[1])
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/prng.h
type prng_ctx (line 62) | typedef struct
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/pwd2key.c
function derive_key (line 44) | void derive_key(const unsigned char pwd[], /* the PASSWORD */
function main (line 165) | int main()
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/sha1.c
function VOID_RETURN (line 116) | VOID_RETURN sha1_compile(sha1_ctx ctx[1])
function VOID_RETURN (line 172) | VOID_RETURN sha1_begin(sha1_ctx ctx[1])
function VOID_RETURN (line 185) | VOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha...
function VOID_RETURN (line 206) | VOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1])
function VOID_RETURN (line 250) | VOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsig...
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/aes/sha1.h
type sha1_ctx (line 49) | typedef struct
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/minizip/crypt.h
function decrypt_byte (line 34) | static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_...
function update_keys (line 47) | static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32...
function init_keys (line 64) | static void init_keys(const char* passwd,unsigned long* pkeys,const unsi...
function crypthead (line 89) | static int crypthead(const char* passwd, /* password string */
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/minizip/ioapi.c
function voidpf (line 45) | voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*...
function call_zseek64 (line 59) | long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filest...
function ZPOS64_T (line 70) | ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf fi...
function fill_zlib_filefunc64_32_def_from_filefunc32 (line 81) | void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def*...
type FILE_IOPOSIX (line 107) | typedef struct
function voidpf (line 114) | static voidpf file_build_ioposix(FILE *file, const char *filename)
function voidpf (line 127) | static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* file...
function voidpf (line 146) | static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* fi...
function voidpf (line 165) | static voidpf ZCALLBACK fopendisk64_file_func (voidpf opaque, voidpf str...
function voidpf (line 190) | static voidpf ZCALLBACK fopendisk_file_func (voidpf opaque, voidpf strea...
function uLong (line 215) | static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, vo...
function uLong (line 226) | static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, c...
function ftell_file_func (line 237) | static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
function ZPOS64_T (line 248) | static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
function fseek_file_func (line 259) | static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLo...
function fseek64_file_func (line 288) | static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, Z...
function fclose_file_func (line 320) | static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
function ferror_file_func (line 334) | static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
function fill_fopen_filefunc (line 345) | void fill_fopen_filefunc (zlib_filefunc_def* pzlib_filefunc_def)
function fill_fopen64_filefunc (line 358) | void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/minizip/ioapi.h
type IT_INT_CUSTOM_TYPE (line 60) | typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
type ZPOS64_T (line 64) | typedef uint64_t ZPOS64_T;
type ZPOS64_T (line 67) | typedef unsigned __int64 ZPOS64_T;
type ZPOS64_T (line 69) | typedef unsigned long long int ZPOS64_T;
type zlib_filefunc_def (line 108) | typedef struct zlib_filefunc_def_s
type zlib_filefunc64_def (line 126) | typedef struct zlib_filefunc64_def_s
type zlib_filefunc64_32_def (line 143) | typedef struct zlib_filefunc64_32_def_s
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/minizip/mztools.c
function unzRepair (line 31) | extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, byte...
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/minizip/unzip.c
type unz_file_info64_internal (line 97) | typedef struct unz_file_info64_internal_s {
type file_in_zip64_read_info_s (line 108) | typedef struct {
type unz64_s (line 141) | typedef struct {
function local (line 169) | local void unz64local_DosDateToTmuDate(ZPOS64_T ulDosDate, tm_unz *ptm)
function local (line 192) | local int unz64local_getByte(const zlib_filefunc64_32_def *pzlib_filefun...
function local (line 206) | local int unz64local_getShort(const zlib_filefunc64_32_def *pzlib_filefu...
function local (line 226) | local int unz64local_getLong(const zlib_filefunc64_32_def *pzlib_filefun...
function local (line 252) | local int unz64local_getLong64(const zlib_filefunc64_32_def *pzlib_filef...
function local (line 291) | local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def ...
function local (line 350) | local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_de...
function local (line 386) | local unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def *...
function unzFile (line 538) | extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzl...
function unzFile (line 548) | extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def...
function unzFile (line 560) | extern unzFile ZEXPORT unzOpen(const char *path)
function unzFile (line 565) | extern unzFile ZEXPORT unzOpen64(const void *path)
function unzClose (line 570) | extern int ZEXPORT unzClose(unzFile file)
function local (line 593) | local int unzGoToNextDisk(unzFile file)
function unzGetGlobalInfo (line 633) | extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info *pglob...
function unzGetGlobalInfo64 (line 646) | extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *p...
function unzGetGlobalComment (line 656) | extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uLon...
function local (line 682) | local int unz64local_GetCurrentFileInfoInternal(unzFile file, unz_file_i...
function unzGetCurrentFileInfo (line 918) | extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pf...
function unzGetCurrentFileInfo64 (line 952) | extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64...
function local (line 962) | local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s *s, uInt *p...
function unzOpenCurrentFile3 (line 1047) | extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *l...
function unzOpenCurrentFile (line 1238) | extern int ZEXPORT unzOpenCurrentFile(unzFile file)
function unzOpenCurrentFilePassword (line 1243) | extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *...
function unzOpenCurrentFile2 (line 1248) | extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *l...
function unzReadCurrentFile (line 1260) | extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned ...
function ZPOS64_T (line 1485) | extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file)
function unzGetLocalExtrafield (line 1498) | extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsign...
function unzGoToFirstFile2 (line 1593) | extern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfil...
function unzGoToFirstFile (line 1611) | extern int ZEXPORT unzGoToFirstFile(unzFile file)
function unzGoToNextFile2 (line 1616) | extern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile...
function unzGoToNextFile (line 1641) | extern int ZEXPORT unzGoToNextFile(unzFile file)
function unzLocateFile (line 1646) | extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unz...
function unzGetFilePos (line 1690) | extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos *file_pos)
function unzGoToFilePos (line 1701) | extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos *file_pos)
function unzGetFilePos64 (line 1712) | extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos *file_pos)
function unzGoToFilePos64 (line 1728) | extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos *...
function uLong (line 1748) | extern uLong ZEXPORT unzGetOffset(unzFile file)
function ZPOS64_T (line 1758) | extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
function unzSetOffset (line 1773) | extern int ZEXPORT unzSetOffset(unzFile file, uLong pos)
function unzSetOffset64 (line 1778) | extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
function z_off_t (line 1794) | extern z_off_t ZEXPORT unztell(unzFile file)
function ZPOS64_T (line 1807) | extern ZPOS64_T ZEXPORT unztell64(unzFile file)
function unzeof (line 1823) | extern int ZEXPORT unzeof(unzFile file)
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/minizip/unzip.h
type unzFile__ (line 45) | typedef struct TagunzFile__ { int unused; } unzFile__;
type unzFile__ (line 46) | typedef unzFile__ *unzFile;
type voidp (line 48) | typedef voidp unzFile;
type unz_file_pos (line 209) | typedef struct unz_file_pos_s
type unz64_file_pos (line 218) | typedef struct unz64_file_pos_s
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/minizip/zip.c
type linkedlist_datablock_internal (line 110) | typedef struct linkedlist_datablock_internal_s {
type linkedlist_data (line 118) | typedef struct linkedlist_data_s {
type curfile64_info (line 123) | typedef struct {
type zip64_internal (line 161) | typedef struct {
function local (line 183) | local linkedlist_datablock_internal *allocate_new_datablock()
function local (line 199) | local void free_datablock(linkedlist_datablock_internal *ldi)
function local (line 210) | local void init_linkedlist(linkedlist_data *ll)
function local (line 217) | local void free_linkedlist(linkedlist_data *ll)
function local (line 225) | local int add_data_in_datablock(linkedlist_data *ll, const void *buf, uL...
function local (line 274) | local uLong zip64local_TmzDateToDosDate(const tm_zip *ptm)
function local (line 310) | local int zip64local_putValue(const zlib_filefunc64_32_def *pzlib_filefu...
function local (line 333) | local void zip64local_putValue_inmemory(void *dest, ZPOS64_T x, int nbByte)
function local (line 351) | local int zip64local_getByte(const zlib_filefunc64_32_def *pzlib_filefun...
function local (line 365) | local int zip64local_getShort(const zlib_filefunc64_32_def *pzlib_filefu...
function local (line 385) | local int zip64local_getLong(const zlib_filefunc64_32_def *pzlib_filefun...
function local (line 411) | local int zip64local_getLong64(const zlib_filefunc64_32_def *pzlib_filef...
function local (line 451) | local int zipGetDiskSizeAvailable(zipFile file, ZPOS64_T *size_available)
function local (line 465) | local int zipGoToSpecificDisk(zipFile file, int number_disk, int open_ex...
function local (line 489) | local int zipGoToFirstDisk(zipFile file)
function local (line 513) | local int zipGoToNextDisk(zipFile file)
function local (line 547) | local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def ...
function local (line 606) | local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_de...
function zipFile (line 642) | extern zipFile ZEXPORT zipOpen4(const void *pathname, int append, ZPOS64...
function zipFile (line 878) | extern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcha...
function zipFile (line 889) | extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zip...
function zipFile (line 902) | extern zipFile ZEXPORT zipOpen3(const char *pathname, int append, ZPOS64...
function zipFile (line 913) | extern zipFile ZEXPORT zipOpen3_64(const void *pathname, int append, ZPO...
function zipFile (line 926) | extern zipFile ZEXPORT zipOpen(const char *pathname, int append)
function zipFile (line 931) | extern zipFile ZEXPORT zipOpen64(const void *pathname, int append)
function zipOpenNewFileInZip4_64 (line 936) | extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *fil...
function zipOpenNewFileInZip4 (line 1267) | extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char *filena...
function zipOpenNewFileInZip3 (line 1277) | extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filena...
function zipOpenNewFileInZip3_64 (line 1287) | extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *fil...
function zipOpenNewFileInZip2 (line 1297) | extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char *filena...
function zipOpenNewFileInZip2_64 (line 1306) | extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char *fil...
function zipOpenNewFileInZip64 (line 1315) | extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char *filen...
function zipOpenNewFileInZip (line 1324) | extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char *filenam...
function local (line 1335) | local int zip64FlushWriteBuffer(zip64_internal *zi)
function zipWriteInFileInZip (line 1410) | extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, un...
function zipCloseFileInZipRaw (line 1494) | extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed...
function zipCloseFileInZipRaw64 (line 1499) | extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompr...
function zipCloseFileInZip (line 1747) | extern int ZEXPORT zipCloseFileInZip(zipFile file)
function zipClose (line 1752) | extern int ZEXPORT zipClose(zipFile file, const char *global_comment)
FILE: Sublime/Pods/SSZipArchive/SSZipArchive/minizip/zip.h
type zipFile__ (line 41) | typedef struct TagzipFile__ { int unused; } zipFile__;
type zipFile__ (line 42) | typedef zipFile__ *zipFile;
type voidp (line 44) | typedef voidp zipFile;
type tm_zip (line 64) | typedef struct tm_zip_s
type zip_fileinfo (line 74) | typedef struct
FILE: Sublime/Sublime/SDK/Weixin/WXApiObject.h
type WXErrCode (line 14) | enum WXErrCode {
type WXScene (line 28) | enum WXScene {
type WXAPISupport (line 36) | enum WXAPISupport {
type WXBizProfileType (line 45) | enum WXBizProfileType{
type WXMPWebviewType (line 55) | enum WXMPWebviewType {
FILE: Sublime/Sublime/SDK/Weixin/WechatAuthSDK.h
type AuthErrCode (line 12) | enum AuthErrCode {
FILE: Sublime/Sublime/Web/js/index.js
function s (line 2) | function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindo...
function gb (line 2) | function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)...
function hb (line 2) | function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLengt...
function ib (line 2) | function ib(a){return a[u]=!0,a}
function jb (line 2) | function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){re...
function kb (line 2) | function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[...
function lb (line 2) | function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sou...
function mb (line 2) | function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"...
function nb (line 2) | function nb(a){return function(b){var c=b.nodeName.toLowerCase();return(...
function ob (line 2) | function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,...
function pb (line 2) | function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}
function qb (line 2) | function qb(){}
function rb (line 2) | function rb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}
function sb (line 2) | function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.firs...
function tb (line 2) | function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e-...
function ub (line 2) | function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}
function vb (line 2) | function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(...
function wb (line 2) | function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)...
function xb (line 2) | function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.r...
function yb (line 2) | function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var...
function x (line 2) | function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){retur...
function D (line 2) | function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}
function G (line 2) | function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b...
function I (line 2) | function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEven...
function K (line 2) | function K(){Object.defineProperty(this.cache={},0,{get:function(){retur...
function P (line 2) | function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.rep...
function Z (line 3) | function Z(){return!0}
function $ (line 3) | function $(){return!1}
function _ (line 3) | function _(){try{return l.activeElement}catch(a){}}
function jb (line 3) | function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeTyp...
function kb (line 3) | function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}
function lb (line 3) | function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttrib...
function mb (line 3) | function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",...
function nb (line 3) | function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&...
function ob (line 3) | function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||...
function pb (line 3) | function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.ty...
function sb (line 3) | function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getD...
function tb (line 3) | function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(...
function xb (line 3) | function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPr...
function yb (line 3) | function yb(a,b){return{get:function(){return a()?void delete this.get:(...
function g (line 3) | function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-siz...
function Fb (line 3) | function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),...
function Gb (line 3) | function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[...
function Hb (line 3) | function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===...
function Ib (line 3) | function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f...
function Jb (line 3) | function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.styl...
function Kb (line 3) | function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}
function Sb (line 3) | function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}
function Tb (line 3) | function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e[...
function Ub (line 3) | function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.lengt...
function Vb (line 3) | function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeTyp...
function Wb (line 3) | function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a...
function Xb (line 3) | function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(functio...
function qc (line 4) | function qc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var ...
function rc (line 4) | function rc(a,b,c,d){var e={},f=a===mc;function g(h){var i;return e[h]=!...
function sc (line 4) | function sc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)voi...
function tc (line 4) | function tc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[...
function uc (line 4) | function uc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])fo...
function x (line 4) | function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=v...
function Ac (line 4) | function Ac(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wc....
function Jc (line 4) | function Jc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}
Condensed preview — 763 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,611K chars).
[
{
"path": ".gitignore",
"chars": 1378,
"preview": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n"
},
{
"path": "LICENSE",
"chars": 35141,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 1999,
"preview": "# SublimeCode [ 2009-2013 Jay Freeman (saurik)\n*/\n\n/* GNU General "
},
{
"path": "Sublime/Podfile",
"chars": 362,
"preview": "source 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '8.0'\nuse_frameworks!\n\npod 'Alamofire', '~> 3.0'\npod 'CYR"
},
{
"path": "Sublime/Pods/AASquaresLoading/LICENSE",
"chars": 1080,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Anas AIT ALI\n\nPermission is hereby granted, free of charge, to any person obta"
},
{
"path": "Sublime/Pods/AASquaresLoading/README.md",
"chars": 2469,
"preview": "# AASquaresLoading\nSimple loading animation using squares\n\n\n\n## Example\n```swift\nlet loadin"
},
{
"path": "Sublime/Pods/AASquaresLoading/Source/AASquaresLoading.swift",
"chars": 9138,
"preview": "//\n// AASquaresLoading.swift\n// Etix Mobile\n//\n// Created by Anas Ait Ali on 18/02/15.\n// Copyright (c) 2015 Etix. A"
},
{
"path": "Sublime/Pods/Alamofire/LICENSE",
"chars": 1102,
"preview": "Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n\nPermission is hereby granted, free of cha"
},
{
"path": "Sublime/Pods/Alamofire/README.md",
"chars": 46982,
"preview": "\n\n["
},
{
"path": "Sublime/Pods/Alamofire/Source/Alamofire.swift",
"chars": 12333,
"preview": "// Alamofire.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission "
},
{
"path": "Sublime/Pods/Alamofire/Source/Download.swift",
"chars": 10008,
"preview": "// Download.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission i"
},
{
"path": "Sublime/Pods/Alamofire/Source/Error.swift",
"chars": 2883,
"preview": "// Error.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission is h"
},
{
"path": "Sublime/Pods/Alamofire/Source/Manager.swift",
"chars": 34217,
"preview": "// Manager.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission is"
},
{
"path": "Sublime/Pods/Alamofire/Source/MultipartFormData.swift",
"chars": 26889,
"preview": "// MultipartFormData.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Per"
},
{
"path": "Sublime/Pods/Alamofire/Source/NetworkReachabilityManager.swift",
"chars": 8723,
"preview": "// NetworkReachabilityManager.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n"
},
{
"path": "Sublime/Pods/Alamofire/Source/Notifications.swift",
"chars": 2411,
"preview": "// Notifications.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permiss"
},
{
"path": "Sublime/Pods/Alamofire/Source/ParameterEncoding.swift",
"chars": 11101,
"preview": "// ParameterEncoding.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Per"
},
{
"path": "Sublime/Pods/Alamofire/Source/Request.swift",
"chars": 20127,
"preview": "// Request.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission is"
},
{
"path": "Sublime/Pods/Alamofire/Source/Response.swift",
"chars": 3797,
"preview": "// Response.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission i"
},
{
"path": "Sublime/Pods/Alamofire/Source/ResponseSerialization.swift",
"chars": 14179,
"preview": "// ResponseSerialization.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n//"
},
{
"path": "Sublime/Pods/Alamofire/Source/Result.swift",
"chars": 3538,
"preview": "// Result.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission is "
},
{
"path": "Sublime/Pods/Alamofire/Source/ServerTrustPolicy.swift",
"chars": 13047,
"preview": "// ServerTrustPolicy.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Per"
},
{
"path": "Sublime/Pods/Alamofire/Source/Stream.swift",
"chars": 6589,
"preview": "// Stream.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission is "
},
{
"path": "Sublime/Pods/Alamofire/Source/Timeline.swift",
"chars": 5815,
"preview": "// Timeline.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission i"
},
{
"path": "Sublime/Pods/Alamofire/Source/Upload.swift",
"chars": 15954,
"preview": "// Upload.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission is "
},
{
"path": "Sublime/Pods/Alamofire/Source/Validation.swift",
"chars": 7103,
"preview": "// Validation.swift\n//\n// Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n// Permission"
},
{
"path": "Sublime/Pods/AlamofireRSSParser/LICENSE",
"chars": 1080,
"preview": "Copyright (c) 2016 Don Angelillo <dangelillo@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "Sublime/Pods/AlamofireRSSParser/Pod/Classes/AlamofireRSSParser.h",
"chars": 567,
"preview": "//\n// AlamofireRSSParser.h\n// AlamofireRSSParser\n//\n// Created by Donald Angelillo on 3/1/16.\n// Copyright © 2016 Do"
},
{
"path": "Sublime/Pods/AlamofireRSSParser/Pod/Classes/AlamofireRSSParser.swift",
"chars": 11145,
"preview": "//\n// AlamofireRSSParser.swift\n// Pods\n//\n// Created by Donald Angelillo on 3/2/16.\n//\n//\n\nimport Foundation\nimport A"
},
{
"path": "Sublime/Pods/AlamofireRSSParser/Pod/Classes/RSSFeed.swift",
"chars": 1390,
"preview": "//\n// RSSFeed.swift\n// AlamofireRSSParser\n//\n// Created by Donald Angelillo on 3/1/16.\n// Copyright © 2016 Donald An"
},
{
"path": "Sublime/Pods/AlamofireRSSParser/Pod/Classes/RSSItem.swift",
"chars": 2682,
"preview": "//\n// RSSItem.swift\n// AlamofireRSSParser\n//\n// Created by Donald Angelillo on 3/1/16.\n// Copyright © 2016 Donald An"
},
{
"path": "Sublime/Pods/AlamofireRSSParser/README.md",
"chars": 3251,
"preview": "# AlamofireRSSParser\n\n[](htt"
},
{
"path": "Sublime/Pods/CYRTextView/CYRTextView/CYRLayoutManager.h",
"chars": 1898,
"preview": "//\n// CYRLayoutManager.h\n//\n// Version 0.4.0\n//\n// Created by Illya Busigin on 01/05/2014.\n// Copyright (c) 2014 Cyr"
},
{
"path": "Sublime/Pods/CYRTextView/CYRTextView/CYRLayoutManager.m",
"chars": 10335,
"preview": "//\n// CYRLayoutManager.h\n//\n// Version 0.4.0\n//\n// Created by Illya Busigin on 01/05/2014.\n// Copyright (c) 2014 Cyr"
},
{
"path": "Sublime/Pods/CYRTextView/CYRTextView/CYRTextStorage.h",
"chars": 1646,
"preview": "//\n// CYRTextStorage.h\n//\n// Version 0.4.0\n//\n// Created by Illya Busigin on 01/05/2014.\n// Copyright (c) 2014 Cyril"
},
{
"path": "Sublime/Pods/CYRTextView/CYRTextView/CYRTextStorage.m",
"chars": 5838,
"preview": "//\n// CYRTextStorage.m\n//\n// Version 0.4.0\n//\n// Created by Illya Busigin on 01/05/2014.\n// Copyright (c) 2014 Cyril"
},
{
"path": "Sublime/Pods/CYRTextView/CYRTextView/CYRTextView.h",
"chars": 1962,
"preview": "//\n// CYRTextView.h\n//\n// Version 0.4.0\n//\n// Created by Illya Busigin on 01/05/2014.\n// Copyright (c) 2014 Cyrillia"
},
{
"path": "Sublime/Pods/CYRTextView/CYRTextView/CYRTextView.m",
"chars": 10851,
"preview": "//\n// CYRTextView.m\n//\n// Version 0.4.0\n//\n// Created by Illya Busigin on 01/05/2014.\n// Copyright (c) 2014 Cyrillia"
},
{
"path": "Sublime/Pods/CYRTextView/CYRTextView/CYRToken.h",
"chars": 1750,
"preview": "//\n// CYRTextAttribute.h\n//\n// Version 0.4.0\n//\n// Created by Illya Busigin on 01/05/2014.\n// Copyright (c) 2014 Cyr"
},
{
"path": "Sublime/Pods/CYRTextView/CYRTextView/CYRToken.m",
"chars": 1778,
"preview": "//\n// CYRTextAttribute.m\n//\n// Version 0.4.0\n//\n// Created by Illya Busigin on 01/05/2014.\n// Copyright (c) 2014 Cyr"
},
{
"path": "Sublime/Pods/CYRTextView/LICENSE",
"chars": 1082,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Cyrillian, Inc.\n\nPermission is hereby granted, free of charge, to any person o"
},
{
"path": "Sublime/Pods/CYRTextView/README.md",
"chars": 2864,
"preview": "# CYRTextView\n\nby **Illya Busigin**\n\n- Visit my blog at [http://illyabusigin.com/](http://illyabusigin.com/)\n- Follow [@"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Animation/ChartAnimationEasing.swift",
"chars": 13754,
"preview": "//\n// ChartAnimationUtils.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Animation/ChartAnimator.swift",
"chars": 13253,
"preview": "//\n// ChartAnimator.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 2015 Daniel Cohen"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/BarChartView.swift",
"chars": 5806,
"preview": "//\n// BarChartView.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel Cohen "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/BarLineChartViewBase.swift",
"chars": 69996,
"preview": "//\n// BarLineChartViewBase.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Danie"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/BubbleChartView.swift",
"chars": 1671,
"preview": "//\n// BubbleChartView.swift\n// Charts\n//\n// Bubble chart implementation:\n// Copyright 2015 Pierre-Marc Airoldi\n// "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/CandleStickChartView.swift",
"chars": 1032,
"preview": "//\n// CandleStickChartView.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Danie"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/ChartViewBase.swift",
"chars": 35988,
"preview": "//\n// ChartViewBase.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Coh"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/CombinedChartView.swift",
"chars": 6981,
"preview": "//\n// CombinedChartView.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/HorizontalBarChartView.swift",
"chars": 8169,
"preview": "//\n// HorizontalBarChartView.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Dan"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/LineChartView.swift",
"chars": 1012,
"preview": "//\n// LineChartView.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel Cohen"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/PieChartView.swift",
"chars": 16205,
"preview": "//\n// PieChartView.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel Cohen "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/PieRadarChartViewBase.swift",
"chars": 31017,
"preview": "//\n// PieRadarChartViewBase.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/RadarChartView.swift",
"chars": 7205,
"preview": "//\n// RadarChartView.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel Cohe"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Charts/ScatterChartView.swift",
"chars": 1213,
"preview": "//\n// ScatterChartView.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel Co"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartAxisBase.swift",
"chars": 5241,
"preview": "//\n// ChartAxisBase.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Coh"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartComponentBase.swift",
"chars": 951,
"preview": "//\n// ChartComponentBase.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 16/3/15.\n//\n// Copyright 2015 Daniel"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartLegend.swift",
"chars": 17184,
"preview": "//\n// ChartLegend.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 24/2/15.\n\n//\n// Copyright 2015 Daniel Cohen"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartLimitLine.swift",
"chars": 2068,
"preview": "//\n// ChartLimitLine.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Co"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartMarker.swift",
"chars": 2152,
"preview": "//\n// ChartMarker.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 2015 Daniel Cohen G"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartXAxis.swift",
"chars": 5830,
"preview": "//\n// ChartXAxis.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Cohen "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartYAxis.swift",
"chars": 9195,
"preview": "//\n// ChartYAxis.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Cohen "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/ChartBaseDataSet.swift",
"chars": 9449,
"preview": "//\n// BaseDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 16/1/15.\n\n//\n// Copyright 2015 Daniel Cohen"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarChartData.swift",
"chars": 1292,
"preview": "//\n// BarChartData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel Cohen"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarChartDataEntry.swift",
"chars": 3969,
"preview": "//\n// BarChartDataEntry.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarChartDataSet.swift",
"chars": 5624,
"preview": "//\n// BarChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel Coh"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift",
"chars": 723,
"preview": "//\n// BarLineScatterCandleBubbleChartData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copy"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift",
"chars": 1258,
"preview": "//\n// BarLineScatterCandleBubbleChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BubbleChartData.swift",
"chars": 988,
"preview": "//\n// BubbleChartData.swift\n// Charts\n//\n// Bubble chart implementation:\n// Copyright 2015 Pierre-Marc Airoldi\n// "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BubbleChartDataEntry.swift",
"chars": 1385,
"preview": "//\n// BubbleDataEntry.swift\n// Charts\n//\n// Bubble chart implementation: \n// Copyright 2015 Pierre-Marc Airoldi\n//"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BubbleChartDataSet.swift",
"chars": 3209,
"preview": "//\n// BubbleChartDataSet.swift\n// Charts\n//\n// Bubble chart implementation:\n// Copyright 2015 Pierre-Marc Airoldi\n"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/CandleChartData.swift",
"chars": 709,
"preview": "//\n// CandleChartData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel Co"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/CandleChartDataEntry.swift",
"chars": 2167,
"preview": "//\n// CandleChartDataEntry.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Danie"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/CandleChartDataSet.swift",
"chars": 3643,
"preview": "//\n// CandleChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ChartData.swift",
"chars": 24743,
"preview": "//\n// ChartData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Cohen G"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ChartDataEntry.swift",
"chars": 2524,
"preview": "//\n// ChartDataEntry.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Co"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ChartDataSet.swift",
"chars": 12636,
"preview": "//\n// ChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Cohe"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/CombinedChartData.swift",
"chars": 4723,
"preview": "//\n// CombinedChartData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/LineChartData.swift",
"chars": 751,
"preview": "//\n// LineChartData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel Cohe"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/LineChartDataSet.swift",
"chars": 5282,
"preview": "//\n// LineChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/LineRadarChartDataSet.swift",
"chars": 2565,
"preview": "//\n// LineRadarChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Dan"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift",
"chars": 1964,
"preview": "//\n// LineScatterCandleRadarChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 29/7/15.\n//\n// Copyr"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/PieChartData.swift",
"chars": 2892,
"preview": "//\n// PieData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 24/2/15.\n//\n// Copyright 2015 Daniel Cohen Gind"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/PieChartDataSet.swift",
"chars": 1738,
"preview": "//\n// PieChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 24/2/15.\n\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/RadarChartData.swift",
"chars": 972,
"preview": "//\n// RadarChartData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel Coh"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/RadarChartDataSet.swift",
"chars": 1629,
"preview": "//\n// RadarChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 24/2/15.\n\n//\n// Copyright 2015 Daniel"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ScatterChartData.swift",
"chars": 1453,
"preview": "//\n// ScatterChartData.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ScatterChartDataSet.swift",
"chars": 1690,
"preview": "//\n// ScatterChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Danie"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IBarChartDataSet.swift",
"chars": 1403,
"preview": "//\n// IBarChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift",
"chars": 723,
"preview": "//\n// IBarLineScatterCandleBubbleChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IBubbleChartDataSet.swift",
"chars": 737,
"preview": "//\n// IBubbleChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Danie"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/ICandleChartDataSet.swift",
"chars": 1875,
"preview": "//\n// ICandleChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Danie"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IChartDataSet.swift",
"chars": 7783,
"preview": "//\n// IChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel Cohe"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/ILineChartDataSet.swift",
"chars": 2933,
"preview": "//\n// ILineChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/ILineRadarChartDataSet.swift",
"chars": 1457,
"preview": "//\n// ILineRadarChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Da"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift",
"chars": 1311,
"preview": "//\n// ILineScatterCandleRadarChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copy"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IPieChartDataSet.swift",
"chars": 706,
"preview": "//\n// IPieChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IRadarChartDataSet.swift",
"chars": 1118,
"preview": "//\n// IRadarChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Daniel"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IScatterChartDataSet.swift",
"chars": 1302,
"preview": "//\n// IScatterChartDataSet.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/2/15.\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Filters/ChartDataApproximatorFilter.swift",
"chars": 7322,
"preview": "//\n// ChartDataApproximator.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Da"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Filters/ChartDataBaseFilter.swift",
"chars": 558,
"preview": "//\n// ChartDataFilter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Formatters/ChartDefaultFillFormatter.swift",
"chars": 1547,
"preview": "//\n// ChartDefaultFillFormatter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 04/02/2016.\n//\n// Copyright 2"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Formatters/ChartDefaultXAxisValueFormatter.swift",
"chars": 645,
"preview": "//\n// ChartDefaultXAxisValueFormatter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyrigh"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Formatters/ChartFillFormatter.swift",
"chars": 739,
"preview": "//\n// ChartFillFormatter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 6/3/15.\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Formatters/ChartXAxisValueFormatter.swift",
"chars": 971,
"preview": "//\n// ChartXAxisValueFormatter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyright 2015 "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Highlight/BarChartHighlighter.swift",
"chars": 6919,
"preview": "//\n// ChartBarHighlighter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Highlight/ChartHighlight.swift",
"chars": 3414,
"preview": "//\n// ChartHighlight.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Co"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Highlight/ChartHighlighter.swift",
"chars": 3655,
"preview": "//\n// ChartHighlighter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Highlight/ChartRange.swift",
"chars": 1034,
"preview": "//\n// ChartRange.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n// Copyright 2015 Daniel Cohen "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Highlight/CombinedHighlighter.swift",
"chars": 2038,
"preview": "//\n// CombinedHighlighter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Highlight/HorizontalBarChartHighlighter.swift",
"chars": 3610,
"preview": "//\n// HorizontalBarChartHighlighter.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n// Copyright"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/BarChartDataProvider.swift",
"chars": 598,
"preview": "//\n// BarChartDataProvider.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift",
"chars": 699,
"preview": "//\n// BarLineScatterCandleBubbleChartDataProvider.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/BubbleChartDataProvider.swift",
"chars": 461,
"preview": "//\n// BubbleChartDataProvider.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyright 2015 D"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/CandleChartDataProvider.swift",
"chars": 461,
"preview": "//\n// CandleChartDataProvider.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyright 2015 D"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/ChartDataProvider.swift",
"chars": 980,
"preview": "//\n// ChartDataProvider.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/LineChartDataProvider.swift",
"chars": 522,
"preview": "//\n// LineChartDataProvider.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyright 2015 Dan"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/ScatterChartDataProvider.swift",
"chars": 465,
"preview": "//\n// ScatterChartDataProvider.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyright 2015 "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Jobs/AnimatedMoveViewJob.swift",
"chars": 1486,
"preview": "//\n// AnimatedMoveChartViewJob.swift\n// Charts\n//\n// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n// A port of"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Jobs/AnimatedViewPortJob.swift",
"chars": 3463,
"preview": "//\n// AnimatedViewPortJob.swift\n// Charts\n//\n// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n// A port of MPAn"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Jobs/AnimatedZoomViewJob.swift",
"chars": 2970,
"preview": "//\n// AnimatedZoomChartViewJob.swift\n// Charts\n//\n// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n// A port of"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Jobs/ChartViewPortJob.swift",
"chars": 1103,
"preview": "//\n// ChartViewPortJob.swift\n// Charts\n//\n// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n// A port of MPAndro"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Jobs/MoveChartViewJob.swift",
"chars": 1159,
"preview": "//\n// MoveChartViewJob.swift\n// Charts\n//\n// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n// A port of MPAndro"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Jobs/ZoomChartViewJob.swift",
"chars": 2129,
"preview": "//\n// ZoomChartViewJob.swift\n// Charts\n//\n// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n// A port of MPAndro"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/BarChartRenderer.swift",
"chars": 23528,
"preview": "//\n// BarChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel Co"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/BubbleChartRenderer.swift",
"chars": 11518,
"preview": "//\n// BubbleChartRenderer.swift\n// Charts\n//\n// Bubble chart implementation:\n// Copyright 2015 Pierre-Marc Airoldi"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/CandleStickChartRenderer.swift",
"chars": 14113,
"preview": "//\n// CandleStickChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 D"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartAxisRendererBase.swift",
"chars": 1561,
"preview": "//\n// ChartAxisRendererBase.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartDataRendererBase.swift",
"chars": 1380,
"preview": "//\n// ChartDataRendererBase.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartLegendRenderer.swift",
"chars": 15542,
"preview": "//\n// ChartLegendRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartRendererBase.swift",
"chars": 1454,
"preview": "//\n// ChartRendererBase.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartXAxisRenderer.swift",
"chars": 14718,
"preview": "//\n// ChartXAxisRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartXAxisRendererBarChart.swift",
"chars": 5892,
"preview": "//\n// ChartXAxisRendererBarChart.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 2015"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartXAxisRendererHorizontalBarChart.swift",
"chars": 13240,
"preview": "//\n// ChartXAxisRendererHorizontalBarChart.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copy"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartXAxisRendererRadarChart.swift",
"chars": 2985,
"preview": "//\n// ChartXAxisRendererRadarChart.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 20"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartYAxisRenderer.swift",
"chars": 17274,
"preview": "//\n// ChartYAxisRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartYAxisRendererHorizontalBarChart.swift",
"chars": 12090,
"preview": "//\n// ChartYAxisRendererHorizontalBarChart.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copy"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartYAxisRendererRadarChart.swift",
"chars": 7905,
"preview": "//\n// ChartYAxisRendererRadarChart.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 3/3/15.\n//\n// Copyright 20"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/CombinedChartRenderer.swift",
"chars": 5737,
"preview": "//\n// CombinedChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/HorizontalBarChartRenderer.swift",
"chars": 20043,
"preview": "//\n// HorizontalBarChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/LineChartRenderer.swift",
"chars": 26908,
"preview": "//\n// LineChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel C"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/LineRadarChartRenderer.swift",
"chars": 1723,
"preview": "//\n// LineRadarChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/01/2016.\n//\n// Copyright 2015"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/LineScatterCandleRadarChartRenderer.swift",
"chars": 1613,
"preview": "//\n// LineScatterCandleRadarChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 29/7/15.\n//\n// Copy"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/PieChartRenderer.swift",
"chars": 27872,
"preview": "//\n// PieChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel Co"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/RadarChartRenderer.swift",
"chars": 13704,
"preview": "//\n// RadarChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Daniel "
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ScatterChartRenderer.swift",
"chars": 16066,
"preview": "//\n// ScatterChartRenderer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 4/3/15.\n//\n// Copyright 2015 Danie"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartColorTemplates.swift",
"chars": 7604,
"preview": "//\n// ChartColorTemplates.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartFill.swift",
"chars": 8757,
"preview": "//\n// ChartFill.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/01/2016.\n\n//\n// Copyright 2015 Daniel Cohe"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartPlatform.swift",
"chars": 15844,
"preview": "import Foundation\n\n/** This file provides a thin abstraction layer atop of UIKit (iOS, tvOS) and Cocoa (OS X). The two A"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartSelectionDetail.swift",
"chars": 2037,
"preview": "//\n// ChartSelectionDetail.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Dan"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartTransformer.swift",
"chars": 7067,
"preview": "//\n// ChartTransformer.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 6/3/15.\n//\n// Copyright 2015 Daniel Co"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartTransformerHorizontalBarChart.swift",
"chars": 1050,
"preview": "//\n// ChartTransformerHorizontalBarChart.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 1/4/15.\n//\n// Copyri"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartUtils.swift",
"chars": 12170,
"preview": "//\n// Utils.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n// Copyright 2015 Daniel Cohen Gindi"
},
{
"path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartViewPortHandler.swift",
"chars": 15362,
"preview": "//\n// ChartViewPortHandler.swift\n// Charts\n//\n// Created by Daniel Cohen Gindi on 27/2/15.\n//\n// Copyright 2015 Dani"
},
{
"path": "Sublime/Pods/Charts/LICENSE",
"chars": 11325,
"preview": "Apache License\n Version 2.0, January 2004\n http://www.apache.org/licens"
},
{
"path": "Sublime/Pods/Charts/README.md",
"chars": 10447,
"preview": "**Version 2.2.4**, synced to [MPAndroidChart #2e41714](https://github.com/PhilJay/MPAndroidChart/commit/2e41714)\n\n\n\n#EZAudio\nA simple, int"
},
{
"path": "Sublime/Pods/Gifu/Carthage/Checkouts/Runes/Source/Runes.swift",
"chars": 1136,
"preview": "/**\nmap a function over a value with context\n\nExpected function type: `(a -> b) -> f a -> f b`\n\n*/\ninfix operator <^> {\n"
},
{
"path": "Sublime/Pods/Gifu/LICENSE",
"chars": 1181,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Kaishin & Co.\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "Sublime/Pods/Gifu/README.md",
"chars": 2590,
"preview": "# \n\nAdds performant animated GIF support to UIKit. If you're looking for the Japanese pre"
},
{
"path": "Sublime/Pods/Gifu/Source/AnimatableImageView.swift",
"chars": 3060,
"preview": "import UIKit\n\n/// A subclass of `UIImageView` that can be animated using an image name string or raw data.\npublic class "
},
{
"path": "Sublime/Pods/Gifu/Source/AnimatedFrame.swift",
"chars": 256,
"preview": "/// Keeps a reference to an `UIImage` instance and its duration as a GIF frame.\nstruct AnimatedFrame {\n let image: UIIm"
},
{
"path": "Sublime/Pods/Gifu/Source/Animator.swift",
"chars": 4221,
"preview": "import UIKit\nimport ImageIO\n\n/// Responsible for storing and updating the frames of a `AnimatableImageView` instance via"
},
{
"path": "Sublime/Pods/Gifu/Source/ArrayExtension.swift",
"chars": 117,
"preview": "extension Array {\n subscript(safe index: Int) -> Element? {\n return indices ~= index ? self[index] : .None\n }\n}\n"
},
{
"path": "Sublime/Pods/Gifu/Source/CGSizeExtension.swift",
"chars": 1358,
"preview": "extension CGSize {\n /// Calculates the aspect ratio of the size.\n ///\n /// - returns: aspectRatio The aspect ratio of"
},
{
"path": "Sublime/Pods/Gifu/Source/FunctionalHelpers.swift",
"chars": 371,
"preview": "func <^> <T, U>(@noescape f: T -> U, a: T?) -> U? {\n return a.map(f)\n}\nfunc <*> <T, U>(f: (T -> U)?, a: T?) -> U? {\n r"
}
]
// ... and 563 more files (download for full content)
About this extraction
This page contains the full source code of the Urinx/SublimeCode GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 763 files (87.4 MB), approximately 1.1M tokens, and a symbol index with 337 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.