Full Code of appwoodpecker/woodpecker-ios for AI

master ddcafd89d7cf cached
145 files
374.8 KB
107.0k tokens
16 symbols
1 requests
Download .txt
Showing preview only (419K chars total). Download the full file or copy to clipboard to get everything.
Repository: appwoodpecker/woodpecker-ios
Branch: master
Commit: ddcafd89d7cf
Files: 145
Total size: 374.8 KB

Directory structure:
gitextract_e3o85i2l/

├── .gitignore
├── LICENSE
├── Package.swift
├── README.md
├── WoodPeckerDemo/
│   ├── WoodPeckerDemo/
│   │   ├── AppDelegate.h
│   │   ├── AppDelegate.m
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── LaunchScreen.storyboard
│   │   ├── Info.plist
│   │   ├── Modules/
│   │   │   ├── Console/
│   │   │   │   ├── ConsoleViewController.h
│   │   │   │   ├── ConsoleViewController.m
│   │   │   │   └── ConsoleViewController.xib
│   │   │   ├── Controller/
│   │   │   │   ├── ControllerHierarchyViewController.h
│   │   │   │   ├── ControllerHierarchyViewController.m
│   │   │   │   └── ControllerHierarchyViewController.xib
│   │   │   ├── Device/
│   │   │   │   ├── DeviceInfoViewController.h
│   │   │   │   ├── DeviceInfoViewController.m
│   │   │   │   └── DeviceInfoViewController.xib
│   │   │   ├── IO/
│   │   │   │   ├── EchoService.h
│   │   │   │   ├── EchoService.m
│   │   │   │   ├── IOViewController.h
│   │   │   │   ├── IOViewController.m
│   │   │   │   └── IOViewController.xib
│   │   │   ├── Network/
│   │   │   │   ├── NetworkViewController.h
│   │   │   │   ├── NetworkViewController.m
│   │   │   │   └── NetworkViewController.xib
│   │   │   ├── Notification/
│   │   │   │   ├── NotificationViewController.h
│   │   │   │   ├── NotificationViewController.m
│   │   │   │   └── NotificationViewController.xib
│   │   │   ├── Sandbox/
│   │   │   │   ├── SandBoxViewController.h
│   │   │   │   ├── SandBoxViewController.m
│   │   │   │   └── SandBoxViewController.xib
│   │   │   └── UserDefaults/
│   │   │       ├── UserDefaultsViewController.h
│   │   │       ├── UserDefaultsViewController.m
│   │   │       └── UserDefaultsViewController.xib
│   │   ├── Structure/
│   │   │   ├── IndexViewController.h
│   │   │   ├── IndexViewController.m
│   │   │   └── IndexViewController.xib
│   │   ├── images.xcassets/
│   │   │   ├── Contents.json
│   │   │   ├── tool_device.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_io.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_network.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_notification.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_sandbox.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_userdefaults.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── tool_webconsole.imageset/
│   │   │       └── Contents.json
│   │   └── main.m
│   └── WoodPeckerDemo.xcodeproj/
│       ├── project.pbxproj
│       └── project.xcworkspace/
│           ├── contents.xcworkspacedata
│           └── xcshareddata/
│               └── IDEWorkspaceChecks.plist
├── WoodPeckerSwiftDemo/
│   ├── WoodPeckerSwiftDemo/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── LaunchScreen.storyboard
│   │   ├── Info.plist
│   │   ├── Modules/
│   │   │   ├── IO/
│   │   │   │   ├── EchoService.swift
│   │   │   │   ├── IOViewController.swift
│   │   │   │   └── IOViewController.xib
│   │   │   ├── Network/
│   │   │   │   ├── NetworkViewController.swift
│   │   │   │   └── NetworkViewController.xib
│   │   │   └── SandBox/
│   │   │       ├── SandBoxViewController.swift
│   │   │       ├── SandboxViewController.temp_caseinsensitive_rename.swift
│   │   │       ├── SandboxViewController.temp_caseinsensitive_rename.xib
│   │   │       └── SandboxViewController.xib
│   │   ├── Structure/
│   │   │   ├── IndexViewController.swift
│   │   │   └── IndexViewController.xib
│   │   ├── WoodPeckerSwiftDemo-Bridging-Header.h
│   │   └── images.xcassets/
│   │       ├── Contents.json
│   │       ├── tool_io.imageset/
│   │       │   └── Contents.json
│   │       ├── tool_network.imageset/
│   │       │   └── Contents.json
│   │       ├── tool_sandbox.imageset/
│   │       │   └── Contents.json
│   │       └── tool_webconsole.imageset/
│   │           └── Contents.json
│   └── WoodPeckerSwiftDemo.xcodeproj/
│       ├── project.pbxproj
│       └── project.xcworkspace/
│           ├── contents.xcworkspacedata
│           └── xcshareddata/
│               └── IDEWorkspaceChecks.plist
├── WoodPeckeriOS-Carthage.json
├── WoodPeckeriOS.podspec
├── WoodPeckeriOS.xcframework/
│   ├── Info.plist
│   ├── ios-arm64/
│   │   └── WoodPeckeriOS.framework/
│   │       ├── ADHConnectViewController.nib
│   │       ├── ADHRemoteServiceCell.nib
│   │       ├── Headers/
│   │       │   ├── ADHLogger.h
│   │       │   ├── ADHOrganizer.h
│   │       │   ├── ADHRequest.h
│   │       │   ├── ADHService.h
│   │       │   └── WoodPeckeriOS.h
│   │       ├── Info.plist
│   │       ├── Modules/
│   │       │   └── module.modulemap
│   │       ├── WoodPeckeriOS
│   │       ├── _CodeSignature/
│   │       │   └── CodeResources
│   │       └── adhwebdebugger.bundle/
│   │           └── mock.js
│   └── ios-arm64_x86_64-simulator/
│       └── WoodPeckeriOS.framework/
│           ├── ADHConnectViewController.nib
│           ├── ADHRemoteServiceCell.nib
│           ├── Headers/
│           │   ├── ADHLogger.h
│           │   ├── ADHOrganizer.h
│           │   ├── ADHRequest.h
│           │   ├── ADHService.h
│           │   └── WoodPeckeriOS.h
│           ├── Info.plist
│           ├── Modules/
│           │   └── module.modulemap
│           ├── WoodPeckeriOS
│           ├── _CodeSignature/
│           │   └── CodeResources
│           └── adhwebdebugger.bundle/
│               └── mock.js
├── WoodpeckerMacDemo/
│   ├── WoodpeckerMacDemo/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── Contents.json
│   │   │   ├── tool_bundle.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_localization.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_network.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_notification.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_sandbox.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── tool_userdefaults.imageset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── MainMenu.xib
│   │   ├── Info.plist
│   │   ├── Pages/
│   │   │   ├── Bundle/
│   │   │   │   ├── BundleViewController.swift
│   │   │   │   └── BundleViewController.xib
│   │   │   ├── Localization/
│   │   │   │   ├── LocalizationViewController.swift
│   │   │   │   └── LocalizationViewController.xib
│   │   │   ├── NetworkViewController.swift
│   │   │   ├── NetworkViewController.xib
│   │   │   ├── Notification/
│   │   │   │   ├── NotificationViewController.swift
│   │   │   │   └── NotificationViewController.xib
│   │   │   ├── Sandbox/
│   │   │   │   ├── SandboxViewController.swift
│   │   │   │   └── SandboxViewController.xib
│   │   │   └── UserDefaults/
│   │   │       ├── UserDefaultsViewController.swift
│   │   │       └── UserDefaultsViewController.xib
│   │   ├── WoodpeckerMacDemo.entitlements
│   │   ├── de.lproj/
│   │   │   └── Localizable.strings
│   │   ├── en.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── MainMenu.xib
│   │   ├── fr.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── MainMenu.strings
│   │   └── zh-Hans.lproj/
│   │       ├── Localizable.strings
│   │       └── MainMenu.strings
│   └── WoodpeckerMacDemo.xcodeproj/
│       ├── project.pbxproj
│       └── project.xcworkspace/
│           ├── contents.xcworkspacedata
│           └── xcshareddata/
│               └── IDEWorkspaceChecks.plist
├── WoodpeckerMacOS-Carthage.json
├── WoodpeckerMacOS.framework/
│   └── Versions/
│       └── A/
│           ├── Headers/
│           │   └── WoodpeckerMacOS.h
│           ├── Modules/
│           │   └── module.modulemap
│           ├── Resources/
│           │   ├── ADHMacConnectViewController.nib
│           │   ├── ADHMacRemoteServiceCell.nib
│           │   ├── Assets.car
│           │   └── Info.plist
│           ├── WoodpeckerMacOS
│           └── _CodeSignature/
│               └── CodeResources
└── WoodpeckerMacOS.podspec

================================================
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
*.moved-aside
*.xccheckout
*.xcscmblueprint

## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM

# 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://docs.fastlane.tools/best-practices/source-control/#source-control

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output

# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode

iOSInjectionProject/


================================================
FILE: LICENSE
================================================


================================================
FILE: Package.swift
================================================
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "WoodpeckeriOS",
    
    platforms: [.iOS(SupportedPlatform.IOSVersion.v11)],
    
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "WoodpeckeriOS",
            targets: ["WoodPeckeriOS"]),
    ],
    
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),

    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages this package depends on.
        .target(
            name: "WoodpeckeriOS",
            dependencies: []),
        .testTarget(
            name: "WoodpeckeriOSTests",
            dependencies: ["WoodpeckeriOS"]),
        
        .binaryTarget(
            name: "WoodPeckeriOS",
            path: "WoodPeckeriOS.xcframework"),
    ]
)


================================================
FILE: README.md
================================================

![logo](http://www.woodpeck.cn/assets/img/logo.png)

Hi! this is a demo app for **Woodpecker** ([open source](https://github.com/appwoodpecker/woodpecker-client))

**Woodpecker** is a tool for iOS, MacOS developer, it provides some handy and productive tools which Xcode doesn't. 

It can helps you:

 - view, modify sandbox files;
 - view UserDefaults items;
 - view controller hierarchy;
 - debug webview online;
 - monitor network;
 - more...

Free download at [App Store](https://itunes.apple.com/cn/app/woodpecker/id1333548463?l=en&mt=12)
and talk with us at [Telegram](https://t.me/appwoodpecker) or [QQ(303015262) ](https://jq.qq.com/?_wv=1027&k=QXuhxDs0)



================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/AppDelegate.h
================================================
//
//  AppDelegate.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


@end



================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/AppDelegate.m
================================================
//
//  AppDelegate.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "AppDelegate.h"
#import "IndexViewController.h"
@import UserNotifications;

@interface AppDelegate ()<UNUserNotificationCenterDelegate>

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UIWindow * window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    window.backgroundColor = [UIColor whiteColor];
    IndexViewController * indexVC = [[IndexViewController alloc] init];
    UINavigationController * nvc = [[UINavigationController alloc] initWithRootViewController:indexVC];
    self.window = window;
    self.window.rootViewController = nvc;
    [self.window makeKeyAndVisible];
    [self setupNotification];
    return YES;
}

- (void)setupNotification {
    if (@available(iOS 10.0, *)) {
        UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter];
        notiCenter.delegate = self;
        UNNotificationAction *openAction = [UNNotificationAction actionWithIdentifier:UNNotificationDefaultActionIdentifier title:@"Okay" options:0];
        UNNotificationAction *customAction = [UNNotificationAction actionWithIdentifier:@"custum action" title:@"Do Something" options:0];
        UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"actionCategory" actions:@[openAction,customAction] intentIdentifiers:@[] options:0];
        NSSet *set = [NSSet setWithObjects:category, nil];
        [notiCenter setNotificationCategories:set];
    }
}

/** The method will be called on the delegate only if the application is in the foreground. If the method is not implemented or the handler is not called in a timely manner then the notification will not be presented. The application can choose to have the notification presented as a sound, badge, alert and/or in the notification list. This decision should be based on whether the information in the notification is otherwise visible to the user.
 */
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
API_AVAILABLE(ios(10.0)){
    NSLog(@"will present notification");
    completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionBadge);
}

/** The method will be called on the delegate when the user responded to the notification by opening the application, dismissing the notification or choosing a UNNotificationAction. The delegate must be set before the application returns from application:didFinishLaunchingWithOptions:.
 */
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler
API_AVAILABLE(ios(10.0)){
    NSLog(@"did receive notification response");
    completionHandler();
}


- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}


@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "3x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "120.png",
      "scale" : "2x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "180.png",
      "scale" : "3x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "76.png",
      "scale" : "1x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "152.png",
      "scale" : "2x"
    },
    {
      "size" : "83.5x83.5",
      "idiom" : "ipad",
      "filename" : "167.png",
      "scale" : "2x"
    },
    {
      "idiom" : "ios-marketing",
      "size" : "1024x1024",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  },
  "properties" : {
    "pre-rendered" : true
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="33.125" y="416.87499999999994"/>
        </scene>
    </scenes>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>$(MARKETING_VERSION)</string>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
	<key>NSBonjourServices</key>
	<array>
		<string>_adhp._tcp</string>
	</array>
	<key>NSLocalNetworkUsageDescription</key>
	<string>Debug my app</string>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.h
================================================
//
//  ConsoleViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/6/9.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ConsoleViewController : UIViewController

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.m
================================================
//
//  ConsoleViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/6/9.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "ConsoleViewController.h"

@interface ConsoleViewController ()

@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, assign) NSInteger count;
@property (weak, nonatomic) IBOutlet UIButton *countButton;

@end

@implementation ConsoleViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.count = 0;
    [self updateTimerCountButtonUI];
}

- (IBAction)logButtonPressed:(id)sender {
    [self logCount];
    NSLog(@"Woodpecker home page: http://www.woodpeck.cn, \nContact me: woodpeckerapp@163.com");
}

- (IBAction)counterLogButtonPressed:(id)sender {
    if(!self.timer) {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(logCount) userInfo:nil repeats:YES];
    }else {
        [self.timer invalidate];
        self.timer = nil;
    }
    [self updateTimerCountButtonUI];
}

- (void)updateTimerCountButtonUI {
    if(self.timer) {
        [self.countButton setTitle:@"Stop" forState:UIControlStateNormal];
    }else {
        [self.countButton setTitle:@"Start Count" forState:UIControlStateNormal];
    }
}

- (void)logCount {
    NSLog(@"count:  %zd",self.count++);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end













================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ConsoleViewController">
            <connections>
                <outlet property="countButton" destination="xEV-Rd-gw9" id="Yow-et-5UR"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Console" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="6cv-cp-XcY">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tool_io" id="pUN-bE-LJs">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="DnB-VS-Fxw">
                    <rect key="frame" x="16" y="161" width="288" height="167"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <string key="text">With this tool, we can view app's console log in Woodpecker, Console is part of tool I/O, try log something, and view them at mac.</string>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="HSj-Le-T6z">
                    <rect key="frame" x="16" y="361" width="283" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="Log something"/>
                    <connections>
                        <action selector="logButtonPressed:" destination="-1" eventType="touchUpInside" id="fXm-HO-zJ3"/>
                    </connections>
                </button>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="xEV-Rd-gw9">
                    <rect key="frame" x="16" y="426" width="283" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="Start Count"/>
                    <connections>
                        <action selector="counterLogButtonPressed:" destination="-1" eventType="touchUpInside" id="Rly-5G-teB"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="34" y="54"/>
        </view>
    </objects>
    <resources>
        <image name="tool_io" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.h
================================================
//
//  ControllerHierarchyViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/5/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ControllerHierarchyViewController : UIViewController

@property (nonatomic, assign) NSInteger pageIndex;

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.m
================================================
//
//  ControllerHierarchyViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/5/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "ControllerHierarchyViewController.h"

@interface ControllerHierarchyViewController ()

@end

@implementation ControllerHierarchyViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = [NSString stringWithFormat:@"Page %zd",self.pageIndex];
}

