documentation/API update

This commit is contained in:
Joseph Henry
2016-07-14 08:40:40 -07:00
parent 1487ac304c
commit f805b0d285
25 changed files with 375 additions and 203 deletions

View File

@@ -1,7 +1,7 @@
ZeroTier Integrations
====
If you want everything built at once, type `make all` and go play outside for a few minutes, we'll copy all of the targets into the `build` directory for you along with specific instructions on how to use each binary. You can then use `make -s check` to check the build status of each binary target.
If you want everything built at once, type `make all` and go play outside for a few minutes, we'll copy all of the targets into the `build` directory for you along with specific instructions contained in a `README.md` on how to use each binary. You can then use `make -s check` to check the build status of each binary target.
*NOTE for Apple platforms: In order to build iOS/OSX Frameworks and Bundles you will need XCode command line tools `xcode-select --install`*
@@ -32,7 +32,7 @@ For more support on these integrations, or if you'd like help creating a new int
***
## Current Integrations
### Apple
### Apple `make apple`
##### iOS
- [Embedding within an app](../docs/ios_zt_sdk.md) `make ios_app_framework`
- [Unity3D plugin](../docs/unity3d_ios_zt_sdk.md) `make ios_unity3d_bundle`
@@ -45,9 +45,9 @@ For more support on these integrations, or if you'd like help creating a new int
***
### Linux
- [Dynamic-linking into an app/service at runtime](../docs/linux_zt_sdk.md) `make linux_shared_lib`
- [Using the SDK with Docker](../docs/docker_linux_zt_sdk.md) `make linux_shared_lib`
- [Using the SDK with Doc;ker](../docs/docker_linux_zt_sdk.md) `make linux_shared_lib`
### Android
### Android `make android`
- [Embedding within an app](../docs/android_zt_sdk.md) `make android_jni_lib`
- [Unity 3D plugin](../docs/unity3d_android_zt_sdk.md) `make android_unity3d_plugin`

View File

@@ -1,13 +1,13 @@
NDK_TOOLCHAIN_VERSION := clang
APP_STL := c++_static
APP_CPPFLAGS := -O3 -DUSE_SOCKS_PROXY -DSDK -fPIC -fPIE -fvectorize -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1
APP_CPPFLAGS := -O3 -DZT_DEBUG -DSDK_DEBUG -DLWIP_DEBUG -DUSE_SOCKS_PROXY -DSDK -fPIC -fPIE -fvectorize -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1
APP_PLATFORM := android-14
# Architectures
# APP_ABI := all
#APP_ABI += arm64-v8a
#APP_ABI += armeabi
APP_ABI += armeabi-v7a
APP_ABI += armeabi
#APP_ABI += armeabi-v7a
#APP_ABI += mips
#APP_ABI += mips64
#APP_ABI += x86

View File

@@ -4,6 +4,5 @@ public class SDK {
public native void joinNetwork(String nwid);
public native void leaveNetwork(String nwid);
public native boolean isRunning();
static { System.loadLibrary("ZeroTierOneJNI"); } // Loads JNI code
}

View File

@@ -32,7 +32,7 @@ public class MainActivity extends AppCompatActivity {
Log.d("SDK-Javaland", "Waiting...\n");
}
Log.d("SDK-Javaland","Joining network...\n");
wrapper.joinNetwork("e5cd7a9e1c3511dd");
wrapper.joinNetwork("565799d8f65063e5");
// Set up example proxy connection to SDK proxy server
Log.d("ZTSDK-InJavaland", "Setting up connection to SDK proxy server");

View File