- (IBAction)nextButtonPressed:(id)sender {
    ControllerHierarchyViewController *nextVC = [[ControllerHierarchyViewController alloc] init];
    nextVC.pageIndex = self.pageIndex+1;
    [self.navigationController pushViewController:nextVC animated:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ControllerHierarchyViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="Controller" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="ZYK-d9-roh">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" image="tool_io" id="vZ3-ph-xXJ">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="Help you app's view controller hierarchy in graph. Try push a new page, then view the change in the 'Controller' tool." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="vDh-VS-hQQ">
                    <rect key="frame" x="16" y="161" width="288" height="114"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="dq0-h9-uMw">
                    <rect key="frame" x="46" y="367" width="228" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="Push"/>
                    <connections>
                        <action selector="nextButtonPressed:" destination="-1" eventType="touchUpInside" id="lZY-cg-Bon"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="34" y="54"/>
        </view>
    </objects>
    <resources>
        <image name="tool_io" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.h
================================================
//
//  DeviceInfoViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/3/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface DeviceInfoViewController : UIViewController

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.m
================================================
//
//  DeviceInfoViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/3/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "DeviceInfoViewController.h"

@interface DeviceInfoViewController ()

@end

@implementation DeviceInfoViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)actionButton:(id)sender {
    NSString * message = @"click me on Mac or iPhone ?";
    UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Alert" message:message preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction * cancel = [UIAlertAction actionWithTitle:@"iPhone" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        self.view.backgroundColor = [UIColor grayColor];
    }];
    UIAlertAction * confirm = [UIAlertAction actionWithTitle:@"Mac" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        float red = arc4random() % 255 / 255.0f;
        float green = arc4random() % 255 / 255.0f;
        float blue = arc4random() % 255 / 255.0f;
        self.view.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
    }];
    [alert addAction:cancel];
    [alert addAction:confirm];
    [self presentViewController:alert animated:YES completion:nil];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}


@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="DeviceInfoViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Device" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="chh-Lr-VPh">
                    <rect key="frame" x="64" y="93" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tool_device" id="21w-jg-zUW">
                    <rect key="frame" x="16" y="96" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="31x-Un-9TX">
                    <rect key="frame" x="16" y="164" width="343" height="115"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <string key="text">1. real time screen synchronizes;
2. view app's environment information, such as, system version, screen resolution, country and language.</string>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="u2R-6s-Sp4">
                    <rect key="frame" x="72" y="319" width="230" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="I`m a button"/>
                    <connections>
                        <action selector="actionButton:" destination="-1" eventType="touchUpInside" id="KtK-2K-3KH"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="35.5" y="54.5"/>
        </view>
    </objects>
    <resources>
        <image name="tool_device" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/EchoService.h
================================================
//
//  EchoService.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <WoodPeckeriOS/WoodPeckeriOS.h>

/**
 show how to create a custom service
 
 http://www.woodpeck.cn/plugin.html
 */
@interface EchoService : ADHService

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/EchoService.m
================================================
//
//  EchoService.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "EchoService.h"

@implementation EchoService

+ (void)load {
    [[ADHOrganizer sharedOrganizer] registerService:[EchoService class]];
}

+ (NSString *)serviceName {
    return @"adh.EchoService";
}

+ (NSDictionary<NSString*,NSString *> *)actionList {
    return @{
             @"echo" : NSStringFromSelector(@selector(onRequestEcho:)),
             };
}

- (void)onRequestEcho: (ADHRequest *)request {
    NSDictionary * data = @{
                            @"response" : @"hi, I`m App, What`s up",
                            };
    [request finishWithBody:data];
}

@end























================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.h
================================================
//
//  IOViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface IOViewController : UIViewController

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.m
================================================
//
//  IOViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "IOViewController.h"
#import "WoodPeckeriOS/WoodPeckeriOS.h"
#import "EchoService.h"

@interface IOViewController ()

@end

@implementation IOViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)logButtonPressed:(id)sender {
    NSString * text = @"A channel between mac and your app, you can transfer data, call service in you app, or log message to mac client,  try log something, or you create a custom ADHService";
    // log to mac
    [[ADHLogger sharedLogger] logText:text];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="IOViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="I/O" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5cJ-ca-QGy">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" image="tool_io" id="cBi-fg-4hu">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="1OL-7N-Mid">
                    <rect key="frame" x="16" y="161" width="288" height="167"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <string key="text">A channel between mac and your app. you can log message to mac client from app or call service in you app from mac, demo implements a  custom service called "EchoService" to show how to  custom a service.    try log something to mac.</string>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="Se0-oa-OyA">
                    <rect key="frame" x="16" y="361" width="283" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="log text to mac client"/>
                    <connections>
                        <action selector="logButtonPressed:" destination="-1" eventType="touchUpInside" id="X84-4E-YkC"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="33" y="54"/>
        </view>
    </objects>
    <resources>
        <image name="tool_io" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.h
================================================
//
//  NetworkViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface NetworkViewController : UIViewController

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.m
================================================
//
//  NetworkViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "NetworkViewController.h"

@interface NetworkViewController ()<NSURLConnectionDataDelegate, NSURLSessionDataDelegate>

@end

@implementation NetworkViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)startRequest:(id)sender {
    //url connection
    NSURL * requestURL = [NSURL URLWithString:@"https://api.github.com"];
    NSURLRequest * request = [NSURLRequest requestWithURL:requestURL];
    NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection start];
    
    //url session
    [self sessionRequest];
}

- (void)sessionRequest
{
    // NSURLSession
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.timeoutIntervalForRequest = 10.0;
    NSURLSession *mySession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    NSString * url = @"https://api.github.com/emojis";
    NSURL * requestURL = [NSURL URLWithString:url];
    NSMutableURLRequest * uploadRequest = [NSMutableURLRequest requestWithURL:requestURL];
    uploadRequest.HTTPMethod = @"POST";
    NSString * formText = [NSString stringWithFormat:@"q=%.f",[[NSDate date] timeIntervalSince1970]];
    NSData * data = [formText dataUsingEncoding:NSUTF8StringEncoding];
    NSURLSessionTask * task = [mySession uploadTaskWithRequest:uploadRequest fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        
    }];
    [task resume];
}

- (nullable NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(nullable NSURLResponse *)response
{
    return request;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    
}

- (void)connection:(NSURLConnection *)connection
   didSendBodyData:(NSInteger)bytesWritten
 totalBytesWritten:(NSInteger)totalBytesWritten
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
    
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    completionHandler(NSURLSessionResponseAllow);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="NetworkViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Network" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="kAk-tp-3Is">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tool_network" id="lyw-21-RJB">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="Jeb-W6-ffi">
                    <rect key="frame" x="45" y="308" width="230" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="start a request"/>
                    <connections>
                        <action selector="startRequest:" destination="-1" eventType="touchUpInside" id="N9w-kJ-yaE"/>
                    </connections>
                </button>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="it helps you monitor any network request send from you app, supports http(s).  try start a network request." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="ahB-A1-PSI">
                    <rect key="frame" x="16" y="161" width="288" height="115"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="34" y="54"/>
        </view>
    </objects>
    <resources>
        <image name="tool_network" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.h
================================================
//
//  NotificationViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/6/4.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface NotificationViewController : UIViewController

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.m
================================================
//
//  NotificationViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/6/4.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "NotificationViewController.h"
@import UserNotifications;

@interface NotificationViewController ()

@end

@implementation NotificationViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)fireButtonPressed:(id)sender {
    if (@available(iOS 10.0, *)) {
        UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter];
        [notiCenter requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if(granted){
                UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter];
                NSString * identifier = [NSString stringWithFormat:@"%d",arc4random()];
                NSString * requestIdentifier = [NSString stringWithFormat:@"request identifier%@",identifier];
                UNMutableNotificationContent * content = [[UNMutableNotificationContent alloc] init];
                content.badge = [NSNumber numberWithInteger:arc4random()%10];
                content.body = [NSString stringWithFormat:@"Thanks for using woodpecker %@",identifier];
                content.title = [NSString stringWithFormat:@"This is title %@",identifier];
                content.subtitle = [NSString stringWithFormat:@"This is subtitle %@",identifier];
                content.userInfo = @{
                                     @"identifier" : identifier,
                                     };
                content.categoryIdentifier = @"actionCategory";
                UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO];
                UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:requestIdentifier content:content trigger:trigger];
                [notiCenter addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
                    if(error){
                        NSLog(@"add local notification error: %@",error);
                    }else{
                        NSLog(@"add local notification success");
                    }
                }];
            }else{
                NSLog(@"not granted. error: %@",error);
            }
        }];
    } else {
        NSString *message = @"Sorry, this tool only support iOS 10+";
        UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Alert" message:message preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction * confirm = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil];
        [alert addAction:confirm];
        [self presentViewController:alert animated:YES completion:nil];
    }
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end







================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="NotificationViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="sZZ-R7-0n9">
                    <rect key="frame" x="72" y="308" width="175" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="Fire a notification"/>
                    <connections>
                        <action selector="fireButtonPressed:" destination="-1" eventType="touchUpInside" id="tz7-2S-eZg"/>
                    </connections>
                </button>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Notification" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9Dv-cc-ZzA">
                    <rect key="frame" x="64" y="93" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tool_notification" id="vzc-bR-JWE">
                    <rect key="frame" x="16" y="96" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="gMh-Vm-ws5">
                    <rect key="frame" x="16" y="164" width="288" height="115"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <string key="text">Debugging Notifications without any breakpoint, support APNS and local notification,  Try fire a local notification, you will receive at Mac client after 3 seconds</string>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="34" y="54"/>
        </view>
    </objects>
    <resources>
        <image name="tool_notification" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.h
================================================
//
//  SandBoxViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface SandBoxViewController : UIViewController

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.m
================================================
//
//  SandBoxViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "SandBoxViewController.h"

@interface SandBoxViewController ()

@end

@implementation SandBoxViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)addFileButtonPressed:(id)sender {
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate * date = [NSDate date];
    NSString * text = [formatter stringFromDate:date];
    //file name
    [formatter setDateFormat:@"HH-mm-ss"];
    NSString * fileName = [NSString stringWithFormat:@"%@.txt",[formatter stringFromDate:date]];
    NSString * documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString * filePath = [documentPath stringByAppendingPathComponent:fileName];
    NSURL * fileURL = [NSURL fileURLWithPath:filePath];
    NSError * error = nil;
    [text writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:&error];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}


@end














================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SandBoxViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="SandBox" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="0g5-tf-HtM">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" image="tool_sandbox" id="hur-4q-QnE">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5dQ-sG-Upg">
                    <rect key="frame" x="16" y="161" width="288" height="115"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <string key="text">it makes you, view, modify sandbox file (files in Document, Library, tmp) so easiliy.   try add a file, then click mac client`s SandBox refresh button.</string>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="Gqp-eS-p9u">
                    <rect key="frame" x="45" y="308" width="230" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="Add a File"/>
                    <connections>
                        <action selector="addFileButtonPressed:" destination="-1" eventType="touchUpInside" id="gKL-ze-Gmf"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="33.5" y="53.5"/>
        </view>
    </objects>
    <resources>
        <image name="tool_sandbox" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.h
================================================
//
//  UserDefaultsViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/3/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UserDefaultsViewController : UIViewController

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.m
================================================
//
//  UserDefaultsViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/3/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "UserDefaultsViewController.h"

@interface UserDefaultsViewController ()

@end

@implementation UserDefaultsViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)addButtonPressed:(id)sender {
    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    NSString * key = [NSString stringWithFormat:@"key%d",arc4random()];
    NSString * value = [NSString stringWithFormat:@"value%d",arc4random()];
    [userDefaults setObject:value forKey:key];
    [userDefaults synchronize];
}

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="UserDefaultsViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="UserDefaults" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="BXk-Xi-fvY">
                    <rect key="frame" x="64" y="93" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tool_userdefaults" id="Piq-DM-lCA">
                    <rect key="frame" x="16" y="96" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="help view, modify User Defaults data in Mac, simple and intuitional." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="jwF-ee-Kq2">
                    <rect key="frame" x="16" y="164" width="343" height="115"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="4EK-mW-GCZ">
                    <rect key="frame" x="72" y="308" width="230" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="Add UserDefault Item"/>
                    <connections>
                        <action selector="addButtonPressed:" destination="-1" eventType="touchUpInside" id="Ay8-sQ-ZAN"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="35.5" y="54.5"/>
        </view>
    </objects>
    <resources>
        <image name="tool_userdefaults" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.h
================================================
//
//  IndexViewController.h
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface IndexViewController : UIViewController

@end


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.m
================================================
//
//  IndexViewController.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import "IndexViewController.h"
#import "SandBoxViewController.h"
#import "NetworkViewController.h"
#import "IOViewController.h"
#import "UserDefaultsViewController.h"
#import "DeviceInfoViewController.h"
#import "ControllerHierarchyViewController.h"
#import "NotificationViewController.h"
#import "ConsoleViewController.h"

static NSString * const kIndexCellIdentifier = @"kIndexCellIdentifier";

@interface IndexViewController ()<UITableViewDataSource,UITableViewDelegate>


@property (nonatomic, strong) NSArray * actionList;
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation IndexViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = @"Woodpecker Demo";
    self.tableView.rowHeight = 60.0f;
    [self loadData];
}

- (void)loadData
{
    self.actionList = @[
                        @{
                            @"title" : @"Sandbox",
                            @"action" : NSStringFromSelector(@selector(sandBox)),
                            },
                        @{
                            @"title" : @"Network",
                            @"action" : NSStringFromSelector(@selector(network)),
                            },
                        @{
                            @"title" : @"I/O",
                            @"action" : NSStringFromSelector(@selector(doIO)),
                            },
                        @{
                            @"title" : @"Console",
                            @"action" : NSStringFromSelector(@selector(console)),
                            },
                        @{
                            @"title" : @"UserDefaults",
                            @"action" : NSStringFromSelector(@selector(userDefaults)),
                            },
                        @{
                            @"title" : @"Device",
                            @"action" : NSStringFromSelector(@selector(device)),
                            },
                        @{
                            @"title" : @"Controller Hierarchy",
                            @"action" : NSStringFromSelector(@selector(controller)),
                            },
                        @{
                            @"title" : @"Notification",
                            @"action" : NSStringFromSelector(@selector(notification)),
                            },
                        
                        
                       ];
}


- (void)sandBox
{
    SandBoxViewController * vc = [[SandBoxViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

- (void)network
{
    NetworkViewController * vc = [[NetworkViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

- (void)doIO
{
    IOViewController * vc = [[IOViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

- (void)console {
    ConsoleViewController *vc = [[ConsoleViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

- (void)userDefaults
{
    UserDefaultsViewController * vc = [[UserDefaultsViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

- (void)device
{
    DeviceInfoViewController * vc = [[DeviceInfoViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

- (void)controller {
    ControllerHierarchyViewController *nextVC = [[ControllerHierarchyViewController alloc] init];
    nextVC.pageIndex = 0;
    [self.navigationController pushViewController:nextVC animated:YES];
}

- (void)notification {
    NotificationViewController *notificationVC = [[NotificationViewController alloc] init];
    [self.navigationController pushViewController:notificationVC animated:YES];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.actionList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:kIndexCellIdentifier];
    if(!cell){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kIndexCellIdentifier];
    }
    NSDictionary * data = self.actionList[indexPath.row];
    NSString * title = data[@"title"];
    cell.textLabel.text = title;
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary * data = self.actionList[indexPath.row];
    SEL selector = NSSelectorFromString(data[@"action"]);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [self performSelector:selector];
#pragma clang diagnostic pop
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}



@end










================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="IndexViewController">
            <connections>
                <outlet property="tableView" destination="Rb9-Jy-XAt" id="qXr-j0-y15"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <tableView clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="Rb9-Jy-XAt">
                    <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                    <connections>
                        <outlet property="dataSource" destination="-1" id="y4F-dV-ndT"/>
                        <outlet property="delegate" destination="-1" id="chP-nD-Njd"/>
                    </connections>
                </tableView>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="33.5" y="53.5"/>
        </view>
    </objects>
</document>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_device.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_device.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_io.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_io.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_network.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_network.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_notification.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_notification.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_sandbox.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_sandbox.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_userdefaults.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_userdefaults.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_webconsole.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_webconsole.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerDemo/WoodPeckerDemo/main.m
================================================
//
//  main.m
//  WoodPeckerDemo
//
//  Created by xiaogang zhang on 2018/1/17.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 52;
	objects = {

/* Begin PBXBuildFile section */
		1F3A946420C570C7008AE09A /* NotificationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F3A946220C570C7008AE09A /* NotificationViewController.m */; };
		1F3A946520C570C7008AE09A /* NotificationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F3A946320C570C7008AE09A /* NotificationViewController.xib */; };
		1F46EBE120CBEA980037445F /* ConsoleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F46EBDF20CBEA980037445F /* ConsoleViewController.m */; };
		1F46EBE220CBEA980037445F /* ConsoleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F46EBE020CBEA980037445F /* ConsoleViewController.xib */; };
		1F66F00426D25BDB00ADBBBE /* WoodPeckeriOS.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F66F00226D25BD600ADBBBE /* WoodPeckeriOS.xcframework */; };
		1F66F00526D25BDB00ADBBBE /* WoodPeckeriOS.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1F66F00226D25BD600ADBBBE /* WoodPeckeriOS.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		1F9DC462200F83C700DFC64E /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC461200F83C700DFC64E /* AppDelegate.m */; };
		1F9DC46A200F83C700DFC64E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC469200F83C700DFC64E /* Assets.xcassets */; };
		1F9DC46D200F83C700DFC64E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC46B200F83C700DFC64E /* LaunchScreen.storyboard */; };
		1F9DC470200F83C700DFC64E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC46F200F83C700DFC64E /* main.m */; };
		1F9DC47B200F846100DFC64E /* IndexViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC479200F846100DFC64E /* IndexViewController.m */; };
		1F9DC47C200F846100DFC64E /* IndexViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC47A200F846100DFC64E /* IndexViewController.xib */; };
		1F9DC484200F8BBE00DFC64E /* SandBoxViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC482200F8BBE00DFC64E /* SandBoxViewController.m */; };
		1F9DC485200F8BBE00DFC64E /* SandBoxViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC483200F8BBE00DFC64E /* SandBoxViewController.xib */; };
		1F9DC487200F914100DFC64E /* images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC486200F914100DFC64E /* images.xcassets */; };
		1F9DC495200F94FB00DFC64E /* NetworkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC493200F94FB00DFC64E /* NetworkViewController.m */; };
		1F9DC496200F94FB00DFC64E /* NetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC494200F94FB00DFC64E /* NetworkViewController.xib */; };
		1F9DC49A200F99C300DFC64E /* IOViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC498200F99C300DFC64E /* IOViewController.m */; };
		1F9DC49B200F99C300DFC64E /* IOViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC499200F99C300DFC64E /* IOViewController.xib */; };
		1F9DC49E200F9AF400DFC64E /* EchoService.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC49D200F9AF400DFC64E /* EchoService.m */; };
		1FB43ABF20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB43ABD20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m */; };
		1FB43AC020ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FB43ABE20ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib */; };
		1FE5C58F205CC1CF000EC631 /* UserDefaultsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FE5C58D205CC1CF000EC631 /* UserDefaultsViewController.m */; };
		1FE5C590205CC1CF000EC631 /* UserDefaultsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FE5C58E205CC1CF000EC631 /* UserDefaultsViewController.xib */; };
		1FE5C595205CC35D000EC631 /* DeviceInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FE5C593205CC35D000EC631 /* DeviceInfoViewController.m */; };
		1FE5C596205CC35D000EC631 /* DeviceInfoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FE5C594205CC35D000EC631 /* DeviceInfoViewController.xib */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
		1F06B75C21736E02000CAD80 /* Embed Frameworks */ = {
			isa = PBXCopyFilesBuildPhase;
			buildActionMask = 2147483647;
			dstPath = "";
			dstSubfolderSpec = 10;
			files = (
				1F66F00526D25BDB00ADBBBE /* WoodPeckeriOS.xcframework in Embed Frameworks */,
			);
			name = "Embed Frameworks";
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
		1F3A946120C570C7008AE09A /* NotificationViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationViewController.h; sourceTree = "<group>"; };
		1F3A946220C570C7008AE09A /* NotificationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationViewController.m; sourceTree = "<group>"; };
		1F3A946320C570C7008AE09A /* NotificationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NotificationViewController.xib; sourceTree = "<group>"; };
		1F46EBDE20CBEA980037445F /* ConsoleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ConsoleViewController.h; sourceTree = "<group>"; };
		1F46EBDF20CBEA980037445F /* ConsoleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ConsoleViewController.m; sourceTree = "<group>"; };
		1F46EBE020CBEA980037445F /* ConsoleViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ConsoleViewController.xib; sourceTree = "<group>"; };
		1F66F00226D25BD600ADBBBE /* WoodPeckeriOS.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WoodPeckeriOS.xcframework; path = ../WoodPeckeriOS.xcframework; sourceTree = "<group>"; };
		1F9DC45D200F83C700DFC64E /* WoodPeckerDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WoodPeckerDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
		1F9DC460200F83C700DFC64E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
		1F9DC461200F83C700DFC64E /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
		1F9DC469200F83C700DFC64E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		1F9DC46C200F83C700DFC64E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
		1F9DC46E200F83C700DFC64E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		1F9DC46F200F83C700DFC64E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
		1F9DC478200F846100DFC64E /* IndexViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IndexViewController.h; sourceTree = "<group>"; };
		1F9DC479200F846100DFC64E /* IndexViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IndexViewController.m; sourceTree = "<group>"; };
		1F9DC47A200F846100DFC64E /* IndexViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IndexViewController.xib; sourceTree = "<group>"; };
		1F9DC481200F8BBE00DFC64E /* SandBoxViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SandBoxViewController.h; sourceTree = "<group>"; };
		1F9DC482200F8BBE00DFC64E /* SandBoxViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SandBoxViewController.m; sourceTree = "<group>"; };
		1F9DC483200F8BBE00DFC64E /* SandBoxViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SandBoxViewController.xib; sourceTree = "<group>"; };
		1F9DC486200F914100DFC64E /* images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = images.xcassets; sourceTree = "<group>"; };
		1F9DC492200F94FB00DFC64E /* NetworkViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NetworkViewController.h; sourceTree = "<group>"; };
		1F9DC493200F94FB00DFC64E /* NetworkViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NetworkViewController.m; sourceTree = "<group>"; };
		1F9DC494200F94FB00DFC64E /* NetworkViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NetworkViewController.xib; sourceTree = "<group>"; };
		1F9DC497200F99C300DFC64E /* IOViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IOViewController.h; sourceTree = "<group>"; };
		1F9DC498200F99C300DFC64E /* IOViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IOViewController.m; sourceTree = "<group>"; };
		1F9DC499200F99C300DFC64E /* IOViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IOViewController.xib; sourceTree = "<group>"; };
		1F9DC49C200F9AF400DFC64E /* EchoService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EchoService.h; sourceTree = "<group>"; };
		1F9DC49D200F9AF400DFC64E /* EchoService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EchoService.m; sourceTree = "<group>"; };
		1FB43ABC20ADCA9E00BD5B85 /* ControllerHierarchyViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ControllerHierarchyViewController.h; sourceTree = "<group>"; };
		1FB43ABD20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ControllerHierarchyViewController.m; sourceTree = "<group>"; };
		1FB43ABE20ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ControllerHierarchyViewController.xib; sourceTree = "<group>"; };
		1FE5C58C205CC1CF000EC631 /* UserDefaultsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserDefaultsViewController.h; sourceTree = "<group>"; };
		1FE5C58D205CC1CF000EC631 /* UserDefaultsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserDefaultsViewController.m; sourceTree = "<group>"; };
		1FE5C58E205CC1CF000EC631 /* UserDefaultsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UserDefaultsViewController.xib; sourceTree = "<group>"; };
		1FE5C592205CC35D000EC631 /* DeviceInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeviceInfoViewController.h; sourceTree = "<group>"; };
		1FE5C593205CC35D000EC631 /* DeviceInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DeviceInfoViewController.m; sourceTree = "<group>"; };
		1FE5C594205CC35D000EC631 /* DeviceInfoViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DeviceInfoViewController.xib; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		1F9DC45A200F83C700DFC64E /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F66F00426D25BDB00ADBBBE /* WoodPeckeriOS.xcframework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		1F3A946020C5709E008AE09A /* Notification */ = {
			isa = PBXGroup;
			children = (
				1F3A946120C570C7008AE09A /* NotificationViewController.h */,
				1F3A946220C570C7008AE09A /* NotificationViewController.m */,
				1F3A946320C570C7008AE09A /* NotificationViewController.xib */,
			);
			path = Notification;
			sourceTree = "<group>";
		};
		1F46EBDD20CBEA880037445F /* Console */ = {
			isa = PBXGroup;
			children = (
				1F46EBDE20CBEA980037445F /* ConsoleViewController.h */,
				1F46EBDF20CBEA980037445F /* ConsoleViewController.m */,
				1F46EBE020CBEA980037445F /* ConsoleViewController.xib */,
			);
			path = Console;
			sourceTree = "<group>";
		};
		1F9DC454200F83C700DFC64E = {
			isa = PBXGroup;
			children = (
				1F66F00226D25BD600ADBBBE /* WoodPeckeriOS.xcframework */,
				1F9DC45F200F83C700DFC64E /* WoodPeckerDemo */,
				1F9DC45E200F83C700DFC64E /* Products */,
			);
			sourceTree = "<group>";
		};
		1F9DC45E200F83C700DFC64E /* Products */ = {
			isa = PBXGroup;
			children = (
				1F9DC45D200F83C700DFC64E /* WoodPeckerDemo.app */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		1F9DC45F200F83C700DFC64E /* WoodPeckerDemo */ = {
			isa = PBXGroup;
			children = (
				1F9DC476200F842A00DFC64E /* Modules */,
				1F9DC477200F843400DFC64E /* Structure */,
				1F9DC460200F83C700DFC64E /* AppDelegate.h */,
				1F9DC461200F83C700DFC64E /* AppDelegate.m */,
				1F9DC469200F83C700DFC64E /* Assets.xcassets */,
				1F9DC486200F914100DFC64E /* images.xcassets */,
				1F9DC46B200F83C700DFC64E /* LaunchScreen.storyboard */,
				1F9DC46E200F83C700DFC64E /* Info.plist */,
				1F9DC46F200F83C700DFC64E /* main.m */,
			);
			path = WoodPeckerDemo;
			sourceTree = "<group>";
		};
		1F9DC476200F842A00DFC64E /* Modules */ = {
			isa = PBXGroup;
			children = (
				1F46EBDD20CBEA880037445F /* Console */,
				1F3A946020C5709E008AE09A /* Notification */,
				1FB43ABB20ADCA7600BD5B85 /* Controller */,
				1FE5C591205CC350000EC631 /* Device */,
				1FE5C58B205CC1B9000EC631 /* UserDefaults */,
				1F9DC47D200F872700DFC64E /* Sandbox */,
				1F9DC47E200F872C00DFC64E /* Network */,
				1F9DC47F200F873100DFC64E /* IO */,
			);
			path = Modules;
			sourceTree = "<group>";
		};
		1F9DC477200F843400DFC64E /* Structure */ = {
			isa = PBXGroup;
			children = (
				1F9DC478200F846100DFC64E /* IndexViewController.h */,
				1F9DC479200F846100DFC64E /* IndexViewController.m */,
				1F9DC47A200F846100DFC64E /* IndexViewController.xib */,
			);
			path = Structure;
			sourceTree = "<group>";
		};
		1F9DC47D200F872700DFC64E /* Sandbox */ = {
			isa = PBXGroup;
			children = (
				1F9DC481200F8BBE00DFC64E /* SandBoxViewController.h */,
				1F9DC482200F8BBE00DFC64E /* SandBoxViewController.m */,
				1F9DC483200F8BBE00DFC64E /* SandBoxViewController.xib */,
			);
			path = Sandbox;
			sourceTree = "<group>";
		};
		1F9DC47E200F872C00DFC64E /* Network */ = {
			isa = PBXGroup;
			children = (
				1F9DC492200F94FB00DFC64E /* NetworkViewController.h */,
				1F9DC493200F94FB00DFC64E /* NetworkViewController.m */,
				1F9DC494200F94FB00DFC64E /* NetworkViewController.xib */,
			);
			path = Network;
			sourceTree = "<group>";
		};
		1F9DC47F200F873100DFC64E /* IO */ = {
			isa = PBXGroup;
			children = (
				1F9DC497200F99C300DFC64E /* IOViewController.h */,
				1F9DC498200F99C300DFC64E /* IOViewController.m */,
				1F9DC499200F99C300DFC64E /* IOViewController.xib */,
				1F9DC49C200F9AF400DFC64E /* EchoService.h */,
				1F9DC49D200F9AF400DFC64E /* EchoService.m */,
			);
			path = IO;
			sourceTree = "<group>";
		};
		1FB43ABB20ADCA7600BD5B85 /* Controller */ = {
			isa = PBXGroup;
			children = (
				1FB43ABC20ADCA9E00BD5B85 /* ControllerHierarchyViewController.h */,
				1FB43ABD20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m */,
				1FB43ABE20ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib */,
			);
			path = Controller;
			sourceTree = "<group>";
		};
		1FE5C58B205CC1B9000EC631 /* UserDefaults */ = {
			isa = PBXGroup;
			children = (
				1FE5C58C205CC1CF000EC631 /* UserDefaultsViewController.h */,
				1FE5C58D205CC1CF000EC631 /* UserDefaultsViewController.m */,
				1FE5C58E205CC1CF000EC631 /* UserDefaultsViewController.xib */,
			);
			path = UserDefaults;
			sourceTree = "<group>";
		};
		1FE5C591205CC350000EC631 /* Device */ = {
			isa = PBXGroup;
			children = (
				1FE5C592205CC35D000EC631 /* DeviceInfoViewController.h */,
				1FE5C593205CC35D000EC631 /* DeviceInfoViewController.m */,
				1FE5C594205CC35D000EC631 /* DeviceInfoViewController.xib */,
			);
			path = Device;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		1F9DC45C200F83C700DFC64E /* WoodPeckerDemo */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 1F9DC473200F83C700DFC64E /* Build configuration list for PBXNativeTarget "WoodPeckerDemo" */;
			buildPhases = (
				1F9DC459200F83C700DFC64E /* Sources */,
				1F9DC45A200F83C700DFC64E /* Frameworks */,
				1F9DC45B200F83C700DFC64E /* Resources */,
				1F06B75C21736E02000CAD80 /* Embed Frameworks */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = WoodPeckerDemo;
			productName = WoodPeckerDemo;
			productReference = 1F9DC45D200F83C700DFC64E /* WoodPeckerDemo.app */;
			productType = "com.apple.product-type.application";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		1F9DC455200F83C700DFC64E /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastUpgradeCheck = 0920;
				ORGANIZATIONNAME = lifebetter;
				TargetAttributes = {
					1F9DC45C200F83C700DFC64E = {
						CreatedOnToolsVersion = 9.2;
						ProvisioningStyle = Automatic;
					};
				};
			};
			buildConfigurationList = 1F9DC458200F83C700DFC64E /* Build configuration list for PBXProject "WoodPeckerDemo" */;
			compatibilityVersion = "Xcode 8.0";
			developmentRegion = en;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = 1F9DC454200F83C700DFC64E;
			productRefGroup = 1F9DC45E200F83C700DFC64E /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				1F9DC45C200F83C700DFC64E /* WoodPeckerDemo */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		1F9DC45B200F83C700DFC64E /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F46EBE220CBEA980037445F /* ConsoleViewController.xib in Resources */,
				1FB43AC020ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib in Resources */,
				1F9DC485200F8BBE00DFC64E /* SandBoxViewController.xib in Resources */,
				1F9DC47C200F846100DFC64E /* IndexViewController.xib in Resources */,
				1F9DC46D200F83C700DFC64E /* LaunchScreen.storyboard in Resources */,
				1F9DC46A200F83C700DFC64E /* Assets.xcassets in Resources */,
				1F9DC487200F914100DFC64E /* images.xcassets in Resources */,
				1F9DC49B200F99C300DFC64E /* IOViewController.xib in Resources */,
				1FE5C590205CC1CF000EC631 /* UserDefaultsViewController.xib in Resources */,
				1FE5C596205CC35D000EC631 /* DeviceInfoViewController.xib in Resources */,
				1F9DC496200F94FB00DFC64E /* NetworkViewController.xib in Resources */,
				1F3A946520C570C7008AE09A /* NotificationViewController.xib in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		1F9DC459200F83C700DFC64E /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F9DC49E200F9AF400DFC64E /* EchoService.m in Sources */,
				1F9DC484200F8BBE00DFC64E /* SandBoxViewController.m in Sources */,
				1F9DC470200F83C700DFC64E /* main.m in Sources */,
				1FE5C595205CC35D000EC631 /* DeviceInfoViewController.m in Sources */,
				1FE5C58F205CC1CF000EC631 /* UserDefaultsViewController.m in Sources */,
				1F3A946420C570C7008AE09A /* NotificationViewController.m in Sources */,
				1F9DC49A200F99C300DFC64E /* IOViewController.m in Sources */,
				1F46EBE120CBEA980037445F /* ConsoleViewController.m in Sources */,
				1FB43ABF20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m in Sources */,
				1F9DC462200F83C700DFC64E /* AppDelegate.m in Sources */,
				1F9DC47B200F846100DFC64E /* IndexViewController.m in Sources */,
				1F9DC495200F94FB00DFC64E /* NetworkViewController.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXVariantGroup section */
		1F9DC46B200F83C700DFC64E /* LaunchScreen.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				1F9DC46C200F83C700DFC64E /* Base */,
			);
			name = LaunchScreen.storyboard;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		1F9DC471200F83C700DFC64E /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"$(inherited)",
					"DEBUG=1",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 11.2;
				MTL_ENABLE_DEBUG_INFO = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = iphoneos;
			};
			name = Debug;
		};
		1F9DC472200F83C700DFC64E /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 11.2;
				MTL_ENABLE_DEBUG_INFO = NO;
				SDKROOT = iphoneos;
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		1F9DC474200F83C700DFC64E /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				CODE_SIGN_STYLE = Automatic;
				DEVELOPMENT_TEAM = 8HG49Q463F;
				EXCLUDED_ARCHS = "";
				"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"$(PROJECT_DIR)",
				);
				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
				INFOPLIST_FILE = WoodPeckerDemo/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 11.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				MARKETING_VERSION = 1.2.5;
				PRODUCT_BUNDLE_IDENTIFIER = lifebetter.WoodPeckerDemo;
				PRODUCT_NAME = "$(TARGET_NAME)";
				PROVISIONING_PROFILE_SPECIFIER = "";
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Debug;
		};
		1F9DC475200F83C700DFC64E /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				CODE_SIGN_STYLE = Automatic;
				DEVELOPMENT_TEAM = 8HG49Q463F;
				"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"$(PROJECT_DIR)",
				);
				INFOPLIST_FILE = WoodPeckerDemo/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 11.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				MARKETING_VERSION = 1.2.5;
				PRODUCT_BUNDLE_IDENTIFIER = lifebetter.WoodPeckerDemo;
				PRODUCT_NAME = "$(TARGET_NAME)";
				PROVISIONING_PROFILE_SPECIFIER = "";
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		1F9DC458200F83C700DFC64E /* Build configuration list for PBXProject "WoodPeckerDemo" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				1F9DC471200F83C700DFC64E /* Debug */,
				1F9DC472200F83C700DFC64E /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		1F9DC473200F83C700DFC64E /* Build configuration list for PBXNativeTarget "WoodPeckerDemo" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				1F9DC474200F83C700DFC64E /* Debug */,
				1F9DC475200F83C700DFC64E /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = 1F9DC455200F83C700DFC64E /* Project object */;
}


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:WoodPeckerDemo.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/AppDelegate.swift
================================================
//
//  AppDelegate.swift
//  WoodPeckerSwiftDemo
//
//  Created by xiaogang zhang on 2018/1/20.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

import UIKit
import WoodPeckeriOS

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)
        window!.backgroundColor = UIColor.white
        let vc = IndexViewController()
        let nvc = UINavigationController(rootViewController: vc)
        window!.rootViewController = nvc;
        window!.makeKeyAndVisible()
        return true

    }
    
    
    
    
    func caculate(A:Double,B:Double) -> Double {
        return A + B;
    }
    
    

    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }


}



================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "3x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "120.png",
      "scale" : "2x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "180.png",
      "scale" : "3x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "76.png",
      "scale" : "1x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "152.png",
      "scale" : "2x"
    },
    {
      "size" : "83.5x83.5",
      "idiom" : "ipad",
      "filename" : "167.png",
      "scale" : "2x"
    },
    {
      "idiom" : "ios-marketing",
      "size" : "1024x1024",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  },
  "properties" : {
    "pre-rendered" : true
  }
}

================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="EEg-y6-mb5"/>
                        <viewControllerLayoutGuide type="bottom" id="gmq-zZ-v2U"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="53" y="375"/>
        </scene>
    </scenes>
</document>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.2.1</string>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>NSLocalNetworkUsageDescription</key>
	<string>your description here</string>
	<key>NSBonjourServices</key>
	<array>
		<string>_adhp._tcp</string>
	</array>
</dict>
</plist>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/EchoService.swift
================================================
//
//  EchoService.swift
//  WoodPeckerSwiftDemo
//
//  Created by xiaogang zhang on 2018/1/21.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

import UIKit

class EchoService: ADHService {

    override class func serviceName() -> String {
        return "adh.EchoService";
    }
    
    override class func actionList() -> ([String:String]) {
        return ["echo": NSStringFromSelector(#selector(EchoService.onRequestEcho(request:)))]
    }
    
    @objc func onRequestEcho(request: ADHRequest) {
        let data = ["response" : "Hi, I`m App, what`s up ?"]
        request.finish(withBody: data)
    }
    
}


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/IOViewController.swift
================================================
//
//  IOViewController.swift
//  WoodPeckerSwiftDemo
//
//  Created by xiaogang zhang on 2018/1/21.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

import UIKit



class IOViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //register custom service
        ADHOrganizer.shared().registerService(EchoService.classForCoder())
    }
    
    @IBAction func logButtonPressed(_ sender: Any) {
        let text = "A channel between mac and your app, you can transfer data, call service in you app, or log message to mac client,  try log something, or you create a custom ADHService"
        // log to mac
        ADHLogger.shared().logText(text)
    }

}


















================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/IOViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="IOViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="I/O" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5cJ-ca-QGy">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" image="tool_io" id="cBi-fg-4hu">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="1OL-7N-Mid">
                    <rect key="frame" x="16" y="161" width="288" height="167"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <string key="text">A channel between mac and your app. you can log message to mac client from app or call service in you app from mac, demo implements a  custom service called "EchoService" to show how to  custom a service.    try log something to mac.</string>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="Se0-oa-OyA">
                    <rect key="frame" x="16" y="361" width="283" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="log text to mac client"/>
                    <connections>
                        <action selector="logButtonPressed:" destination="-1" eventType="touchUpInside" id="iyD-JA-B3t"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="33" y="54"/>
        </view>
    </objects>
    <resources>
        <image name="tool_io" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/Network/NetworkViewController.swift
================================================
//
//  NetworkViewController.swift
//  WoodPeckerSwiftDemo
//
//  Created by xiaogang zhang on 2018/1/21.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

import UIKit

class NetworkViewController: UIViewController,NSURLConnectionDataDelegate,URLSessionDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    @IBAction func startRequest(_ sender: Any) {
        //url connection
        let requestURL = URL.init(string: "https://api.github.com")
        let request = URLRequest.init(url: requestURL!)
        let connection = NSURLConnection.init(request: request, delegate: self)
        connection?.start()
        //session request
        self.sessionRequest()
    }

    func sessionRequest(){
        let config  = URLSessionConfiguration.default
        config.timeoutIntervalForRequest = 10.0
        let mySession = URLSession.init(configuration: config, delegate: self, delegateQueue: OperationQueue.main)
        let url = "https://api.github.com/emojis"
        let requestURL = URL.init(string: url)
        let uploadRequest = NSMutableURLRequest.init(url: requestURL!)
        uploadRequest.httpMethod = "POST"
        let formText = "q=\(arc4random())"
        let data = formText.data(using: String.Encoding.utf8)
        let task = mySession.uploadTask(with: uploadRequest as URLRequest, from: data) { (data:Data?, response:URLResponse?, error:Error?) in
        }
        task.resume()
    }
    
    func connection(_ connection: NSURLConnection, willSend request: URLRequest, redirectResponse response: URLResponse?) -> URLRequest? {
        return request
    }
    
    func connection(_ connection: NSURLConnection, didReceive response: URLResponse) {
        
    }
    
    func connection(_ connection: NSURLConnection, didSendBodyData bytesWritten: Int, totalBytesWritten: Int, totalBytesExpectedToWrite: Int) {
        
    }

    func connection(_ connection: NSURLConnection, didReceive data: Data) {
        
    }
    
    func connectionDidFinishLoading(_ connection: NSURLConnection) {
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}








================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/Network/NetworkViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="NetworkViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Network" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="kAk-tp-3Is">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tool_network" id="lyw-21-RJB">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="Jeb-W6-ffi">
                    <rect key="frame" x="45" y="308" width="230" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="start a request"/>
                    <connections>
                        <action selector="startRequest:" destination="-1" eventType="touchUpInside" id="hjd-Lx-G75"/>
                    </connections>
                </button>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="it helps you monitor any network request send from you app, supports http(s).  try start a network request." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="ahB-A1-PSI">
                    <rect key="frame" x="16" y="161" width="288" height="115"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="34" y="54"/>
        </view>
    </objects>
    <resources>
        <image name="tool_network" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandBoxViewController.swift
================================================
//
//  SandBoxViewController.swift
//  WoodPeckerSwiftDemo
//
//  Created by xiaogang zhang on 2018/1/20.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

import UIKit

class SandboxViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func addFileButtonPressed(_ sender: Any) {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let date = Date()
        let text = formatter.string(from: date)
        //file name
        formatter.dateFormat = "HH-mm-ss"
        let fileName = "\(formatter.string(from: date)).txt"
        let documentPath = (NSHomeDirectory() as NSString).appendingPathComponent("Documents")
        let filePath = (documentPath as NSString).appendingPathComponent(fileName)
        let fileURL = NSURL.fileURL(withPath: filePath)
        
        do {
            try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)
        } catch  {
            
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

}









================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.temp_caseinsensitive_rename.swift
================================================
//
//  SandBoxViewController.swift
//  WoodPeckerSwiftDemo
//
//  Created by xiaogang zhang on 2018/1/20.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

import UIKit

class SandboxViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func addFileButtonPressed(_ sender: Any) {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let date = Date()
        let text = formatter.string(from: date)
        //file name
        formatter.dateFormat = "HH-mm-ss"
        let fileName = "\(formatter.string(from: date)).txt"
        let documentPath = (NSHomeDirectory() as NSString).appendingPathComponent("Documents")
        let filePath = (documentPath as NSString).appendingPathComponent(fileName)
        let fileURL = NSURL.fileURL(withPath: filePath)
        
        do {
            try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)
        } catch  {
            
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

}









================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.temp_caseinsensitive_rename.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_0" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SandboxViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Sandbox" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="0g5-tf-HtM">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tool_sandbox" id="hur-4q-QnE">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5dQ-sG-Upg">
                    <rect key="frame" x="16" y="161" width="288" height="115"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <string key="text">it makes you fetch, view, modify sandbox file (files in Document, Library, Tmp) so easiliy.    try add a file, then click mac client`s Sandbox refresh button.</string>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="Gqp-eS-p9u">
                    <rect key="frame" x="45" y="308" width="230" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="Add a File"/>
                    <connections>
                        <action selector="addFileButtonPressed:" destination="-1" eventType="touchUpInside" id="yXu-xg-lTz"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="53.600000000000001" y="48.125937031484263"/>
        </view>
    </objects>
    <resources>
        <image name="tool_sandbox" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SandboxViewController">
            <connections>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Sandbox" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="0g5-tf-HtM">
                    <rect key="frame" x="64" y="90" width="237" height="46"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="22"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="tool_sandbox" id="hur-4q-QnE">
                    <rect key="frame" x="16" y="93" width="40" height="40"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                </imageView>
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5dQ-sG-Upg">
                    <rect key="frame" x="16" y="161" width="288" height="115"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <string key="text">it makes you fetch, view, modify sandbox file (files in Document, Library, Tmp) so easiliy.    try add a file, then click mac client`s Sandbox refresh button.</string>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <nil key="textColor"/>
                    <nil key="highlightedColor"/>
                </label>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="Gqp-eS-p9u">
                    <rect key="frame" x="45" y="308" width="230" height="50"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                    <state key="normal" title="Add a File"/>
                    <connections>
                        <action selector="addFileButtonPressed:" destination="-1" eventType="touchUpInside" id="yXu-xg-lTz"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="53.600000000000001" y="48.125937031484263"/>
        </view>
    </objects>
    <resources>
        <image name="tool_sandbox" width="160" height="160"/>
    </resources>
</document>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Structure/IndexViewController.swift
================================================
//
//  IndexViewController.swift
//  WoodPeckerSwiftDemo
//
//  Created by xiaogang zhang on 2018/1/20.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

import UIKit

class IndexViewController: UIViewController,UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    var actionList: [[String:Any]]?
    
    init() {
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.title = "Woodpecker Demo";
        self.tableView.rowHeight = 60.0;
        self.loadData()
    }

    
    func loadData() {
        self.actionList = [
                [
                "title" : "Sandbox",
                "action" : #selector(IndexViewController.sandbox)
                ],
                [
                "title" : "Network",
                "action" : #selector(IndexViewController.network)
                ],
                [
                "title" : "I/O",
                "action" : #selector(IndexViewController.doIO)
                ],
                [
                    "title" : "More tools",
                    "action" : #selector(IndexViewController.more)
                ]
        ]
    }
    
    @objc func sandbox(){
        let vc = SandboxViewController()
        self.navigationController!.pushViewController(vc, animated: true)
    }
    

    @objc func network(){
        let vc = NetworkViewController()
        self.navigationController!.pushViewController(vc, animated:true)
    }
    
 
    @objc func doIO(){
        let vc = IOViewController()
        self.navigationController!.pushViewController(vc, animated:true)
    }
    
    @objc func more(){
        let message = "You can learn more in the Objective-C demo";
        let alert = UIAlertController.init(title: "Alert", message: message, preferredStyle: UIAlertControllerStyle.alert);
        let confirm = UIAlertAction.init(title: "Ok", style: UIAlertActionStyle.default) { (action) in
            
        }
        alert.addAction(confirm);
        self.present(alert, animated: true, completion: nil);
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let count = self.actionList!.count
        return count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let kIndexCellIdentifier = "kIndexCellIdentifier"
        let cell = tableView.dequeueReusableCell(withIdentifier: kIndexCellIdentifier) ?? UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: kIndexCellIdentifier)
        var data = self.actionList![indexPath.row]
        let title = data["title"];
        cell.textLabel?.text = (title as! String)
        return cell;
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        var data = self.actionList![indexPath.row];
        let action = data["action"]
        self.perform(action as? Selector)
        tableView.deselectRow(at: indexPath, animated: false)
    }

    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
















================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Structure/IndexViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="IndexViewController">
            <connections>
                <outlet property="tableView" destination="Rb9-Jy-XAt" id="pc5-0Z-3M8"/>
                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
            </connections>
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <tableView clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="Rb9-Jy-XAt">
                    <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                    <connections>
                        <outlet property="dataSource" destination="-1" id="y4F-dV-ndT"/>
                        <outlet property="delegate" destination="-1" id="chP-nD-Njd"/>
                    </connections>
                </tableView>
            </subviews>
            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            <point key="canvasLocation" x="33.5" y="53.5"/>
        </view>
    </objects>
</document>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo-Bridging-Header.h
================================================
//
//  objcBridge.h
//  WoodPeckerSwiftDemo
//
//  Created by xiaogang zhang on 2018/1/21.
//  Copyright © 2018年 lifebetter. All rights reserved.
//


#import <WoodPeckeriOS/WoodPeckeriOS.h>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_io.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_io.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_network.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_network.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_sandbox.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_sandbox.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_webconsole.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "tool_webconsole.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 52;
	objects = {

/* Begin PBXBuildFile section */
		1F66F00826D25CA200ADBBBE /* WoodPeckeriOS.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F66F00626D25C7100ADBBBE /* WoodPeckeriOS.xcframework */; };
		1F66F00926D25CA200ADBBBE /* WoodPeckeriOS.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1F66F00626D25C7100ADBBBE /* WoodPeckeriOS.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		1F84227920133FD4003BFF5A /* IndexViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F84227820133FD4003BFF5A /* IndexViewController.swift */; };
		1F842296201340FE003BFF5A /* IOViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F842285201340FE003BFF5A /* IOViewController.xib */; };
		1F84229A201340FE003BFF5A /* SandboxViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F84228C201340FE003BFF5A /* SandboxViewController.xib */; };
		1F84229C201340FE003BFF5A /* NetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F842291201340FE003BFF5A /* NetworkViewController.xib */; };
		1F84229E20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F84229D20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift */; };
		1F8422A02013468D003BFF5A /* IndexViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F84229F2013468D003BFF5A /* IndexViewController.xib */; };
		1F8422A2201353E1003BFF5A /* images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F8422A1201353E1003BFF5A /* images.xcassets */; };
		1F8422A420143E28003BFF5A /* NetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8422A320143E28003BFF5A /* NetworkViewController.swift */; };
		1F8422A620144831003BFF5A /* IOViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8422A520144831003BFF5A /* IOViewController.swift */; };
		1F8422B020145079003BFF5A /* EchoService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8422AF20145079003BFF5A /* EchoService.swift */; };
		1F90227520131F84007335EA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F90227420131F84007335EA /* AppDelegate.swift */; };
		1F90227C20131F84007335EA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F90227B20131F84007335EA /* Assets.xcassets */; };
		1F90227F20131F84007335EA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F90227D20131F84007335EA /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
		1F90228A2013243B007335EA /* Embed Frameworks */ = {
			isa = PBXCopyFilesBuildPhase;
			buildActionMask = 2147483647;
			dstPath = "";
			dstSubfolderSpec = 10;
			files = (
				1F66F00926D25CA200ADBBBE /* WoodPeckeriOS.xcframework in Embed Frameworks */,
			);
			name = "Embed Frameworks";
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
		1F66F00626D25C7100ADBBBE /* WoodPeckeriOS.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WoodPeckeriOS.xcframework; path = ../WoodPeckeriOS.xcframework; sourceTree = "<group>"; };
		1F84227820133FD4003BFF5A /* IndexViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndexViewController.swift; sourceTree = "<group>"; };
		1F842285201340FE003BFF5A /* IOViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IOViewController.xib; sourceTree = "<group>"; };
		1F84228C201340FE003BFF5A /* SandboxViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SandboxViewController.xib; sourceTree = "<group>"; };
		1F842291201340FE003BFF5A /* NetworkViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NetworkViewController.xib; sourceTree = "<group>"; };
		1F84229D20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SandboxViewController.temp_caseinsensitive_rename.swift; sourceTree = "<group>"; };
		1F84229F2013468D003BFF5A /* IndexViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IndexViewController.xib; sourceTree = "<group>"; };
		1F8422A1201353E1003BFF5A /* images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = images.xcassets; sourceTree = "<group>"; };
		1F8422A320143E28003BFF5A /* NetworkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkViewController.swift; sourceTree = "<group>"; };
		1F8422A520144831003BFF5A /* IOViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOViewController.swift; sourceTree = "<group>"; };
		1F8422A820144B9C003BFF5A /* WoodPeckerSwiftDemo-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WoodPeckerSwiftDemo-Bridging-Header.h"; sourceTree = "<group>"; };
		1F8422AF20145079003BFF5A /* EchoService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EchoService.swift; sourceTree = "<group>"; };
		1F90227120131F84007335EA /* WoodPeckerSwiftDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WoodPeckerSwiftDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
		1F90227420131F84007335EA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
		1F90227B20131F84007335EA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		1F90227E20131F84007335EA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
		1F90228020131F84007335EA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		1F90226E20131F84007335EA /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F66F00826D25CA200ADBBBE /* WoodPeckeriOS.xcframework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		1F84227520133F5B003BFF5A /* Structure */ = {
			isa = PBXGroup;
			children = (
				1F84227820133FD4003BFF5A /* IndexViewController.swift */,
				1F84229F2013468D003BFF5A /* IndexViewController.xib */,
			);
			path = Structure;
			sourceTree = "<group>";
		};
		1F84227A201340C9003BFF5A /* Modules */ = {
			isa = PBXGroup;
			children = (
				1F84228A201340FE003BFF5A /* SandBox */,
				1F84228E201340FE003BFF5A /* Network */,
				1F842284201340FE003BFF5A /* IO */,
			);
			path = Modules;
			sourceTree = "<group>";
		};
		1F842284201340FE003BFF5A /* IO */ = {
			isa = PBXGroup;
			children = (
				1F8422A520144831003BFF5A /* IOViewController.swift */,
				1F842285201340FE003BFF5A /* IOViewController.xib */,
				1F8422AF20145079003BFF5A /* EchoService.swift */,
			);
			path = IO;
			sourceTree = "<group>";
		};
		1F84228A201340FE003BFF5A /* SandBox */ = {
			isa = PBXGroup;
			children = (
				1F84229D20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift */,
				1F84228C201340FE003BFF5A /* SandboxViewController.xib */,
			);
			path = SandBox;
			sourceTree = "<group>";
		};
		1F84228E201340FE003BFF5A /* Network */ = {
			isa = PBXGroup;
			children = (
				1F842291201340FE003BFF5A /* NetworkViewController.xib */,
				1F8422A320143E28003BFF5A /* NetworkViewController.swift */,
			);
			path = Network;
			sourceTree = "<group>";
		};
		1F90226820131F84007335EA = {
			isa = PBXGroup;
			children = (
				1F66F00626D25C7100ADBBBE /* WoodPeckeriOS.xcframework */,
				1F90227320131F84007335EA /* WoodPeckerSwiftDemo */,
				1F90227220131F84007335EA /* Products */,
			);
			sourceTree = "<group>";
		};
		1F90227220131F84007335EA /* Products */ = {
			isa = PBXGroup;
			children = (
				1F90227120131F84007335EA /* WoodPeckerSwiftDemo.app */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		1F90227320131F84007335EA /* WoodPeckerSwiftDemo */ = {
			isa = PBXGroup;
			children = (
				1F84227A201340C9003BFF5A /* Modules */,
				1F84227520133F5B003BFF5A /* Structure */,
				1F90227420131F84007335EA /* AppDelegate.swift */,
				1F90227B20131F84007335EA /* Assets.xcassets */,
				1F8422A1201353E1003BFF5A /* images.xcassets */,
				1F90227D20131F84007335EA /* LaunchScreen.storyboard */,
				1F90228020131F84007335EA /* Info.plist */,
				1F8422A820144B9C003BFF5A /* WoodPeckerSwiftDemo-Bridging-Header.h */,
			);
			path = WoodPeckerSwiftDemo;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		1F90227020131F84007335EA /* WoodPeckerSwiftDemo */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 1F90228320131F84007335EA /* Build configuration list for PBXNativeTarget "WoodPeckerSwiftDemo" */;
			buildPhases = (
				1F90226D20131F84007335EA /* Sources */,
				1F90226E20131F84007335EA /* Frameworks */,
				1F90226F20131F84007335EA /* Resources */,
				1F90228A2013243B007335EA /* Embed Frameworks */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = WoodPeckerSwiftDemo;
			productName = WoodPeckerSwiftDemo;
			productReference = 1F90227120131F84007335EA /* WoodPeckerSwiftDemo.app */;
			productType = "com.apple.product-type.application";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		1F90226920131F84007335EA /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastSwiftUpdateCheck = 0920;
				LastUpgradeCheck = 0920;
				ORGANIZATIONNAME = lifebetter;
				TargetAttributes = {
					1F90227020131F84007335EA = {
						CreatedOnToolsVersion = 9.2;
						ProvisioningStyle = Automatic;
					};
				};
			};
			buildConfigurationList = 1F90226C20131F84007335EA /* Build configuration list for PBXProject "WoodPeckerSwiftDemo" */;
			compatibilityVersion = "Xcode 8.0";
			developmentRegion = en;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = 1F90226820131F84007335EA;
			productRefGroup = 1F90227220131F84007335EA /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				1F90227020131F84007335EA /* WoodPeckerSwiftDemo */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		1F90226F20131F84007335EA /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F84229A201340FE003BFF5A /* SandboxViewController.xib in Resources */,
				1F8422A2201353E1003BFF5A /* images.xcassets in Resources */,
				1F84229C201340FE003BFF5A /* NetworkViewController.xib in Resources */,
				1F90227F20131F84007335EA /* LaunchScreen.storyboard in Resources */,
				1F90227C20131F84007335EA /* Assets.xcassets in Resources */,
				1F842296201340FE003BFF5A /* IOViewController.xib in Resources */,
				1F8422A02013468D003BFF5A /* IndexViewController.xib in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		1F90226D20131F84007335EA /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F8422B020145079003BFF5A /* EchoService.swift in Sources */,
				1F84229E20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift in Sources */,
				1F8422A420143E28003BFF5A /* NetworkViewController.swift in Sources */,
				1F8422A620144831003BFF5A /* IOViewController.swift in Sources */,
				1F90227520131F84007335EA /* AppDelegate.swift in Sources */,
				1F84227920133FD4003BFF5A /* IndexViewController.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXVariantGroup section */
		1F90227D20131F84007335EA /* LaunchScreen.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				1F90227E20131F84007335EA /* Base */,
			);
			name = LaunchScreen.storyboard;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		1F90228120131F84007335EA /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 11.2;
				MTL_ENABLE_DEBUG_INFO = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = iphoneos;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
			};
			name = Debug;
		};
		1F90228220131F84007335EA /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 11.2;
				MTL_ENABLE_DEBUG_INFO = NO;
				SDKROOT = iphoneos;
				SWIFT_COMPILATION_MODE = wholemodule;
				SWIFT_OPTIMIZATION_LEVEL = "-O";
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		1F90228420131F84007335EA /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CODE_SIGN_STYLE = Automatic;
				DEVELOPMENT_TEAM = 8HG49Q463F;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"$(PROJECT_DIR)/../",
				);
				INFOPLIST_FILE = WoodPeckerSwiftDemo/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = lifebetter.WoodPeckerSwiftDemo;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_INSTALL_OBJC_HEADER = YES;
				SWIFT_OBJC_BRIDGING_HEADER = "${PROJECT_DIR}/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo-Bridging-Header.h";
				SWIFT_VERSION = 4.0;
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Debug;
		};
		1F90228520131F84007335EA /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CODE_SIGN_STYLE = Automatic;
				DEVELOPMENT_TEAM = 8HG49Q463F;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"$(PROJECT_DIR)/../",
				);
				INFOPLIST_FILE = WoodPeckerSwiftDemo/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = lifebetter.WoodPeckerSwiftDemo;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_INSTALL_OBJC_HEADER = YES;
				SWIFT_OBJC_BRIDGING_HEADER = "${PROJECT_DIR}/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo-Bridging-Header.h";
				SWIFT_VERSION = 4.0;
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		1F90226C20131F84007335EA /* Build configuration list for PBXProject "WoodPeckerSwiftDemo" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				1F90228120131F84007335EA /* Debug */,
				1F90228220131F84007335EA /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		1F90228320131F84007335EA /* Build configuration list for PBXNativeTarget "WoodPeckerSwiftDemo" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				1F90228420131F84007335EA /* Debug */,
				1F90228520131F84007335EA /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = 1F90226920131F84007335EA /* Project object */;
}


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:WoodPeckerSwiftDemo.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: WoodPeckeriOS-Carthage.json
================================================
{
	"1.0.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.3/WoodPeckeriOS.framework.zip",
	"1.0.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.6/WoodPeckeriOS.framework.zip",
	"1.0.7": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.7/WoodPeckeriOS.framework.zip",
	"1.0.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.8/WoodPeckeriOS.framework.zip",
	"1.0.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.9/WoodPeckeriOS.framework.zip",
	"1.1.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.0/WoodPeckeriOS.framework.zip",
	"1.1.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.1/WoodPeckeriOS.framework.zip",
	"1.1.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.2/WoodPeckeriOS.framework.zip",
	"1.1.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.3/WoodPeckeriOS.framework.zip",
	"1.1.4": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.4/WoodPeckeriOS.framework.zip",
	"1.1.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.6/WoodPeckeriOS.framework.zip",
	"1.1.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.8/WoodPeckeriOS.framework.zip",
	"1.1.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.9/WoodPeckeriOS.framework.zip",
	"1.2.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.0/WoodPeckeriOS.framework.zip",
	"1.2.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.1/WoodPeckeriOS.framework.zip",
	"1.2.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.2/WoodPeckeriOS.framework.zip",
	"1.2.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.3/WoodPeckeriOS.framework.zip",
	"1.2.4": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.4/WoodPeckeriOS.framework.zip",
	"1.2.5": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.5/WoodPeckeriOS.framework.zip",
	"1.2.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.6.1/WoodPeckeriOS.framework.zip",
	"1.2.7": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.7/WoodPeckeriOS.framework.zip",
	"1.2.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.8/WoodPeckeriOS.framework.zip",
	"1.2.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.9/WoodPeckeriOS.framework.zip",
	"1.2.92": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.92/WoodPeckeriOS.xcframework.zip",
	"1.2.93": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.93/WoodPeckeriOS.xcframework.zip",
	"1.3.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.0/WoodPeckeriOS.xcframework.zip",
	"1.3.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.1/WoodPeckeriOS.xcframework.zip",
    "1.3.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.3/WoodPeckeriOS.xcframework.zip",
	"1.4.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.0/WoodPeckeriOS.xcframework.zip",
	"1.4.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.1/WoodPeckeriOS.xcframework.zip",
	"1.4.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.2/WoodPeckeriOS.xcframework.zip",
    "1.4.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.3/WoodPeckeriOS.xcframework.zip"
}


================================================
FILE: WoodPeckeriOS.podspec
================================================
Pod::Spec.new do |s|

  s.name                        = "WoodPeckeriOS"
  s.version                     = "1.4.3"
  s.summary                     = "iOS framework for Woodpekcer Mac App"
  s.description                 = "Woodpecker is a handy, powerful Mac app for iOS developer, it helps you view, modify sandbox files, monitor network, run javascript in WebView, and more..."
  s.homepage                    = "http://www.woodpeck.cn"
  s.authors                     = { "Woodpecker" => "woodperckerapp@163.com" }
  s.platform                    = :ios, "11.0"
  s.source                      = { :git => "https://github.com/appwoodpecker/woodpecker-ios.git", :tag => "#{s.version}" }
  s.vendored_frameworks         = "WoodPeckeriOS.xcframework"
  s.license                     = { :type => 'Copyright', :file => 'LICENSE' }
  s.user_target_xcconfig        = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
  s.pod_target_xcconfig 		= { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

end


================================================
FILE: WoodPeckeriOS.xcframework/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>AvailableLibraries</key>
	<array>
		<dict>
			<key>LibraryIdentifier</key>
			<string>ios-arm64_x86_64-simulator</string>
			<key>LibraryPath</key>
			<string>WoodPeckeriOS.framework</string>
			<key>SupportedArchitectures</key>
			<array>
				<string>arm64</string>
				<string>x86_64</string>
			</array>
			<key>SupportedPlatform</key>
			<string>ios</string>
			<key>SupportedPlatformVariant</key>
			<string>simulator</string>
		</dict>
		<dict>
			<key>LibraryIdentifier</key>
			<string>ios-arm64</string>
			<key>LibraryPath</key>
			<string>WoodPeckeriOS.framework</string>
			<key>SupportedArchitectures</key>
			<array>
				<string>arm64</string>
			</array>
			<key>SupportedPlatform</key>
			<string>ios</string>
		</dict>
	</array>
	<key>CFBundlePackageType</key>
	<string>XFWK</string>
	<key>XCFrameworkFormatVersion</key>
	<string>1.0</string>
</dict>
</plist>


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHLogger.h
================================================
//
//  ADHLogger.h
//  ADHClient
//
//  Created by 张小刚 on 2017/12/30.
//  Copyright © 2017年 lifebetter. All rights reserved.
//

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#endif

@interface ADHLogger : NSObject

+ (ADHLogger *)sharedLogger;
- (void)logText: (NSString *)text;
- (void)logFileWithData:(NSData *)fileData fileName:(NSString *)fileName text: (NSString *)text;
#if TARGET_OS_IPHONE
- (void)logText: (NSString *)text color: (UIColor *)color;
#endif

@end


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHOrganizer.h
================================================
//
//  AppOrganizer.h
//  ADHClient
//
//  Created by woodpecker on 2017/11/5.
//  Copyright © 2017年 lifebetter. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


/**
 * parameters that specify which mac client you'd like connect to
 * learn more at http://www.woodpeck.cn/connection.html
 */
extern NSString *const kADHHostName;
extern NSString *const kADHHostAddress;
extern NSString *const kADHAutoConnectEnabled;
extern NSString *const kADHUIGestureEnabled;


@interface ADHOrganizer : NSObject

+ (ADHOrganizer *)sharedOrganizer;

/**
 * register your own ADHService
 * learn more about custom service, please visit http://www.woodpeck.cn/plugin.html
 */
- (void)registerService: (Class)serviceClazz;

/**
 * show connection setup window manually, also you can use gesture too,
 * just long press with two fingers at anywhere of your app.
 */
- (void)showUI;


@end


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHRequest.h
================================================
//
//  ADHRequest.h
//  ADHClient
//
//  Created by woodpecker on 2017/11/4.
//  Copyright © 2017年 lifebetter. All rights reserved.
//

#import <Foundation/Foundation.h>


@class ADHRequest;
@class ADHSession;
@class ADHService;

@interface ADHRequest : NSObject

@property (nonatomic, strong) NSString * service;
@property (nonatomic, strong) NSString * action;
@property (nonatomic, strong) NSDictionary * body;
@property (nonatomic, strong) NSData * payload;


//must call at the end of a request
- (void)finish;
- (void)finishWithBody: (NSDictionary *)body;
- (void)finishWithBody: (NSDictionary *)body payload: (NSData *)payload;


@end










================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHService.h
================================================
//
//  ADHService.h
//  AppDevelopHelper
//
//  Created by woodpecker on 2017/11/4.
//  Copyright © 2017年 lifebetter. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface ADHService : NSObject

/**
 service name
 */
+ (NSString *)serviceName;

/**
 action list

 return @{
    @"actionName1" : selector1 string,
    @"actionName2" : selector2 string,
 };
 */
+ (NSDictionary<NSString*,NSString *> *)actionList;

/**
 YES: all request use one shared service instance.
 NO: each request use a new service instance.
 */
+ (BOOL)isShared;

/**
 called on service init
 */
- (void)onServiceInit;


@end


@interface ADHAction: NSObject

@property (nonatomic, strong) NSString * service;
@property (nonatomic, strong) NSString * name;
@property (nonatomic, strong) NSString * handler;

+ (ADHAction *)actionWithService: (NSString *)service name: (NSString *)name handler: (NSString *)handler;

@end


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/WoodPeckeriOS.h
================================================
//
//  WoodPeckeriOS.h
//  WoodPeckeriOS
//
//  Created by woodpecker on 2018/1/7.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

//! Project version number for WoodPeckeriOS.
FOUNDATION_EXPORT double WoodPeckeriOSVersionNumber;

//! Project version string for WoodPeckeriOS.
FOUNDATION_EXPORT const unsigned char WoodPeckeriOSVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <WoodPeckeriOS/PublicHeader.h>

#import <WoodPeckeriOS/ADHOrganizer.h>
#import <WoodPeckeriOS/ADHRequest.h>
#import <WoodPeckeriOS/ADHService.h>
#import <WoodPeckeriOS/ADHLogger.h>



================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Modules/module.modulemap
================================================
framework module WoodPeckeriOS {
  umbrella header "WoodPeckeriOS.h"

  export *
  module * { export * }
}


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/_CodeSignature/CodeResources
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>files</key>
	<dict>
		<key>ADHConnectViewController.nib</key>
		<data>
		pqKfhkAkrBNujLZE2Ee203g6yQ8=
		</data>
		<key>ADHRemoteServiceCell.nib</key>
		<data>
		4EZm1JVZi6H8//9xa6WvF0M3POc=
		</data>
		<key>Headers/ADHLogger.h</key>
		<data>
		tr7ZIT8mFwHtfZNYOU7gcSui7M0=
		</data>
		<key>Headers/ADHOrganizer.h</key>
		<data>
		xjxX+wbxgeNkXtwk1oUJrkYJQuo=
		</data>
		<key>Headers/ADHRequest.h</key>
		<data>
		ImkUqO+N052g2ypMPoBtobY4s6g=
		</data>
		<key>Headers/ADHService.h</key>
		<data>
		6SENU3Ad9+OcQ0slfAzrqpYzx9s=
		</data>
		<key>Headers/WoodPeckeriOS.h</key>
		<data>
		725LXPFZloMNOizfCL/tkXqCgiQ=
		</data>
		<key>Info.plist</key>
		<data>
		EY+6I+c2ifIwpaBm8D3Lq+75SSM=
		</data>
		<key>Modules/module.modulemap</key>
		<data>
		uytDu9Ql07vN0alhWqpDzzrojIs=
		</data>
		<key>adhwebdebugger.bundle/mock.js</key>
		<data>
		YIsJN3YRR6UMoFhsBgb4JdY6tpg=
		</data>
	</dict>
	<key>files2</key>
	<dict>
		<key>ADHConnectViewController.nib</key>
		<dict>
			<key>hash2</key>
			<data>
			FE5aUJkN1d13EzbgXbaQBtY3OQSGwW5XZtSSb5Clyxw=
			</data>
		</dict>
		<key>ADHRemoteServiceCell.nib</key>
		<dict>
			<key>hash2</key>
			<data>
			Po7DobIgRzXW62+4vL8El1TIzc5uGTIMIC2NLxTwmqk=
			</data>
		</dict>
		<key>Headers/ADHLogger.h</key>
		<dict>
			<key>hash2</key>
			<data>
			I/Vh0EI2tIImYyjGDjEHMp4wAfoq8upkDFOD97tr7tU=
			</data>
		</dict>
		<key>Headers/ADHOrganizer.h</key>
		<dict>
			<key>hash2</key>
			<data>
			DPmD7L8x7uJCdrgXHiQ6ztxVhsxW9ItGP/NS3pAQDpM=
			</data>
		</dict>
		<key>Headers/ADHRequest.h</key>
		<dict>
			<key>hash2</key>
			<data>
			kxMpI4TuI/X4D1lz6txphCFANrdR4pWSFVOT/ORLEqc=
			</data>
		</dict>
		<key>Headers/ADHService.h</key>
		<dict>
			<key>hash2</key>
			<data>
			9dlef+1QknEeYNfSnzmCv5MRj2e85DI2fA1BGlfdiDE=
			</data>
		</dict>
		<key>Headers/WoodPeckeriOS.h</key>
		<dict>
			<key>hash2</key>
			<data>
			u/8B5RVVynf7ouOSIM9W2I1djZC82Xvo0/XS3WDACzk=
			</data>
		</dict>
		<key>Modules/module.modulemap</key>
		<dict>
			<key>hash2</key>
			<data>
			1PST2FmpFCkiPZ3i3V5g1CguJHZwfC2IwIxxLUV68nY=
			</data>
		</dict>
		<key>adhwebdebugger.bundle/mock.js</key>
		<dict>
			<key>hash2</key>
			<data>
			EML+wVyc32okro6yPkBnzQAG83hZugzIxJDI5qjNgNI=
			</data>
		</dict>
	</dict>
	<key>rules</key>
	<dict>
		<key>^.*</key>
		<true/>
		<key>^.*\.lproj/</key>
		<dict>
			<key>optional</key>
			<true/>
			<key>weight</key>
			<real>1000</real>
		</dict>
		<key>^.*\.lproj/locversion.plist$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>1100</real>
		</dict>
		<key>^Base\.lproj/</key>
		<dict>
			<key>weight</key>
			<real>1010</real>
		</dict>
		<key>^version.plist$</key>
		<true/>
	</dict>
	<key>rules2</key>
	<dict>
		<key>.*\.dSYM($|/)</key>
		<dict>
			<key>weight</key>
			<real>11</real>
		</dict>
		<key>^(.*/)?\.DS_Store$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>2000</real>
		</dict>
		<key>^.*</key>
		<true/>
		<key>^.*\.lproj/</key>
		<dict>
			<key>optional</key>
			<true/>
			<key>weight</key>
			<real>1000</real>
		</dict>
		<key>^.*\.lproj/locversion.plist$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>1100</real>
		</dict>
		<key>^Base\.lproj/</key>
		<dict>
			<key>weight</key>
			<real>1010</real>
		</dict>
		<key>^Info\.plist$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>20</real>
		</dict>
		<key>^PkgInfo$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>20</real>
		</dict>
		<key>^embedded\.provisionprofile$</key>
		<dict>
			<key>weight</key>
			<real>20</real>
		</dict>
		<key>^version\.plist$</key>
		<dict>
			<key>weight</key>
			<real>20</real>
		</dict>
	</dict>
</dict>
</plist>


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js
================================================
/**
* mock window's console methods(log,info,warn,debug,error) and window.onerror
*/

function mockedMethodList () {
    const methodList = ['log', 'info', 'warn', 'debug', 'error'];
    return methodList;
}

//mock console methods
function mockConsole() {
  if(window.adhOriginConsole) {
    return;
  }
  window.adhOriginConsole = {};
  var methodList = mockedMethodList();
  if(!window.console) {
    window.console = {};
  }else {
    //save origin method
    methodList.map(function (method) {
      window.adhOriginConsole[method] = window.console[method];
    });
  }

  methodList.map(method => {
    window.console[method] = (...args) => {
      printLog({
        logType: method,
        logs: args
      });
    };
  });
}

function mockWindowError() {
  if(window.adhOriginOnError) {
     return
  }
  if(window.onerror) {
      window.adhOriginOnError = window.onerror;
  }
  window.onerror = printError;
}

function restoreWindowError() {
  window.onerror = window.adhOriginOnError;
}

/** 
 * @param {String} errorMessage
 * @param {String} scriptURI
 * @param {Long}  lineNumber
 * @param {Long}  columnNumber
 * @param {Object} errorObj
 */
function printError(errorMessage, scriptURI, lineNumber,columnNumber) { 
  var content = '';
  content += 'message: ' + errorMessage + '<br/>';
  content += 'scriptURI: ' + scriptURI + '<br/>';
  content += 'line: ' + lineNumber + '<br/>';
  content += 'column: ' + columnNumber;
  console.error(content);
}

//restore console methods
function restoreConsole() {
  var methodList = mockedMethodList();
  methodList.map(function (method) {
    window.console[method] = window.adhOriginConsole[method];
  });
}

//mocked log
function printLog(item) {
  var logType = item.logType;
  let logs = item.logs || [];
  if (!logs.length) {
    return;
  }
  var content = '';
  for (let i = 0; i < logs.length; i++) {
      var value = logs[i];
      if (typeof(value) == "undefined") {
        result = "undefined";
      }else if (!value && value!=0) {
        result = "null";
      }else if(typeof(value) == 'object'){
        if(logs.length == 1) {
          result = JSON.stringify(value,null,4);
        }else {
          result = JSON.stringify(value,null);
        }
      }else {
        result = value.toString();
      }
      content += result;
  }
  var data = {};
  data['logType'] = logType;
  data['content'] = content;
  // data['date'] = new Date().toString();
  //webkit
  if(window.webkit) {
      if(window.webkit.messageHandlers.wkwebviewjsHandler) {
          window.webkit.messageHandlers.wkwebviewjsHandler.postMessage(data);
      }
  }
  //uiwebview
  if(window.webviewjsHandler) {
    webviewjsHandler(data);
  }
}

function adhMock() {
  mockConsole();
  mockWindowError();
}

adhMock();






================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHLogger.h
================================================
//
//  ADHLogger.h
//  ADHClient
//
//  Created by 张小刚 on 2017/12/30.
//  Copyright © 2017年 lifebetter. All rights reserved.
//

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#endif

@interface ADHLogger : NSObject

+ (ADHLogger *)sharedLogger;
- (void)logText: (NSString *)text;
- (void)logFileWithData:(NSData *)fileData fileName:(NSString *)fileName text: (NSString *)text;
#if TARGET_OS_IPHONE
- (void)logText: (NSString *)text color: (UIColor *)color;
#endif

@end


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHOrganizer.h
================================================
//
//  AppOrganizer.h
//  ADHClient
//
//  Created by woodpecker on 2017/11/5.
//  Copyright © 2017年 lifebetter. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


/**
 * parameters that specify which mac client you'd like connect to
 * learn more at http://www.woodpeck.cn/connection.html
 */
extern NSString *const kADHHostName;
extern NSString *const kADHHostAddress;
extern NSString *const kADHAutoConnectEnabled;
extern NSString *const kADHUIGestureEnabled;


@interface ADHOrganizer : NSObject

+ (ADHOrganizer *)sharedOrganizer;

/**
 * register your own ADHService
 * learn more about custom service, please visit http://www.woodpeck.cn/plugin.html
 */
- (void)registerService: (Class)serviceClazz;

/**
 * show connection setup window manually, also you can use gesture too,
 * just long press with two fingers at anywhere of your app.
 */
- (void)showUI;


@end


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHRequest.h
================================================
//
//  ADHRequest.h
//  ADHClient
//
//  Created by woodpecker on 2017/11/4.
//  Copyright © 2017年 lifebetter. All rights reserved.
//

#import <Foundation/Foundation.h>


@class ADHRequest;
@class ADHSession;
@class ADHService;

@interface ADHRequest : NSObject

@property (nonatomic, strong) NSString * service;
@property (nonatomic, strong) NSString * action;
@property (nonatomic, strong) NSDictionary * body;
@property (nonatomic, strong) NSData * payload;


//must call at the end of a request
- (void)finish;
- (void)finishWithBody: (NSDictionary *)body;
- (void)finishWithBody: (NSDictionary *)body payload: (NSData *)payload;


@end










================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHService.h
================================================
//
//  ADHService.h
//  AppDevelopHelper
//
//  Created by woodpecker on 2017/11/4.
//  Copyright © 2017年 lifebetter. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface ADHService : NSObject

/**
 service name
 */
+ (NSString *)serviceName;

/**
 action list

 return @{
    @"actionName1" : selector1 string,
    @"actionName2" : selector2 string,
 };
 */
+ (NSDictionary<NSString*,NSString *> *)actionList;

/**
 YES: all request use one shared service instance.
 NO: each request use a new service instance.
 */
+ (BOOL)isShared;

/**
 called on service init
 */
- (void)onServiceInit;


@end


@interface ADHAction: NSObject

@property (nonatomic, strong) NSString * service;
@property (nonatomic, strong) NSString * name;
@property (nonatomic, strong) NSString * handler;

+ (ADHAction *)actionWithService: (NSString *)service name: (NSString *)name handler: (NSString *)handler;

@end


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/WoodPeckeriOS.h
================================================
//
//  WoodPeckeriOS.h
//  WoodPeckeriOS
//
//  Created by woodpecker on 2018/1/7.
//  Copyright © 2018年 lifebetter. All rights reserved.
//

#import <UIKit/UIKit.h>

//! Project version number for WoodPeckeriOS.
FOUNDATION_EXPORT double WoodPeckeriOSVersionNumber;

//! Project version string for WoodPeckeriOS.
FOUNDATION_EXPORT const unsigned char WoodPeckeriOSVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <WoodPeckeriOS/PublicHeader.h>

#import <WoodPeckeriOS/ADHOrganizer.h>
#import <WoodPeckeriOS/ADHRequest.h>
#import <WoodPeckeriOS/ADHService.h>
#import <WoodPeckeriOS/ADHLogger.h>



================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Modules/module.modulemap
================================================
framework module WoodPeckeriOS {
  umbrella header "WoodPeckeriOS.h"

  export *
  module * { export * }
}


================================================
FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/_CodeSignature/CodeResources
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>files</key>
	<dict>
		<key>ADHConnectViewController.nib</key>
		<data>
		pqKfhkAkrBNujLZE2Ee203g6yQ8=
		</data>
		<key>ADHRemoteServiceCell.nib</key>
		<data>
		4EZm1JVZi6H8//9xa6WvF0M3POc=
		</data>
		<key>Headers/ADHLogger.h</key>
		<data>
		tr7ZIT8mFwHtfZNYOU7gcSui7M0=
		</data>
		<key>Headers/ADHOrganizer.h</key>
		<data>
		xjxX+wbxgeNkXtwk1oUJrkYJQuo=
		</data>
		<key>Headers/ADHRequest.h</key>
		<data>
		ImkUqO+N052g2ypMPoBtobY4s6g=
		</data>
		<key>Headers/ADHService.h</key>
		<data>
		6SENU3Ad9+OcQ0slfAzrqpYzx9s=
		</data>
		<key>Headers/WoodPeckeriOS.h</key>
		<data>
		725LXPFZloMNOizfCL/tkXqCgiQ=
		</data>
		<key>Info.plist</key>
		<data>
		oMaB50N6kkDT7PV6DFqHL1IW2gw=
		</data>
		<key>Modules/module.modulemap</key>
		<data>
		uytDu9Ql07vN0alhWqpDzzrojIs=
		</data>
		<key>adhwebdebugger.bundle/mock.js</key>
		<data>
		YIsJN3YRR6UMoFhsBgb4JdY6tpg=
		</data>
	</dict>
	<key>files2</key>
	<dict>
		<key>ADHConnectViewController.nib</key>
		<dict>
			<key>hash2</key>
			<data>
			FE5aUJkN1d13EzbgXbaQBtY3OQSGwW5XZtSSb5Clyxw=
			</data>
		</dict>
		<key>ADHRemoteServiceCell.nib</key>
		<dict>
			<key>hash2</key>
			<data>
			Po7DobIgRzXW62+4vL8El1TIzc5uGTIMIC2NLxTwmqk=
			</data>
		</dict>
		<key>Headers/ADHLogger.h</key>
		<dict>
			<key>hash2</key>
			<data>
			I/Vh0EI2tIImYyjGDjEHMp4wAfoq8upkDFOD97tr7tU=
			</data>
		</dict>
		<key>Headers/ADHOrganizer.h</key>
		<dict>
			<key>hash2</key>
			<data>
			DPmD7L8x7uJCdrgXHiQ6ztxVhsxW9ItGP/NS3pAQDpM=
			</data>
		</dict>
		<key>Headers/ADHRequest.h</key>
		<dict>
			<key>hash2</key>
			<data>
			kxMpI4TuI/X4D1lz6txphCFANrdR4pWSFVOT/ORLEqc=
			</data>
		</dict>
		<key>Headers/ADHService.h</key>
		<dict>
			<key>hash2</key>
			<data>
			9dlef+1QknEeYNfSnzmCv5MRj2e85DI2fA1BGlfdiDE=
			</data>
		</dict>
		<key>Headers/WoodPeckeriOS.h</key>
		<dict>
			<key>hash2</key>
			<data>
			u/8B5RVVynf7ouOSIM9W2I1djZC82Xvo0/XS3WDACzk=
			</data>
		</dict>
		<key>Modules/module.modulemap</key>
		<dict>
			<key>hash2</key>
			<data>
			1PST2FmpFCkiPZ3i3V5g1CguJHZwfC2IwIxxLUV68nY=
			</data>
		</dict>
		<key>adhwebdebugger.bundle/mock.js</key>
		<dict>
			<key>hash2</key>
			<data>
			EML+wVyc32okro6yPkBnzQAG83hZugzIxJDI5qjNgNI=
			</data>
		</dict>
	</dict>
	<key>rules</key>
	<dict>
		<key>^.*</key>
		<true/>
		<key>^.*\.lproj/</key>
		<dict>
			<key>optional</key>
			<true/>
			<key>weight</key>
			<real>1000</real>
		</dict>
		<key>^.*\.lproj/locversion.plist$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>1100</real>
		</dict>
		<key>^Base\.lproj/</key>
		<dict>
			<key>weight</key>
			<real>1010</real>
		</dict>
		<key>^version.plist$</key>
		<true/>
	</dict>
	<key>rules2</key>
	<dict>
		<key>.*\.dSYM($|/)</key>
		<dict>
			<key>weight</key>
			<real>11</real>
		</dict>
		<key>^(.*/)?\.DS_Store$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>2000</real>
		</dict>
		<key>^.*</key>
		<true/>
		<key>^.*\.lproj/</key>
		<dict>
			<key>optional</key>
			<true/>
			<key>weight</key>
			<real>1000</real>
		</dict>
		<key>^.*\.lproj/locversion.plist$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>1100</real>
		</dict>
		<key>^Base\.lproj/</key>
		<dict>
			<key>weight</key>
			<real>1010</real>
		</dict>
		<key>^Info\.plist$</key>
		<dict>
			<key>omit</key>
			<true/>
			<key>weight</key>
			<real>20</real>
		</dict>
		<key>^PkgInfo$</key>
		<dict>
			<key>omit</key>
			<true/>
			<
Download .txt
gitextract_e3o85i2l/

├── .gitignore
├── LICENSE
├── Package.swift
├── README.md
├── WoodPeckerDemo/
│   ├── WoodPeckerDemo/
│   │   ├── AppDelegate.h
│   │   ├── AppDelegate.m
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── LaunchScreen.storyboard
│   │   ├── Info.plist
│   │   ├── Modules/
│   │   │   ├── Console/
│   │   │   │   ├── ConsoleViewController.h
│   │   │   │   ├── ConsoleViewController.m
│   │   │   │   └── ConsoleViewController.xib
│   │   │   ├── Controller/
│   │   │   │   ├── ControllerHierarchyViewController.h
│   │   │   │   ├── ControllerHierarchyViewController.m
│   │   │   │   └── ControllerHierarchyViewController.xib
│   │   │   ├── Device/
│   │   │   │   ├── DeviceInfoViewController.h
│   │   │   │   ├── DeviceInfoViewController.m
│   │   │   │   └── DeviceInfoViewController.xib
│   │   │   ├── IO/
│   │   │   │   ├── EchoService.h
│   │   │   │   ├── EchoService.m
│   │   │   │   ├── IOViewController.h
│   │   │   │   ├── IOViewController.m
│   │   │   │   └── IOViewController.xib
│   │   │   ├── Network/
│   │   │   │   ├── NetworkViewController.h
│   │   │   │   ├── NetworkViewController.m
│   │   │   │   └── NetworkViewController.xib
│   │   │   ├── Notification/
│   │   │   │   ├── NotificationViewController.h
│   │   │   │   ├── NotificationViewController.m
│   │   │   │   └── NotificationViewController.xib
│   │   │   ├── Sandbox/
│   │   │   │   ├── SandBoxViewController.h
│   │   │   │   ├── SandBoxViewController.m
│   │   │   │   └── SandBoxViewController.xib
│   │   │   └── UserDefaults/
│   │   │       ├── UserDefaultsViewController.h
│   │   │       ├── UserDefaultsViewController.m
│   │   │       └── UserDefaultsViewController.xib
│   │   ├── Structure/
│   │   │   ├── IndexViewController.h
│   │   │   ├── IndexViewController.m
│   │   │   └── IndexViewController.xib
│   │   ├── images.xcassets/
│   │   │   ├── Contents.json
│   │   │   ├── tool_device.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_io.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_network.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_notification.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_sandbox.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_userdefaults.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── tool_webconsole.imageset/
│   │   │       └── Contents.json
│   │   └── main.m
│   └── WoodPeckerDemo.xcodeproj/
│       ├── project.pbxproj
│       └── project.xcworkspace/
│           ├── contents.xcworkspacedata
│           └── xcshareddata/
│               └── IDEWorkspaceChecks.plist
├── WoodPeckerSwiftDemo/
│   ├── WoodPeckerSwiftDemo/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── LaunchScreen.storyboard
│   │   ├── Info.plist
│   │   ├── Modules/
│   │   │   ├── IO/
│   │   │   │   ├── EchoService.swift
│   │   │   │   ├── IOViewController.swift
│   │   │   │   └── IOViewController.xib
│   │   │   ├── Network/
│   │   │   │   ├── NetworkViewController.swift
│   │   │   │   └── NetworkViewController.xib
│   │   │   └── SandBox/
│   │   │       ├── SandBoxViewController.swift
│   │   │       ├── SandboxViewController.temp_caseinsensitive_rename.swift
│   │   │       ├── SandboxViewController.temp_caseinsensitive_rename.xib
│   │   │       └── SandboxViewController.xib
│   │   ├── Structure/
│   │   │   ├── IndexViewController.swift
│   │   │   └── IndexViewController.xib
│   │   ├── WoodPeckerSwiftDemo-Bridging-Header.h
│   │   └── images.xcassets/
│   │       ├── Contents.json
│   │       ├── tool_io.imageset/
│   │       │   └── Contents.json
│   │       ├── tool_network.imageset/
│   │       │   └── Contents.json
│   │       ├── tool_sandbox.imageset/
│   │       │   └── Contents.json
│   │       └── tool_webconsole.imageset/
│   │           └── Contents.json
│   └── WoodPeckerSwiftDemo.xcodeproj/
│       ├── project.pbxproj
│       └── project.xcworkspace/
│           ├── contents.xcworkspacedata
│           └── xcshareddata/
│               └── IDEWorkspaceChecks.plist
├── WoodPeckeriOS-Carthage.json
├── WoodPeckeriOS.podspec
├── WoodPeckeriOS.xcframework/
│   ├── Info.plist
│   ├── ios-arm64/
│   │   └── WoodPeckeriOS.framework/
│   │       ├── ADHConnectViewController.nib
│   │       ├── ADHRemoteServiceCell.nib
│   │       ├── Headers/
│   │       │   ├── ADHLogger.h
│   │       │   ├── ADHOrganizer.h
│   │       │   ├── ADHRequest.h
│   │       │   ├── ADHService.h
│   │       │   └── WoodPeckeriOS.h
│   │       ├── Info.plist
│   │       ├── Modules/
│   │       │   └── module.modulemap
│   │       ├── WoodPeckeriOS
│   │       ├── _CodeSignature/
│   │       │   └── CodeResources
│   │       └── adhwebdebugger.bundle/
│   │           └── mock.js
│   └── ios-arm64_x86_64-simulator/
│       └── WoodPeckeriOS.framework/
│           ├── ADHConnectViewController.nib
│           ├── ADHRemoteServiceCell.nib
│           ├── Headers/
│           │   ├── ADHLogger.h
│           │   ├── ADHOrganizer.h
│           │   ├── ADHRequest.h
│           │   ├── ADHService.h
│           │   └── WoodPeckeriOS.h
│           ├── Info.plist
│           ├── Modules/
│           │   └── module.modulemap
│           ├── WoodPeckeriOS
│           ├── _CodeSignature/
│           │   └── CodeResources
│           └── adhwebdebugger.bundle/
│               └── mock.js
├── WoodpeckerMacDemo/
│   ├── WoodpeckerMacDemo/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── Contents.json
│   │   │   ├── tool_bundle.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_localization.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_network.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_notification.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tool_sandbox.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── tool_userdefaults.imageset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── MainMenu.xib
│   │   ├── Info.plist
│   │   ├── Pages/
│   │   │   ├── Bundle/
│   │   │   │   ├── BundleViewController.swift
│   │   │   │   └── BundleViewController.xib
│   │   │   ├── Localization/
│   │   │   │   ├── LocalizationViewController.swift
│   │   │   │   └── LocalizationViewController.xib
│   │   │   ├── NetworkViewController.swift
│   │   │   ├── NetworkViewController.xib
│   │   │   ├── Notification/
│   │   │   │   ├── NotificationViewController.swift
│   │   │   │   └── NotificationViewController.xib
│   │   │   ├── Sandbox/
│   │   │   │   ├── SandboxViewController.swift
│   │   │   │   └── SandboxViewController.xib
│   │   │   └── UserDefaults/
│   │   │       ├── UserDefaultsViewController.swift
│   │   │       └── UserDefaultsViewController.xib
│   │   ├── WoodpeckerMacDemo.entitlements
│   │   ├── de.lproj/
│   │   │   └── Localizable.strings
│   │   ├── en.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── MainMenu.xib
│   │   ├── fr.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── MainMenu.strings
│   │   └── zh-Hans.lproj/
│   │       ├── Localizable.strings
│   │       └── MainMenu.strings
│   └── WoodpeckerMacDemo.xcodeproj/
│       ├── project.pbxproj
│       └── project.xcworkspace/
│           ├── contents.xcworkspacedata
│           └── xcshareddata/
│               └── IDEWorkspaceChecks.plist
├── WoodpeckerMacOS-Carthage.json
├── WoodpeckerMacOS.framework/
│   └── Versions/
│       └── A/
│           ├── Headers/
│           │   └── WoodpeckerMacOS.h
│           ├── Modules/
│           │   └── module.modulemap
│           ├── Resources/
│           │   ├── ADHMacConnectViewController.nib
│           │   ├── ADHMacRemoteServiceCell.nib
│           │   ├── Assets.car
│           │   └── Info.plist
│           ├── WoodpeckerMacOS
│           └── _CodeSignature/
│               └── CodeResources
└── WoodpeckerMacOS.podspec
Download .txt
SYMBOL INDEX (16 symbols across 2 files)

FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js
  function mockedMethodList (line 5) | function mockedMethodList () {
  function mockConsole (line 11) | function mockConsole() {
  function mockWindowError (line 36) | function mockWindowError() {
  function restoreWindowError (line 46) | function restoreWindowError() {
  function printError (line 57) | function printError(errorMessage, scriptURI, lineNumber,columnNumber) {
  function restoreConsole (line 67) | function restoreConsole() {
  function printLog (line 75) | function printLog(item) {
  function adhMock (line 115) | function adhMock() {

FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js
  function mockedMethodList (line 5) | function mockedMethodList () {
  function mockConsole (line 11) | function mockConsole() {
  function mockWindowError (line 36) | function mockWindowError() {
  function restoreWindowError (line 46) | function restoreWindowError() {
  function printError (line 57) | function printError(errorMessage, scriptURI, lineNumber,columnNumber) {
  function restoreConsole (line 67) | function restoreConsole() {
  function printLog (line 75) | function printLog(item) {
  function adhMock (line 115) | function adhMock() {
Condensed preview — 145 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (426K chars).
[
  {
    "path": ".gitignore",
    "chars": 1398,
    "preview": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n"
  },
  {
    "path": "LICENSE",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Package.swift",
    "chars": 1228,
    "preview": "// swift-tools-version:5.3\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
  },
  {
    "path": "README.md",
    "chars": 665,
    "preview": "\n![logo](http://www.woodpeck.cn/assets/img/logo.png)\n\nHi! this is a demo app for **Woodpecker** ([open source](https://g"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/AppDelegate.h",
    "chars": 289,
    "preview": "//\n//  AppDelegate.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lifebetter."
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/AppDelegate.m",
    "chars": 4769,
    "preview": "//\n//  AppDelegate.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lifebetter."
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1789,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Base.lproj/LaunchScreen.storyboard",
    "chars": 1583,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Info.plist",
    "chars": 1675,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.h",
    "chars": 238,
    "preview": "//\n//  ConsoleViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/6/9.\n//  Copyright © 2018年 li"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.m",
    "chars": 1403,
    "preview": "//\n//  ConsoleViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/6/9.\n//  Copyright © 2018年 li"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.xib",
    "chars": 5130,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.h",
    "chars": 315,
    "preview": "//\n//  ControllerHierarchyViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/5/17.\n//  Copyrig"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.m",
    "chars": 852,
    "preview": "//\n//  ControllerHierarchyViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/5/17.\n//  Copyrig"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.xib",
    "chars": 4295,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.h",
    "chars": 245,
    "preview": "//\n//  DeviceInfoViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/3/17.\n//  Copyright © 2018"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.m",
    "chars": 1398,
    "preview": "//\n//  DeviceInfoViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/3/17.\n//  Copyright © 2018"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.xib",
    "chars": 4294,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/IO/EchoService.h",
    "chars": 312,
    "preview": "//\n//  EchoService.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lifebetter."
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/IO/EchoService.m",
    "chars": 752,
    "preview": "//\n//  EchoService.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lifebetter."
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.h",
    "chars": 229,
    "preview": "//\n//  IOViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lifebe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.m",
    "chars": 748,
    "preview": "//\n//  IOViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lifebe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.xib",
    "chars": 4444,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.h",
    "chars": 239,
    "preview": "//\n//  NetworkViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 l"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.m",
    "chars": 2764,
    "preview": "//\n//  NetworkViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 l"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.xib",
    "chars": 4221,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.h",
    "chars": 248,
    "preview": "//\n//  NotificationViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/6/4.\n//  Copyright © 201"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.m",
    "chars": 3050,
    "preview": "//\n//  NotificationViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/6/4.\n//  Copyright © 201"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.xib",
    "chars": 4347,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.h",
    "chars": 239,
    "preview": "//\n//  SandBoxViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 l"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.m",
    "chars": 1180,
    "preview": "//\n//  SandBoxViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 l"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.xib",
    "chars": 4377,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.h",
    "chars": 249,
    "preview": "//\n//  UserDefaultsViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/3/17.\n//  Copyright © 20"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.m",
    "chars": 695,
    "preview": "//\n//  UserDefaultsViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/3/17.\n//  Copyright © 20"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.xib",
    "chars": 4215,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.h",
    "chars": 235,
    "preview": "//\n//  IndexViewController.h\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lif"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.m",
    "chars": 5164,
    "preview": "//\n//  IndexViewController.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lif"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.xib",
    "chars": 2449,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/images.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_device.imageset/Contents.json",
    "chars": 308,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_device.png\",\n      \"scale\" : \"1x\"\n    },\n  "
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_io.imageset/Contents.json",
    "chars": 304,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_io.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_network.imageset/Contents.json",
    "chars": 309,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_network.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_notification.imageset/Contents.json",
    "chars": 314,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_notification.png\",\n      \"scale\" : \"1x\"\n   "
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_sandbox.imageset/Contents.json",
    "chars": 309,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_sandbox.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_userdefaults.imageset/Contents.json",
    "chars": 314,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_userdefaults.png\",\n      \"scale\" : \"1x\"\n   "
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_webconsole.imageset/Contents.json",
    "chars": 312,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_webconsole.png\",\n      \"scale\" : \"1x\"\n    }"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo/main.m",
    "chars": 346,
    "preview": "//\n//  main.m\n//  WoodPeckerDemo\n//\n//  Created by xiaogang zhang on 2018/1/17.\n//  Copyright © 2018年 lifebetter. All ri"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.pbxproj",
    "chars": 27293,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 159,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:WoodPeckerDemo."
  },
  {
    "path": "WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/AppDelegate.swift",
    "chars": 2531,
    "preview": "//\n//  AppDelegate.swift\n//  WoodPeckerSwiftDemo\n//\n//  Created by xiaogang zhang on 2018/1/20.\n//  Copyright © 2018年 li"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1789,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Base.lproj/LaunchScreen.storyboard",
    "chars": 1844,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Info.plist",
    "chars": 1729,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/EchoService.swift",
    "chars": 627,
    "preview": "//\n//  EchoService.swift\n//  WoodPeckerSwiftDemo\n//\n//  Created by xiaogang zhang on 2018/1/21.\n//  Copyright © 2018年 li"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/IOViewController.swift",
    "chars": 741,
    "preview": "//\n//  IOViewController.swift\n//  WoodPeckerSwiftDemo\n//\n//  Created by xiaogang zhang on 2018/1/21.\n//  Copyright © 201"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/IOViewController.xib",
    "chars": 4444,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/Network/NetworkViewController.swift",
    "chars": 2302,
    "preview": "//\n//  NetworkViewController.swift\n//  WoodPeckerSwiftDemo\n//\n//  Created by xiaogang zhang on 2018/1/21.\n//  Copyright "
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/Network/NetworkViewController.xib",
    "chars": 4221,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandBoxViewController.swift",
    "chars": 1209,
    "preview": "//\n//  SandBoxViewController.swift\n//  WoodPeckerSwiftDemo\n//\n//  Created by xiaogang zhang on 2018/1/20.\n//  Copyright "
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.temp_caseinsensitive_rename.swift",
    "chars": 1209,
    "preview": "//\n//  SandBoxViewController.swift\n//  WoodPeckerSwiftDemo\n//\n//  Created by xiaogang zhang on 2018/1/20.\n//  Copyright "
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.temp_caseinsensitive_rename.xib",
    "chars": 4354,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.xib",
    "chars": 4212,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Structure/IndexViewController.swift",
    "chars": 3370,
    "preview": "//\n//  IndexViewController.swift\n//  WoodPeckerSwiftDemo\n//\n//  Created by xiaogang zhang on 2018/1/20.\n//  Copyright © "
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Structure/IndexViewController.xib",
    "chars": 2449,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo-Bridging-Header.h",
    "chars": 191,
    "preview": "//\n//  objcBridge.h\n//  WoodPeckerSwiftDemo\n//\n//  Created by xiaogang zhang on 2018/1/21.\n//  Copyright © 2018年 lifebet"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_io.imageset/Contents.json",
    "chars": 304,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_io.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_network.imageset/Contents.json",
    "chars": 309,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_network.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_sandbox.imageset/Contents.json",
    "chars": 309,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_sandbox.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_webconsole.imageset/Contents.json",
    "chars": 312,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_webconsole.png\",\n      \"scale\" : \"1x\"\n    }"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.pbxproj",
    "chars": 19151,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 164,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:WoodPeckerSwift"
  },
  {
    "path": "WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodPeckeriOS-Carthage.json",
    "chars": 3649,
    "preview": "{\n\t\"1.0.3\": \"https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.3/WoodPeckeriOS.framework.zip\",\n\t\"1.0"
  },
  {
    "path": "WoodPeckeriOS.podspec",
    "chars": 1004,
    "preview": "Pod::Spec.new do |s|\n\n  s.name                        = \"WoodPeckeriOS\"\n  s.version                     = \"1.4.3\"\n  s.su"
  },
  {
    "path": "WoodPeckeriOS.xcframework/Info.plist",
    "chars": 1054,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHLogger.h",
    "chars": 469,
    "preview": "//\n//  ADHLogger.h\n//  ADHClient\n//\n//  Created by 张小刚 on 2017/12/30.\n//  Copyright © 2017年 lifebetter. All rights reser"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHOrganizer.h",
    "chars": 906,
    "preview": "//\n//  AppOrganizer.h\n//  ADHClient\n//\n//  Created by woodpecker on 2017/11/5.\n//  Copyright © 2017年 lifebetter. All rig"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHRequest.h",
    "chars": 650,
    "preview": "//\n//  ADHRequest.h\n//  ADHClient\n//\n//  Created by woodpecker on 2017/11/4.\n//  Copyright © 2017年 lifebetter. All right"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHService.h",
    "chars": 911,
    "preview": "//\n//  ADHService.h\n//  AppDevelopHelper\n//\n//  Created by woodpecker on 2017/11/4.\n//  Copyright © 2017年 lifebetter. Al"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/WoodPeckeriOS.h",
    "chars": 672,
    "preview": "//\n//  WoodPeckeriOS.h\n//  WoodPeckeriOS\n//\n//  Created by woodpecker on 2018/1/7.\n//  Copyright © 2018年 lifebetter. All"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Modules/module.modulemap",
    "chars": 107,
    "preview": "framework module WoodPeckeriOS {\n  umbrella header \"WoodPeckeriOS.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/_CodeSignature/CodeResources",
    "chars": 3898,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js",
    "chars": 2772,
    "preview": "/**\n* mock window's console methods(log,info,warn,debug,error) and window.onerror\n*/\n\nfunction mockedMethodList () {\n   "
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHLogger.h",
    "chars": 469,
    "preview": "//\n//  ADHLogger.h\n//  ADHClient\n//\n//  Created by 张小刚 on 2017/12/30.\n//  Copyright © 2017年 lifebetter. All rights reser"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHOrganizer.h",
    "chars": 906,
    "preview": "//\n//  AppOrganizer.h\n//  ADHClient\n//\n//  Created by woodpecker on 2017/11/5.\n//  Copyright © 2017年 lifebetter. All rig"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHRequest.h",
    "chars": 650,
    "preview": "//\n//  ADHRequest.h\n//  ADHClient\n//\n//  Created by woodpecker on 2017/11/4.\n//  Copyright © 2017年 lifebetter. All right"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHService.h",
    "chars": 911,
    "preview": "//\n//  ADHService.h\n//  AppDevelopHelper\n//\n//  Created by woodpecker on 2017/11/4.\n//  Copyright © 2017年 lifebetter. Al"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/WoodPeckeriOS.h",
    "chars": 672,
    "preview": "//\n//  WoodPeckeriOS.h\n//  WoodPeckeriOS\n//\n//  Created by woodpecker on 2018/1/7.\n//  Copyright © 2018年 lifebetter. All"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Modules/module.modulemap",
    "chars": 107,
    "preview": "framework module WoodPeckeriOS {\n  umbrella header \"WoodPeckeriOS.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/_CodeSignature/CodeResources",
    "chars": 3898,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js",
    "chars": 2772,
    "preview": "/**\n* mock window's console methods(log,info,warn,debug,error) and window.onerror\n*/\n\nfunction mockedMethodList () {\n   "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/AppDelegate.swift",
    "chars": 2369,
    "preview": "//\n//  AppDelegate.swift\n//  WoodpeckerMacDemo\n//\n//  Created by xiaogang zhang on 2019/6/1.\n//  Copyright © 2019 LIFE B"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 903,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_bundle.imageset/Contents.json",
    "chars": 308,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_bundle.png\",\n      \"scale\" : \"1x\"\n    },\n  "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_localization.imageset/Contents.json",
    "chars": 314,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_localization.png\",\n      \"scale\" : \"1x\"\n   "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_network.imageset/Contents.json",
    "chars": 309,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_network.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_notification.imageset/Contents.json",
    "chars": 314,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_notification.png\",\n      \"scale\" : \"1x\"\n   "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_sandbox.imageset/Contents.json",
    "chars": 309,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_sandbox.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_userdefaults.imageset/Contents.json",
    "chars": 314,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tool_userdefaults.png\",\n      \"scale\" : \"1x\"\n   "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Base.lproj/MainMenu.xib",
    "chars": 51753,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Info.plist",
    "chars": 1144,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Bundle/BundleViewController.swift",
    "chars": 329,
    "preview": "//\n//  BundleViewController.swift\n//  WoodpeckerMacDemo\n//\n//  Created by xiaogang zhang on 2019/6/1.\n//  Copyright © 20"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Bundle/BundleViewController.xib",
    "chars": 2570,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Localization/LocalizationViewController.swift",
    "chars": 341,
    "preview": "//\n//  LocalizationViewController.swift\n//  WoodpeckerMacDemo\n//\n//  Created by xiaogang zhang on 2019/6/1.\n//  Copyrigh"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Localization/LocalizationViewController.xib",
    "chars": 2628,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/NetworkViewController.swift",
    "chars": 1561,
    "preview": "//\n//  NetworkViewController.swift\n//  WoodpeckerMacDemo\n//\n//  Created by xiaogang zhang on 2019/6/1.\n//  Copyright © 2"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/NetworkViewController.xib",
    "chars": 3444,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Notification/NotificationViewController.swift",
    "chars": 2786,
    "preview": "//\n//  NotificationViewController.swift\n//  WoodpeckerMacDemo\n//\n//  Created by xiaogang zhang on 2019/6/1.\n//  Copyrigh"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Notification/NotificationViewController.xib",
    "chars": 4392,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Sandbox/SandboxViewController.swift",
    "chars": 1046,
    "preview": "//\n//  SandboxViewController.swift\n//  WoodpeckerMacDemo\n//\n//  Created by xiaogang zhang on 2019/6/1.\n//  Copyright © 2"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Sandbox/SandboxViewController.xib",
    "chars": 3517,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/UserDefaults/UserDefaultsViewController.swift",
    "chars": 490,
    "preview": "//\n//  UserDefaultsViewController.swift\n//  WoodpeckerMacDemo\n//\n//  Created by xiaogang zhang on 2019/6/1.\n//  Copyrigh"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/UserDefaults/UserDefaultsViewController.xib",
    "chars": 3450,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/WoodpeckerMacDemo.entitlements",
    "chars": 420,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/de.lproj/Localizable.strings",
    "chars": 150,
    "preview": "/* \n  Localizable.strings\n  WoodpeckerMacDemo\n\n  Created by 张小刚 on 2019/6/1.\n  Copyright © 2019 LIFE BETTER. All rights "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/en.lproj/Localizable.strings",
    "chars": 156,
    "preview": "/* \n  Localizable.strings\n  WoodpeckerMacDemo\n\n  Created by xiaogang zhang on 2019/6/1.\n  Copyright © 2019 LIFE BETTER. "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/en.lproj/MainMenu.xib",
    "chars": 51753,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/fr.lproj/Localizable.strings",
    "chars": 161,
    "preview": "/* \n  Localizable.strings\n  WoodpeckerMacDemo\n\n  Created by xiaogang zhang on 2019/6/1.\n  Copyright © 2019 LIFE BETTER. "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/fr.lproj/MainMenu.strings",
    "chars": 14814,
    "preview": "\n/* Class = \"NSMenuItem\"; title = \"Customize Toolbar…\"; ObjectID = \"1UK-8n-QPP\"; */\n\"1UK-8n-QPP.title\" = \"Customize Tool"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/zh-Hans.lproj/Localizable.strings",
    "chars": 156,
    "preview": "/* \n  Localizable.strings\n  WoodpeckerMacDemo\n\n  Created by xiaogang zhang on 2019/6/1.\n  Copyright © 2019 LIFE BETTER. "
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo/zh-Hans.lproj/MainMenu.strings",
    "chars": 14814,
    "preview": "\n/* Class = \"NSMenuItem\"; title = \"Customize Toolbar…\"; ObjectID = \"1UK-8n-QPP\"; */\n\"1UK-8n-QPP.title\" = \"Customize Tool"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo.xcodeproj/project.pbxproj",
    "chars": 22843,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 162,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:WoodpeckerMacDe"
  },
  {
    "path": "WoodpeckerMacDemo/WoodpeckerMacDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodpeckerMacOS-Carthage.json",
    "chars": 232,
    "preview": "{\n\t\"1.2.2\": \"https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.2/WoodpeckerMacOS.framework.zip\",\n\t\"1"
  },
  {
    "path": "WoodpeckerMacOS.framework/Versions/A/Headers/WoodpeckerMacOS.h",
    "chars": 530,
    "preview": "//\n//  WoodpeckerMacOS.h\n//  WoodpeckerMacOS\n//\n//  Created by 张小刚 on 2019/5/25.\n//  Copyright © 2019 lifebetter. All ri"
  },
  {
    "path": "WoodpeckerMacOS.framework/Versions/A/Modules/module.modulemap",
    "chars": 111,
    "preview": "framework module WoodpeckerMacOS {\n  umbrella header \"WoodpeckerMacOS.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "WoodpeckerMacOS.framework/Versions/A/Resources/Info.plist",
    "chars": 1295,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodpeckerMacOS.framework/Versions/A/_CodeSignature/CodeResources",
    "chars": 3921,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "WoodpeckerMacOS.podspec",
    "chars": 838,
    "preview": "Pod::Spec.new do |s|\n\n  s.name                        = \"WoodpeckerMacOS\"\n  s.version                     = \"1.2.3\"\n  s."
  }
]

// ... and 12 more files (download for full content)

About this extraction

This page contains the full source code of the appwoodpecker/woodpecker-ios GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 145 files (374.8 KB), approximately 107.0k tokens, and a symbol index with 16 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.

Copied to clipboard!