@@ -1402,7 +1402,6 @@
OTHER_CFLAGS = (
"-D__UNITY_3D__",
"-DSDK",
"-DSDK_DEBUG",
);
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-Unity3D-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1433,6 +1432,7 @@
"-DSDK_DEBUG",
"-DSDK",
"-D__IOS__",
"-DLWIP_DEBUG",
);
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1459,8 +1459,8 @@
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-DSDK_DEBUG",
"-DSDK",
"-D__IOS__",
);
@@ -1496,6 +1496,7 @@
"-DSDK_BUNDLED",
"-DSDK_DEBUG",
"-D__XCODE__",
"-DLWIP_DEBUG",
);
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1520,11 +1521,11 @@
INFOPLIST_FILE = ZeroTierSDK_OSX/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-DSDK",
"-DSDK_SERVICE",
"-DSDK_BUNDLED",
"-DSDK_DEBUG",
"-D__XCODE__",
);
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX";
@@ -1567,8 +1568,8 @@
);
INFOPLIST_FILE = ZeroTierSDK_Unity3D_OSX/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-DSDK_DEBUG",
"-DSDK",
"-D__UNITY_3D__",
);

View File

@@ -0,0 +1,30 @@
{
"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "E606611F311EBBA46CDC9112D11FA5B7A3480FA9",
"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
},
"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
"ABA3617E9F0148F844A82502F0D808DE6591AA97" : 0,
"E606611F311EBBA46CDC9112D11FA5B7A3480FA9" : 0
},
"DVTSourceControlWorkspaceBlueprintIdentifierKey" : "0231F1D2-335A-48B9-9ED2-F5EC32297E1C",
"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
"ABA3617E9F0148F844A82502F0D808DE6591AA97" : "zerotiersdk\/zerotierone\/",
"E606611F311EBBA46CDC9112D11FA5B7A3480FA9" : "zerotiersdk\/"
},
"DVTSourceControlWorkspaceBlueprintNameKey" : "ZeroTierSDK_Apple",
"DVTSourceControlWorkspaceBlueprintVersion" : 204,
"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "integrations\/apple\/ZeroTierSDK_Apple\/ZeroTierSDK_Apple.xcodeproj",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "http:\/\/git.int.zerotier.com\/ZeroTier\/ZeroTierOne.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "ABA3617E9F0148F844A82502F0D808DE6591AA97"
},
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "http:\/\/git.int.zerotier.com\/zerotier\/zerotiersdk.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "E606611F311EBBA46CDC9112D11FA5B7A3480FA9"
}
]
}

View File

@@ -12,9 +12,24 @@
7C8BC0411D3348A6001E1B6F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C8BC03F1D3348A6001E1B6F /* Main.storyboard */; };
7C8BC0431D3348A6001E1B6F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7C8BC0421D3348A6001E1B6F /* Assets.xcassets */; };
7C8BC0461D3348A6001E1B6F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C8BC0441D3348A6001E1B6F /* LaunchScreen.storyboard */; };
7C8BC04E1D334911001E1B6F /* ZeroTierSDK_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C8BC04D1D334911001E1B6F /* ZeroTierSDK_iOS.framework */; };
7C9B10DA1D36C81F005BA825 /* ZeroTierSDK_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C9B10D81D36C615005BA825 /* ZeroTierSDK_iOS.framework */; };
7C9B10DB1D36C81F005BA825 /* ZeroTierSDK_iOS.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C9B10D81D36C615005BA825 /* ZeroTierSDK_iOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
7C9B10DC1D36C81F005BA825 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
7C9B10DB1D36C81F005BA825 /* ZeroTierSDK_iOS.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
7C8BC0381D3348A6001E1B6F /* Example_iOS_App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example_iOS_App.app; sourceTree = BUILT_PRODUCTS_DIR; };
7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -23,7 +38,7 @@
7C8BC0421D3348A6001E1B6F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
7C8BC0451D3348A6001E1B6F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
7C8BC0471D3348A6001E1B6F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
7C8BC04D1D334911001E1B6F /* ZeroTierSDK_iOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ZeroTierSDK_iOS.framework; path = "../../../../build/ios_app_framework/Debug-iphoneos/ZeroTierSDK_iOS.framework"; sourceTree = "<group>"; };
7C9B10D81D36C615005BA825 /* ZeroTierSDK_iOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ZeroTierSDK_iOS.framework; path = "../../../../build/ios_app_framework/Debug-iphoneos/ZeroTierSDK_iOS.framework"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -31,7 +46,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
7C8BC04E1D334911001E1B6F /* ZeroTierSDK_iOS.framework in Frameworks */,
7C9B10DA1D36C81F005BA825 /* ZeroTierSDK_iOS.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -41,7 +56,7 @@
7C8BC02F1D3348A6001E1B6F = {
isa = PBXGroup;
children = (
7C8BC04D1D334911001E1B6F /* ZeroTierSDK_iOS.framework */,
7C9B10D81D36C615005BA825 /* ZeroTierSDK_iOS.framework */,
7C8BC03A1D3348A6001E1B6F /* Example_iOS_App */,
7C8BC0391D3348A6001E1B6F /* Products */,
);
@@ -78,6 +93,7 @@
7C8BC0341D3348A6001E1B6F /* Sources */,
7C8BC0351D3348A6001E1B6F /* Frameworks */,
7C8BC0361D3348A6001E1B6F /* Resources */,
7C9B10DC1D36C81F005BA825 /* Embed Frameworks */,
);
buildRules = (
);
@@ -256,7 +272,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = Example_iOS_App/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks $(SRC_ROOT)/../../";
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.Example-iOS-App";
PRODUCT_NAME = "$(TARGET_NAME)";
};
@@ -267,7 +283,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = Example_iOS_App/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks $(SRC_ROOT)/../../";
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.Example-iOS-App";
PRODUCT_NAME = "$(TARGET_NAME)";
};
@@ -292,6 +308,7 @@
7C8BC04C1D3348A6001E1B6F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};

View File

@@ -59,6 +59,11 @@
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
}
],
"info" : {

View File

@@ -16,11 +16,122 @@
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sM5-GM-4R8">
<rect key="frame" x="183" y="314" width="59" height="30"/>
<state key="normal" title="Connect"/>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9Qv-V2-VnT">
<rect key="frame" x="157" y="264" width="46" height="30"/>
<state key="normal" title="Button"/>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dwn-d8-Ki3">
<rect key="frame" x="183" y="352" width="31" height="30"/>
<state key="normal" title="Bind"/>
</button>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="ip address" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="6id-4C-E8W">
<rect key="frame" x="20" y="275" width="147" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="port" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="uiQ-EM-gfq">
<rect key="frame" x="175" y="276" width="97" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Protocol" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fn2-mn-MjK">
<rect key="frame" x="20" y="147" width="64" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Remote Host" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9rm-WW-ji2">
<rect key="frame" x="20" y="239" width="100" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lnh-9e-LMk">
<rect key="frame" x="401" y="281" width="42" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="bqB-xS-7Oo">
<rect key="frame" x="423" y="115" width="97" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<segmentedControl opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="mgD-Qw-uwg">
<rect key="frame" x="20" y="96" width="121" height="29"/>
<segments>
<segment title="First"/>
<segment title="Second"/>
</segments>
</segmentedControl>
<segmentedControl opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="vwT-sy-CRY">
<rect key="frame" x="20" y="176" width="121" height="29"/>
<segments>
<segment title="First"/>
<segment title="Second"/>
</segments>
</segmentedControl>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="API" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bOi-uD-nTW">
<rect key="frame" x="20" y="67" width="26" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="ZeroTier iOS Example App" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="h4F-YA-Rsh">
<rect key="frame" x="20" y="20" width="200" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dp1-qj-Mq8">
<rect key="frame" x="160" y="491" width="41" height="30"/>
<state key="normal" title="read()"/>
</button>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="EBa-HV-MZ5">
<rect key="frame" x="20" y="453" width="132" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="ZjP-35-mln">
<rect key="frame" x="160" y="453" width="132" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="RX" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="z5X-D0-I5d">
<rect key="frame" x="165" y="424" width="22" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="TX" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tho-Qu-UmE">
<rect key="frame" x="20" y="424" width="22" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BfY-Te-yWV">
<rect key="frame" x="20" y="492" width="45" height="30"/>
<state key="normal" title="write()"/>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<variation key="default">
<mask key="subviews">
<exclude reference="9Qv-V2-VnT"/>
<exclude reference="Lnh-9e-LMk"/>
<exclude reference="bqB-xS-7Oo"/>
</mask>
</variation>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="211" y="464"/>
</scene>
</scenes>
</document>