diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/.appveyor.yml softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/.appveyor.yml --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/.appveyor.yml 2019-04-21 08:03:28.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/.appveyor.yml 2019-07-23 21:37:11.000000000 +0000 @@ -82,7 +82,7 @@ only: - image: Ubuntu1804 before_build: - - sh: "if [ ${APPVEYOR_REPO_TAG} == \"true\" ]; then tar --exclude=.git -czf /tmp/${APPVEYOR_REPO_TAG_NAME}.tar.gz . && appveyor PushArtifact /tmp/${APPVEYOR_REPO_TAG_NAME}.tar.gz \nfi" + - sh: "if [ ${APPVEYOR_REPO_TAG} == \"true\" ]; then .ci/appveyor-create-release-tarball.sh\nfi" - ./configure build_script: - make package -C tmp -j $(nproc || sysctl -n hw.ncpu || echo 4) diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/.ci/appveyor-create-release-tarball.sh softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/.ci/appveyor-create-release-tarball.sh --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/.ci/appveyor-create-release-tarball.sh 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/.ci/appveyor-create-release-tarball.sh 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,7 @@ +#!/bin/bash + +set -eux + +tar --exclude=.git --transform "s//SoftEtherVPN-${APPVEYOR_REPO_TAG_NAME}\//" -czf /tmp/softether-vpn-src-${APPVEYOR_REPO_TAG_NAME}.tar.gz . +appveyor PushArtifact /tmp/softether-vpn-src-${APPVEYOR_REPO_TAG_NAME}.tar.gz + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/CMakeLists.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/CMakeLists.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/CMakeLists.txt 2019-04-21 08:03:28.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/CMakeLists.txt 2019-07-23 21:37:11.000000000 +0000 @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.7) project("SoftEther VPN" - VERSION 5.01.9670 + VERSION 5.01.9671 LANGUAGES C ) diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/debian/changelog softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/debian/changelog --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/debian/changelog 2019-04-21 08:04:10.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/debian/changelog 2019-07-23 21:38:55.000000000 +0000 @@ -1,8 +1,8 @@ -softether-vpn (5.01.9670~201904081849~ubuntu18.10.1) cosmic; urgency=low +softether-vpn (5.01.9671~201907101749~ubuntu18.10.1) cosmic; urgency=low * Auto build. - -- Dmitry Verkhoturov Sun, 21 Apr 2019 08:04:10 +0000 + -- Dmitry Verkhoturov Tue, 23 Jul 2019 21:38:55 +0000 softether-vpn (0:5.01.9667-0) unstable; urgency=low diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/debian/git-build-recipe.manifest softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/debian/git-build-recipe.manifest --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/debian/git-build-recipe.manifest 2019-04-21 08:04:10.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/debian/git-build-recipe.manifest 2019-07-23 21:38:55.000000000 +0000 @@ -1,6 +1,6 @@ -# git-build-recipe format 0.4 deb-version 5.01.9670~201904081849 -lp:~paskal-07/softether-vpn git-commit:b43a1e76da32c7746dfdea85851c9d5434e01978 -nest cpu_features lp:~paskal-07/softether-vpn/+git/cpu_features src/Mayaqua/3rdparty/cpu_features git-commit:084ec5cd0f29c151f3c036065c74985004bda3dc +# git-build-recipe format 0.4 deb-version 5.01.9671~201907101749 +lp:~paskal-07/softether-vpn git-commit:dcc99fdbb2f2202f5b67855c1f4e2b5e56e9e4a7 +nest cpu_features lp:~paskal-07/softether-vpn/+git/cpu_features src/Mayaqua/3rdparty/cpu_features git-commit:b9593c8b395318bb2bc42683a94f962564cc4664 nest zlib lp:~paskal-07/softether-vpn/+git/zlib src/Mayaqua/3rdparty/zlib git-commit:cacf7f1d4e3d44d871b605da3b647f07d718623f nest-part packaging lp:~paskal-07/softether-vpn/+git/SoftEtherVPN-debianisation debian debian git-commit:0f6aaff8194019abbd7ca26b5d820d6153532279 nest cmake lp:~paskal-07/softether-vpn/+git/cmake debian/cmake git-commit:a78db64f057a1e176196516e7cdc8641d87828d9 diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/README.html softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/README.html --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/README.html 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/README.html 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,14648 @@ + + + + + SoftEther VPN Server JSON-RPC Suite Document + + + + + + +
+

SoftEther VPN Server JSON-RPC API Suite Document

+

This reference describes all JSON-RPC functions available on SoftEther VPN Server.

+

You can access to the latest SoftEther VPN Server JSON-RPC Document on GitHub.

+

What is SoftEther VPN Server JSON-RPC API Suite?

+

The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions).

+
    +
  • Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API.
  • +
  • You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.)
  • +
  • If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server.
  • +
  • No need to use any specific API client library since all APIs are provided on the JSON-RPC 2.0 Specification. You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment.
  • +
  • Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. The Node.js Client Library for VPN Server RPC (vpnrpc) package is also available.
  • +
+

Principle

+

Entry point

+

The entry point URL of JSON-RPC is:

+
https://<vpn_server_hostname>:<port>/api/
+
+
    +
  • Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.
  • +
  • If you want to completely disable the JSON-RPC on your VPN Server, set the DisableJsonRpcWebApi variable to true on the vpn_server.config.
  • +
+

JSON-RPC specification

+

You must use HTTPS 1.1 POST method to call each of JSON-RPC APIs.
+All APIs are based on the JSON-RPC 2.0 Specification.

+
    +
  • JSON-RPC Notification is not supported.
  • +
  • JSON-RPC Batch is not supported.
  • +
+

"vpnrpc": Node.js Client Library package for VPN Server JSON-RPC

+

If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the JavaScript Client Library for VPN Server RPC (vpnrpc).

+
    +
  • You can use the vpnrpc library in JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js.
  • +
  • As a sample code there is the sample.ts program in TypeScript. This sample calls all of available JSON-RPC APIs against the specified SoftEther VPN Server. (Note: This sample code is written in TypeScript.)
  • +
+

You can use the following command to download the vpnrpc library package with Node.js.

+
$ npm install --save-dev vpnrpc
+
+

"vpnrpc.ts": TypeScript Client Library for VPN Server JSON-RPC

+

If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the TypeScript Client Library for VPN Server RPC (vpnrpc.ts).

+
    +
  • You can use the vpnrpc.ts library in TypeScript / JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js.
  • +
  • As a sample code there is the sample.ts program in TypeScript. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server.
  • +
+

"vpnserver-jsonrpc-client-csharp": C# Client Library for VPN Server JSON-RPC

+

If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the vpnserver-jsonrpc-client-csharp C# library.

+
    +
  • The client library codes for C# is written in pure C# 7.3. It works on .NET Core 2.1 or later on Windows, Linux and macOS. Very comfort with Visual Studio for both Windows or macOS.
  • +
  • As a sample code there is the VpnServerRpcTest.cs program in C#. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server.
  • +
+

HTTPS Authentication

+

You must specify the following HTTPS custom headers for authentication on each of requests.

+ + + + + + + + + + + + + + + + + +
ValueDescription
X-VPNADMIN-HUBNAMEThe name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify empty string if you want to connect to the VPN Server as the Entire VPN Server Admin Mode.
X-VPNADMIN-PASSWORDSpecify the administration password.
+
    +
  • You can omit the above HTTPS custom authentication headers if you are calling JSON-RPC APIs from the web browser which is already logged in to the VPN Server with HTTPS Basic Authentication. In such usage the credential of HTTPS Basic Authtication will be used.
  • +
+
+

Table of contents

+ +
+

+

"Test" RPC API - Test RPC function

+

Description

+

Test RPC function. Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "Test",
+  "params": {
+    "IntValue_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"GetServerInfo" RPC API - Get server information

+

Description

+

Get server information. This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetServerInfo",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerProductName_str": "serverproductname",
+    "ServerVersionString_str": "serverversionstring",
+    "ServerBuildInfoString_str": "serverbuildinfostring",
+    "ServerVerInt_u32": 0,
+    "ServerBuildInt_u32": 0,
+    "ServerHostName_str": "serverhostname",
+    "ServerType_u32": 0,
+    "ServerBuildDate_dt": "2020-08-01T12:24:36.123",
+    "ServerFamilyName_str": "serverfamilyname",
+    "OsType_u32": 0,
+    "OsServicePack_u32": 0,
+    "OsSystemName_str": "ossystemname",
+    "OsProductName_str": "osproductname",
+    "OsVendorName_str": "osvendorname",
+    "OsVersion_str": "osversion",
+    "KernelName_str": "kernelname",
+    "KernelVersion_str": "kernelversion"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerProductName_strstring (ASCII)Server product name
ServerVersionString_strstring (ASCII)Server version string
ServerBuildInfoString_strstring (ASCII)Server build information string
ServerVerInt_u32number (uint32)Server version integer value
ServerBuildInt_u32number (uint32)Server build number integer value
ServerHostName_strstring (ASCII)Server host name
ServerType_u32number (enum)Type of server
Values:
0: Stand-alone server
1: Farm controller server
2: Farm member server
ServerBuildDate_dtDateBuild date and time of the server
ServerFamilyName_strstring (ASCII)Family name
OsType_u32number (enum)OS type
Values:
1100: Windows 95
1200: Windows 98
1300: Windows Me
1400: Windows (unknown)
2100: Windows NT 4.0 Workstation
2110: Windows NT 4.0 Server
2111: Windows NT 4.0 Server, Enterprise Edition
2112: Windows NT 4.0 Terminal Server
2113: BackOffice Server 4.5
2114: Small Business Server 4.5
2200: Windows 2000 Professional
2211: Windows 2000 Server
2212: Windows 2000 Advanced Server
2213: Windows 2000 Datacenter Server
2214: BackOffice Server 2000
2215: Small Business Server 2000
2300: Windows XP Home Edition
2301: Windows XP Professional
2410: Windows Server 2003 Web Edition
2411: Windows Server 2003 Standard Edition
2412: Windows Server 2003 Enterprise Edition
2413: Windows Server 2003 DataCenter Edition
2414: BackOffice Server 2003
2415: Small Business Server 2003
2500: Windows Vista
2510: Windows Server 2008
2600: Windows 7
2610: Windows Server 2008 R2
2700: Windows 8
2710: Windows Server 2012
2701: Windows 8.1
2711: Windows Server 2012 R2
2702: Windows 10
2712: Windows Server 10
2800: Windows 11 or later
2810: Windows Server 11 or later
3000: Unknown UNIX
3100: Linux
3200: Solaris
3300: Cygwin
3400: BSD
3500: MacOS X
OsServicePack_u32number (uint32)Service pack number
OsSystemName_strstring (ASCII)OS system name
OsProductName_strstring (ASCII)OS product name
OsVendorName_strstring (ASCII)OS vendor name
OsVersion_strstring (ASCII)OS version
KernelName_strstring (ASCII)Kernel name
KernelVersion_strstring (ASCII)Kernel version
+
+

+

"GetServerStatus" RPC API - Get Current Server Status

+

Description

+

Get Current Server Status. This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetServerStatus",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerType_u32": 0,
+    "NumTcpConnections_u32": 0,
+    "NumTcpConnectionsLocal_u32": 0,
+    "NumTcpConnectionsRemote_u32": 0,
+    "NumHubTotal_u32": 0,
+    "NumHubStandalone_u32": 0,
+    "NumHubStatic_u32": 0,
+    "NumHubDynamic_u32": 0,
+    "NumSessionsTotal_u32": 0,
+    "NumSessionsLocal_u32": 0,
+    "NumSessionsRemote_u32": 0,
+    "NumMacTables_u32": 0,
+    "NumIpTables_u32": 0,
+    "NumUsers_u32": 0,
+    "NumGroups_u32": 0,
+    "AssignedBridgeLicenses_u32": 0,
+    "AssignedClientLicenses_u32": 0,
+    "AssignedBridgeLicensesTotal_u32": 0,
+    "AssignedClientLicensesTotal_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "CurrentTime_dt": "2020-08-01T12:24:36.123",
+    "CurrentTick_u64": 0,
+    "StartTime_dt": "2020-08-01T12:24:36.123",
+    "TotalMemory_u64": 0,
+    "UsedMemory_u64": 0,
+    "FreeMemory_u64": 0,
+    "TotalPhys_u64": 0,
+    "UsedPhys_u64": 0,
+    "FreePhys_u64": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerType_u32number (enum)Type of server
Values:
0: Stand-alone server
1: Farm controller server
2: Farm member server
NumTcpConnections_u32number (uint32)Total number of TCP connections
NumTcpConnectionsLocal_u32number (uint32)Number of Local TCP connections
NumTcpConnectionsRemote_u32number (uint32)Number of remote TCP connections
NumHubTotal_u32number (uint32)Total number of HUBs
NumHubStandalone_u32number (uint32)Nymber of stand-alone HUB
NumHubStatic_u32number (uint32)Number of static HUBs
NumHubDynamic_u32number (uint32)Number of Dynamic HUBs
NumSessionsTotal_u32number (uint32)Total number of sessions
NumSessionsLocal_u32number (uint32)Number of local VPN sessions
NumSessionsRemote_u32number (uint32)The number of remote sessions
NumMacTables_u32number (uint32)Number of MAC table entries (total sum of all Virtual Hubs)
NumIpTables_u32number (uint32)Number of IP table entries (total sum of all Virtual Hubs)
NumUsers_u32number (uint32)Number of users (total sum of all Virtual Hubs)
NumGroups_u32number (uint32)Number of groups (total sum of all Virtual Hubs)
AssignedBridgeLicenses_u32number (uint32)Number of assigned bridge licenses (Useful to make a commercial version)
AssignedClientLicenses_u32number (uint32)Number of assigned client licenses (Useful to make a commercial version)
AssignedBridgeLicensesTotal_u32number (uint32)Number of Assigned bridge license (cluster-wide), useful to make a commercial version
AssignedClientLicensesTotal_u32number (uint32)Number of assigned client licenses (cluster-wide), useful to make a commercial version
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
CurrentTime_dtDateCurrent time
CurrentTick_u64number (uint64)64 bit High-Precision Logical System Clock
StartTime_dtDateVPN Server Start-up time
TotalMemory_u64number (uint64)Memory information: Total Memory
UsedMemory_u64number (uint64)Memory information: Used Memory
FreeMemory_u64number (uint64)Memory information: Free Memory
TotalPhys_u64number (uint64)Memory information: Total Phys
UsedPhys_u64number (uint64)Memory information: Used Phys
FreePhys_u64number (uint64)Memory information: Free Phys
+
+

+

"CreateListener" RPC API - Create New TCP Listener

+

Description

+

Create New TCP Listener. This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateListener",
+  "params": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Port_u32number (uint32)Port number (Range: 1 - 65535)
Enable_boolbooleanActive state
+
+

+

"EnumListener" RPC API - Get List of TCP Listeners

+

Description

+

Get List of TCP Listeners. This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumListener",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ListenerList": [
+      {
+        "Ports_u32": 0,
+        "Enables_bool": false,
+        "Errors_bool": false
+      },
+      {
+        "Ports_u32": 0,
+        "Enables_bool": false,
+        "Errors_bool": false
+      },
+      {
+        "Ports_u32": 0,
+        "Enables_bool": false,
+        "Errors_bool": false
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ListenerListArray objectList of listener items
Ports_u32number (uint32)TCP port number (range: 1 - 65535)
Enables_boolbooleanActive state
Errors_boolbooleanThe flag to indicate if the error occurred on the listener port
+
+

+

"DeleteListener" RPC API - Delete TCP Listener

+

Description

+

Delete TCP Listener. This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteListener",
+  "params": {
+    "Port_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Port_u32number (uint32)Port number (Range: 1 - 65535)
Enable_boolbooleanActive state
+
+

+

"EnableListener" RPC API - Enable / Disable TCP Listener

+

Description

+

Enable / Disable TCP Listener. This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnableListener",
+  "params": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Port_u32number (uint32)Port number (Range: 1 - 65535)
Enable_boolbooleanActive state
+
+

+

"SetServerPassword" RPC API - Set VPN Server Administrator Password

+

Description

+

Set VPN Server Administrator Password. This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetServerPassword",
+  "params": {
+    "PlainTextPassword_str": "plaintextpassword"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "PlainTextPassword_str": "plaintextpassword"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
PlainTextPassword_strstring (ASCII)The plaintext password
+
+

+

"SetFarmSetting" RPC API - Set the VPN Server clustering configuration

+

Description

+

Set the VPN Server clustering configuration. Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetFarmSetting",
+  "params": {
+    "ServerType_u32": 0,
+    "NumPort_u32": 0,
+    "Ports_u32": [
+      1,
+      2,
+      3
+    ],
+    "PublicIp_ip": "192.168.0.1",
+    "ControllerName_str": "controllername",
+    "ControllerPort_u32": 0,
+    "MemberPasswordPlaintext_str": "memberpasswordplaintext",
+    "Weight_u32": 0,
+    "ControllerOnly_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerType_u32": 0,
+    "NumPort_u32": 0,
+    "Ports_u32": [
+      1,
+      2,
+      3
+    ],
+    "PublicIp_ip": "192.168.0.1",
+    "ControllerName_str": "controllername",
+    "ControllerPort_u32": 0,
+    "MemberPasswordPlaintext_str": "memberpasswordplaintext",
+    "Weight_u32": 0,
+    "ControllerOnly_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerType_u32number (enum)Type of server
Values:
0: Stand-alone server
1: Farm controller server
2: Farm member server
NumPort_u32number (uint32)Valid only for Cluster Member servers. Number of the Ports_u32 element.
Ports_u32number[] (uint32)Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers.
PublicIp_ipstring (IP address)Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used.
ControllerName_strstring (ASCII)Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller.
ControllerPort_u32number (uint32)Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller.
MemberPasswordPlaintext_strstring (ASCII)Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller.
Weight_u32number (uint32)This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used.
ControllerOnly_boolbooleanValid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments.
+
+

+

"GetFarmSetting" RPC API - Get Clustering Configuration of Current VPN Server

+

Description

+

Get Clustering Configuration of Current VPN Server. You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetFarmSetting",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerType_u32": 0,
+    "NumPort_u32": 0,
+    "Ports_u32": [
+      1,
+      2,
+      3
+    ],
+    "PublicIp_ip": "192.168.0.1",
+    "ControllerName_str": "controllername",
+    "ControllerPort_u32": 0,
+    "MemberPasswordPlaintext_str": "memberpasswordplaintext",
+    "Weight_u32": 0,
+    "ControllerOnly_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerType_u32number (enum)Type of server
Values:
0: Stand-alone server
1: Farm controller server
2: Farm member server
NumPort_u32number (uint32)Valid only for Cluster Member servers. Number of the Ports_u32 element.
Ports_u32number[] (uint32)Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers.
PublicIp_ipstring (IP address)Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used.
ControllerName_strstring (ASCII)Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller.
ControllerPort_u32number (uint32)Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller.
MemberPasswordPlaintext_strstring (ASCII)Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller.
Weight_u32number (uint32)This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used.
ControllerOnly_boolbooleanValid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments.
+
+

+

"GetFarmInfo" RPC API - Get Cluster Member Information

+

Description

+

Get Cluster Member Information. When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetFarmInfo",
+  "params": {
+    "Id_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Id_u32": 0,
+    "Controller_bool": false,
+    "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+    "Ip_ip": "192.168.0.1",
+    "Hostname_str": "hostname",
+    "Point_u32": 0,
+    "NumPort_u32": 0,
+    "Ports_u32": [
+      1,
+      2,
+      3
+    ],
+    "ServerCert_bin": "SGVsbG8gV29ybGQ=",
+    "NumFarmHub_u32": 0,
+    "HubsList": [
+      {
+        "HubName_str": "hubname",
+        "DynamicHub_bool": false
+      },
+      {
+        "HubName_str": "hubname",
+        "DynamicHub_bool": false
+      },
+      {
+        "HubName_str": "hubname",
+        "DynamicHub_bool": false
+      }
+    ],
+    "NumSessions_u32": 0,
+    "NumTcpConnections_u32": 0,
+    "Weight_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Id_u32number (uint32)ID
Controller_boolbooleanThe flag if the server is Cluster Controller (false: Cluster Member servers)
ConnectedTime_dtDateConnection Established Time
Ip_ipstring (IP address)IP address
Hostname_strstring (ASCII)Host name
Point_u32number (uint32)Point
NumPort_u32number (uint32)Number of Public Ports
Ports_u32number[] (uint32)Public Ports
ServerCert_binstring (Base64 binary)Server certificate
NumFarmHub_u32number (uint32)Number of farm HUB
HubsListArray objectThe hosted Virtual Hub list
NumSessions_u32number (uint32)Number of hosted VPN sessions
NumTcpConnections_u32number (uint32)Number of TCP connections
Weight_u32number (uint32)Performance Standard Ratio
HubName_strstring (ASCII)The Virtual Hub name
DynamicHub_boolbooleanDynamic HUB
+
+

+

"EnumFarmMember" RPC API - Get List of Cluster Members

+

Description

+

Get List of Cluster Members. Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumFarmMember",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "NumFarm_u32": 0,
+    "FarmMemberList": [
+      {
+        "Id_u32": 0,
+        "Controller_bool": false,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Ip_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "Point_u32": 0,
+        "NumSessions_u32": 0,
+        "NumTcpConnections_u32": 0,
+        "NumHubs_u32": 0,
+        "AssignedClientLicense_u32": 0,
+        "AssignedBridgeLicense_u32": 0
+      },
+      {
+        "Id_u32": 0,
+        "Controller_bool": false,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Ip_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "Point_u32": 0,
+        "NumSessions_u32": 0,
+        "NumTcpConnections_u32": 0,
+        "NumHubs_u32": 0,
+        "AssignedClientLicense_u32": 0,
+        "AssignedBridgeLicense_u32": 0
+      },
+      {
+        "Id_u32": 0,
+        "Controller_bool": false,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Ip_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "Point_u32": 0,
+        "NumSessions_u32": 0,
+        "NumTcpConnections_u32": 0,
+        "NumHubs_u32": 0,
+        "AssignedClientLicense_u32": 0,
+        "AssignedBridgeLicense_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
NumFarm_u32number (uint32)Number of Cluster Members
FarmMemberListArray objectCluster Members list
Id_u32number (uint32)ID
Controller_boolbooleanController
ConnectedTime_dtDateConnection time
Ip_ipstring (IP address)IP address
Hostname_strstring (ASCII)Host name
Point_u32number (uint32)Point
NumSessions_u32number (uint32)Number of sessions
NumTcpConnections_u32number (uint32)Number of TCP connections
NumHubs_u32number (uint32)Number of HUBs
AssignedClientLicense_u32number (uint32)Number of assigned client licenses
AssignedBridgeLicense_u32number (uint32)Number of assigned bridge licenses
+
+

+

"GetFarmConnectionStatus" RPC API - Get Connection Status to Cluster Controller

+

Description

+

Get Connection Status to Cluster Controller. Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetFarmConnectionStatus",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Ip_ip": "192.168.0.1",
+    "Port_u32": 0,
+    "Online_bool": false,
+    "LastError_u32": 0,
+    "StartedTime_dt": "2020-08-01T12:24:36.123",
+    "FirstConnectedTime_dt": "2020-08-01T12:24:36.123",
+    "CurrentConnectedTime_dt": "2020-08-01T12:24:36.123",
+    "NumTry_u32": 0,
+    "NumConnected_u32": 0,
+    "NumFailed_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Ip_ipstring (IP address)IP address
Port_u32number (uint32)Port number
Online_boolbooleanOnline state
LastError_u32number (uint32)Last error code
StartedTime_dtDateConnection start time
FirstConnectedTime_dtDateFirst connection time
CurrentConnectedTime_dtDateConnection time of this time
NumTry_u32number (uint32)Number of retries
NumConnected_u32number (uint32)Number of connection count
NumFailed_u32number (uint32)Connection failure count
+
+

+

"SetServerCert" RPC API - Set SSL Certificate and Private Key of VPN Server

+

Description

+

Set SSL Certificate and Private Key of VPN Server. You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetServerCert",
+  "params": {
+    "Cert_bin": "SGVsbG8gV29ybGQ=",
+    "Key_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Cert_bin": "SGVsbG8gV29ybGQ=",
+    "Key_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Cert_binstring (Base64 binary)The body of the certificate
Key_binstring (Base64 binary)The body of the private key
+
+

+

"GetServerCert" RPC API - Get SSL Certificate and Private Key of VPN Server

+

Description

+

Get SSL Certificate and Private Key of VPN Server. Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetServerCert",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Cert_bin": "SGVsbG8gV29ybGQ=",
+    "Key_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Cert_binstring (Base64 binary)The body of the certificate
Key_binstring (Base64 binary)The body of the private key
+
+

+

"GetServerCipher" RPC API - Get the Encrypted Algorithm Used for VPN Communication

+

Description

+

Get the Encrypted Algorithm Used for VPN Communication. Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetServerCipher",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "String_str": "string"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
String_strstring (ASCII)A string value
+
+

+

"SetServerCipher" RPC API - Set the Encrypted Algorithm Used for VPN Communication

+

Description

+

Set the Encrypted Algorithm Used for VPN Communication. Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetServerCipher",
+  "params": {
+    "String_str": "string"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "String_str": "string"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
String_strstring (ASCII)A string value
+
+

+

"CreateHub" RPC API - Create New Virtual Hub

+

Description

+

Create New Virtual Hub. Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateHub",
+  "params": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Specify the name of the Virtual Hub to create / update.
AdminPasswordPlainText_strstring (ASCII)Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.
Online_boolbooleanOnline flag
MaxSession_u32number (uint32)Maximum number of VPN sessions
NoEnum_boolbooleanNo Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.
HubType_u32number (enum)Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
+
+

+

"SetHub" RPC API - Set the Virtual Hub configuration

+

Description

+

Set the Virtual Hub configuration. You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHub",
+  "params": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Specify the name of the Virtual Hub to create / update.
AdminPasswordPlainText_strstring (ASCII)Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.
Online_boolbooleanOnline flag
MaxSession_u32number (uint32)Maximum number of VPN sessions
NoEnum_boolbooleanNo Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.
HubType_u32number (enum)Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
+
+

+

"GetHub" RPC API - Get the Virtual Hub configuration

+

Description

+

Get the Virtual Hub configuration. You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHub",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Specify the name of the Virtual Hub to create / update.
AdminPasswordPlainText_strstring (ASCII)Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.
Online_boolbooleanOnline flag
MaxSession_u32number (uint32)Maximum number of VPN sessions
NoEnum_boolbooleanNo Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.
HubType_u32number (enum)Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
+
+

+

"EnumHub" RPC API - Get List of Virtual Hubs

+

Description

+

Get List of Virtual Hubs. Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumHub",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "NumHub_u32": 0,
+    "HubList": [
+      {
+        "HubName_str": "hubname",
+        "Online_bool": false,
+        "HubType_u32": 0,
+        "NumUsers_u32": 0,
+        "NumGroups_u32": 0,
+        "NumSessions_u32": 0,
+        "NumMacTables_u32": 0,
+        "NumIpTables_u32": 0,
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "NumLogin_u32": 0,
+        "IsTrafficFilled_bool": false,
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      },
+      {
+        "HubName_str": "hubname",
+        "Online_bool": false,
+        "HubType_u32": 0,
+        "NumUsers_u32": 0,
+        "NumGroups_u32": 0,
+        "NumSessions_u32": 0,
+        "NumMacTables_u32": 0,
+        "NumIpTables_u32": 0,
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "NumLogin_u32": 0,
+        "IsTrafficFilled_bool": false,
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      },
+      {
+        "HubName_str": "hubname",
+        "Online_bool": false,
+        "HubType_u32": 0,
+        "NumUsers_u32": 0,
+        "NumGroups_u32": 0,
+        "NumSessions_u32": 0,
+        "NumMacTables_u32": 0,
+        "NumIpTables_u32": 0,
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "NumLogin_u32": 0,
+        "IsTrafficFilled_bool": false,
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
NumHub_u32number (uint32)Number of Virtual Hubs
HubListArray objectVirtual Hubs
HubName_strstring (ASCII)The name of the Virtual Hub
Online_boolbooleanOnline state
HubType_u32number (enum)Type of HUB (Valid only for Clustered VPN Servers)
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
NumUsers_u32number (uint32)Number of users
NumGroups_u32number (uint32)Number of registered groups
NumSessions_u32number (uint32)Number of registered sessions
NumMacTables_u32number (uint32)Number of current MAC table entries
NumIpTables_u32number (uint32)Number of current IP table entries
LastCommTime_dtDateLast communication date and time
LastLoginTime_dtDateLast login date and time
CreatedTime_dtDateCreation date and time
NumLogin_u32number (uint32)Number of accumulated logins
IsTrafficFilled_boolbooleanWhether the traffic information is provided
Ex.Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Ex.Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Ex.Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Ex.Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Ex.Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Ex.Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Ex.Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Ex.Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
+
+

+

"DeleteHub" RPC API - Delete Virtual Hub

+

Description

+

Delete Virtual Hub. Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteHub",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
+
+

+

"GetHubRadius" RPC API - Get Setting of RADIUS Server Used for User Authentication

+

Description

+

Get Setting of RADIUS Server Used for User Authentication. Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubRadius",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "RadiusServerName_str": "radiusservername",
+    "RadiusPort_u32": 0,
+    "RadiusSecret_str": "radiussecret",
+    "RadiusRetryInterval_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
RadiusServerName_strstring (ASCII)RADIUS server name
RadiusPort_u32number (uint32)RADIUS port number
RadiusSecret_strstring (ASCII)Secret key
RadiusRetryInterval_u32number (uint32)Radius retry interval
+
+

+

"SetHubRadius" RPC API - Set RADIUS Server to use for User Authentication

+

Description

+

Set RADIUS Server to use for User Authentication. To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubRadius",
+  "params": {
+    "HubName_str": "hubname",
+    "RadiusServerName_str": "radiusservername",
+    "RadiusPort_u32": 0,
+    "RadiusSecret_str": "radiussecret",
+    "RadiusRetryInterval_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "RadiusServerName_str": "radiusservername",
+    "RadiusPort_u32": 0,
+    "RadiusSecret_str": "radiussecret",
+    "RadiusRetryInterval_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
RadiusServerName_strstring (ASCII)RADIUS server name
RadiusPort_u32number (uint32)RADIUS port number
RadiusSecret_strstring (ASCII)Secret key
RadiusRetryInterval_u32number (uint32)Radius retry interval
+
+

+

"EnumConnection" RPC API - Get List of TCP Connections Connecting to the VPN Server

+

Description

+

Get List of TCP Connections Connecting to the VPN Server. Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumConnection",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "NumConnection_u32": 0,
+    "ConnectionList": [
+      {
+        "Name_str": "name",
+        "Hostname_str": "hostname",
+        "Ip_ip": "192.168.0.1",
+        "Port_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Type_u32": 0
+      },
+      {
+        "Name_str": "name",
+        "Hostname_str": "hostname",
+        "Ip_ip": "192.168.0.1",
+        "Port_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Type_u32": 0
+      },
+      {
+        "Name_str": "name",
+        "Hostname_str": "hostname",
+        "Ip_ip": "192.168.0.1",
+        "Port_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Type_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
NumConnection_u32number (uint32)Number of connections
ConnectionListArray objectConnection list
Name_strstring (ASCII)Connection name
Hostname_strstring (ASCII)Host name
Ip_ipstring (IP address)IP address
Port_u32number (uint32)Port number
ConnectedTime_dtDateConnected time
Type_u32number (enum)Connection type
Values:
0: VPN Client
1: During initialization
2: Login connection
3: Additional connection
4: RPC for server farm
5: RPC for Management
6: HUB enumeration
7: Password change
8: SSTP
9: OpenVPN
+
+

+

"DisconnectConnection" RPC API - Disconnect TCP Connections Connecting to the VPN Server

+

Description

+

Disconnect TCP Connections Connecting to the VPN Server. Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DisconnectConnection",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Connection name
+
+

+

"GetConnectionInfo" RPC API - Get Information of TCP Connections Connecting to the VPN Server

+

Description

+

Get Information of TCP Connections Connecting to the VPN Server. Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetConnectionInfo",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "Type_u32": 0,
+    "Hostname_str": "hostname",
+    "Ip_ip": "192.168.0.1",
+    "Port_u32": 0,
+    "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+    "ServerStr_str": "serverstr",
+    "ServerVer_u32": 0,
+    "ServerBuild_u32": 0,
+    "ClientStr_str": "clientstr",
+    "ClientVer_u32": 0,
+    "ClientBuild_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Connection name
Type_u32number (enum)Type
Values:
0: VPN Client
1: During initialization
2: Login connection
3: Additional connection
4: RPC for server farm
5: RPC for Management
6: HUB enumeration
7: Password change
8: SSTP
9: OpenVPN
Hostname_strstring (ASCII)Host name
Ip_ipstring (IP address)IP address
Port_u32number (uint32)Port number
ConnectedTime_dtDateConnected time
ServerStr_strstring (ASCII)Server string
ServerVer_u32number (uint32)Server version
ServerBuild_u32number (uint32)Server build number
ClientStr_strstring (ASCII)Client string
ClientVer_u32number (uint32)Client version
ClientBuild_u32number (uint32)Client build number
+
+

+

"SetHubOnline" RPC API - Switch Virtual Hub to Online or Offline

+

Description

+

Switch Virtual Hub to Online or Offline. Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubOnline",
+  "params": {
+    "HubName_str": "hubname",
+    "Online_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Online_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline / offline flag
+
+

+

"GetHubStatus" RPC API - Get Current Status of Virtual Hub

+

Description

+

Get Current Status of Virtual Hub. Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubStatus",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Online_bool": false,
+    "HubType_u32": 0,
+    "NumSessions_u32": 0,
+    "NumSessionsClient_u32": 0,
+    "NumSessionsBridge_u32": 0,
+    "NumAccessLists_u32": 0,
+    "NumUsers_u32": 0,
+    "NumGroups_u32": 0,
+    "NumMacTables_u32": 0,
+    "NumIpTables_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "SecureNATEnabled_bool": false,
+    "LastCommTime_dt": "2020-08-01T12:24:36.123",
+    "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+    "CreatedTime_dt": "2020-08-01T12:24:36.123",
+    "NumLogin_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline
HubType_u32number (enum)Type of HUB
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
NumSessions_u32number (uint32)Number of sessions
NumSessionsClient_u32number (uint32)Number of sessions (client mode)
NumSessionsBridge_u32number (uint32)Number of sessions (bridge mode)
NumAccessLists_u32number (uint32)Number of Access list entries
NumUsers_u32number (uint32)Number of users
NumGroups_u32number (uint32)Number of groups
NumMacTables_u32number (uint32)Number of MAC table entries
NumIpTables_u32number (uint32)Number of IP table entries
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
SecureNATEnabled_boolbooleanWhether SecureNAT is enabled
LastCommTime_dtDateLast communication date and time
LastLoginTime_dtDateLast login date and time
CreatedTime_dtDateCreation date and time
NumLogin_u32number (uint32)Number of logins
+
+

+

"SetHubLog" RPC API - Set the logging configuration of the Virtual Hub

+

Description

+

Set the logging configuration of the Virtual Hub. Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubLog",
+  "params": {
+    "HubName_str": "hubname",
+    "SaveSecurityLog_bool": false,
+    "SecurityLogSwitchType_u32": 0,
+    "SavePacketLog_bool": false,
+    "PacketLogSwitchType_u32": 0,
+    "PacketLogConfig_u32": [
+      1,
+      2,
+      3
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "SaveSecurityLog_bool": false,
+    "SecurityLogSwitchType_u32": 0,
+    "SavePacketLog_bool": false,
+    "PacketLogSwitchType_u32": 0,
+    "PacketLogConfig_u32": [
+      1,
+      2,
+      3
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
SaveSecurityLog_boolbooleanThe flag to enable / disable saving the security log
SecurityLogSwitchType_u32number (enum)The log filename switching setting of the security log
Values:
0: No switching
1: Secondly basis
2: Minutely basis
3: Hourly basis
4: Daily basis
5: Monthly basis
SavePacketLog_boolbooleanThe flag to enable / disable saving the security log
PacketLogSwitchType_u32number (enum)The log filename switching settings of the packet logs
Values:
0: No switching
1: Secondly basis
2: Minutely basis
3: Hourly basis
4: Daily basis
5: Monthly basis
PacketLogConfig_u32number (enum)Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7.
Values:
0: Not save
1: Only header
2: All payloads
+
+

+

"GetHubLog" RPC API - Get the logging configuration of the Virtual Hub

+

Description

+

Get the logging configuration of the Virtual Hub. Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubLog",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "SaveSecurityLog_bool": false,
+    "SecurityLogSwitchType_u32": 0,
+    "SavePacketLog_bool": false,
+    "PacketLogSwitchType_u32": 0,
+    "PacketLogConfig_u32": [
+      1,
+      2,
+      3
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
SaveSecurityLog_boolbooleanThe flag to enable / disable saving the security log
SecurityLogSwitchType_u32number (enum)The log filename switching setting of the security log
Values:
0: No switching
1: Secondly basis
2: Minutely basis
3: Hourly basis
4: Daily basis
5: Monthly basis
SavePacketLog_boolbooleanThe flag to enable / disable saving the security log
PacketLogSwitchType_u32number (enum)The log filename switching settings of the packet logs
Values:
0: No switching
1: Secondly basis
2: Minutely basis
3: Hourly basis
4: Daily basis
5: Monthly basis
PacketLogConfig_u32number (enum)Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7.
Values:
0: Not save
1: Only header
2: All payloads
+
+

+

"AddCa" RPC API - Add Trusted CA Certificate

+

Description

+

Add Trusted CA Certificate. Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddCa",
+  "params": {
+    "HubName_str": "hubname",
+    "Cert_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Cert_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Cert_binstring (Base64 binary)The body of the X.509 certificate
+
+

+

"EnumCa" RPC API - Get List of Trusted CA Certificates

+

Description

+

Get List of Trusted CA Certificates. Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumCa",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "CAList": [
+      {
+        "Key_u32": 0,
+        "SubjectName_utf": "subjectname",
+        "IssuerName_utf": "issuername",
+        "Expires_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "Key_u32": 0,
+        "SubjectName_utf": "subjectname",
+        "IssuerName_utf": "issuername",
+        "Expires_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "Key_u32": 0,
+        "SubjectName_utf": "subjectname",
+        "IssuerName_utf": "issuername",
+        "Expires_dt": "2020-08-01T12:24:36.123"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
CAListArray objectThe list of CA
Key_u32number (uint32)The key id of the item
SubjectName_utfstring (UTF8)Subject
IssuerName_utfstring (UTF8)Issuer
Expires_dtDateExpiration date
+
+

+

"GetCa" RPC API - Get Trusted CA Certificate

+

Description

+

Get Trusted CA Certificate. Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetCa",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "Cert_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)The key id of the certificate
Cert_binstring (Base64 binary)The body of the X.509 certificate
+
+

+

"DeleteCa" RPC API - Delete Trusted CA Certificate

+

Description

+

Delete Trusted CA Certificate. Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteCa",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Certificate key id to be deleted
+
+

+ +

Description

+

Create New Cascade Connection. Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateLink",
+  "params": {
+    "HubName_Ex_str": "hubname_ex",
+    "CheckServerCert_bool": false,
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_Ex_str": "hubname_ex",
+    "Online_bool": false,
+    "CheckServerCert_bool": false,
+    "ServerCert_bin": "SGVsbG8gV29ybGQ=",
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "ProxyName_str": "clientoption_proxyname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "clientoption_proxyusername",
+    "ProxyPassword_str": "clientoption_proxypassword",
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "DisableQoS_bool": false,
+    "NoTls1_bool": false,
+    "NoUdpAcceleration_bool": false,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_Ex_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
CheckServerCert_boolbooleanThe flag to enable validation for the server certificate
ServerCert_binstring (Base64 binary)The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.
AccountName_utfstring (UTF8)Client Option Parameters: Specify the name of the Cascade Connection
Hostname_strstring (ASCII)Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.
Port_u32number (uint32)Client Option Parameters: Specify the port number of the destination VPN Server.
ProxyType_u32number (enum)Client Option Parameters: The type of the proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyName_strstring (ASCII)Client Option Parameters: The hostname or IP address of the proxy server name
ProxyPort_u32number (uint32)Client Option Parameters: The port number of the proxy server
ProxyUsername_strstring (ASCII)Client Option Parameters: The username to connect to the proxy server
ProxyPassword_strstring (ASCII)Client Option Parameters: The password to connect to the proxy server
HubName_strstring (ASCII)Client Option Parameters: The Virtual Hub on the destination VPN Server
MaxConnection_u32number (uint32)Client Option Parameters: Number of TCP Connections to Use in VPN Communication
UseEncrypt_boolbooleanClient Option Parameters: The flag to enable the encryption on the communication
UseCompress_boolbooleanClient Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection
HalfConnection_boolbooleanClient Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.
AdditionalConnectionInterval_u32number (uint32)Client Option Parameters: Connection attempt interval when additional connection will be established
ConnectionDisconnectSpan_u32number (uint32)Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)
DisableQoS_boolbooleanClient Option Parameters: Disable QoS Control Function if the value is true
NoTls1_boolbooleanClient Option Parameters: Do not use TLS 1.x of the value is true
NoUdpAcceleration_boolbooleanClient Option Parameters: Do not use UDP acceleration mode if the value is true
AuthType_u32number (enum)Authentication type
Values:
0: Anonymous authentication
1: SHA-0 hashed password authentication
2: Plain password authentication
3: Certificate authentication
Username_strstring (ASCII)User name
HashedPassword_binstring (Base64 binary)SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).
PlainPassword_strstring (ASCII)Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).
ClientX_binstring (Base64 binary)Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
ClientK_binstring (Base64 binary)Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
SecPol_CheckMac_boolbooleanSecurity policy: Prohibit the duplicate MAC address
SecPol_CheckIP_boolbooleanSecurity policy: Prohibit a duplicate IP address (IPv4)
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
SecPol_RAFilter_boolbooleanSecurity policy: Filter the router advertisement packet (IPv6)
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
SecPol_CheckIPv6_boolbooleanSecurity policy: Prohibit the duplicate IP address (IPv6)
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+ +

Description

+

Get the Cascade Connection Setting. Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetLink",
+  "params": {
+    "HubName_Ex_str": "hubname_ex",
+    "AccountName_utf": "clientoption_accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_Ex_str": "hubname_ex",
+    "Online_bool": false,
+    "CheckServerCert_bool": false,
+    "ServerCert_bin": "SGVsbG8gV29ybGQ=",
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "ProxyName_str": "clientoption_proxyname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "clientoption_proxyusername",
+    "ProxyPassword_str": "clientoption_proxypassword",
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "DisableQoS_bool": false,
+    "NoTls1_bool": false,
+    "NoUdpAcceleration_bool": false,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_Ex_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
CheckServerCert_boolbooleanThe flag to enable validation for the server certificate
ServerCert_binstring (Base64 binary)The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.
AccountName_utfstring (UTF8)Client Option Parameters: Specify the name of the Cascade Connection
Hostname_strstring (ASCII)Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.
Port_u32number (uint32)Client Option Parameters: Specify the port number of the destination VPN Server.
ProxyType_u32number (enum)Client Option Parameters: The type of the proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyName_strstring (ASCII)Client Option Parameters: The hostname or IP address of the proxy server name
ProxyPort_u32number (uint32)Client Option Parameters: The port number of the proxy server
ProxyUsername_strstring (ASCII)Client Option Parameters: The username to connect to the proxy server
ProxyPassword_strstring (ASCII)Client Option Parameters: The password to connect to the proxy server
HubName_strstring (ASCII)Client Option Parameters: The Virtual Hub on the destination VPN Server
MaxConnection_u32number (uint32)Client Option Parameters: Number of TCP Connections to Use in VPN Communication
UseEncrypt_boolbooleanClient Option Parameters: The flag to enable the encryption on the communication
UseCompress_boolbooleanClient Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection
HalfConnection_boolbooleanClient Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.
AdditionalConnectionInterval_u32number (uint32)Client Option Parameters: Connection attempt interval when additional connection will be established
ConnectionDisconnectSpan_u32number (uint32)Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)
DisableQoS_boolbooleanClient Option Parameters: Disable QoS Control Function if the value is true
NoTls1_boolbooleanClient Option Parameters: Do not use TLS 1.x of the value is true
NoUdpAcceleration_boolbooleanClient Option Parameters: Do not use UDP acceleration mode if the value is true
AuthType_u32number (enum)Authentication type
Values:
0: Anonymous authentication
1: SHA-0 hashed password authentication
2: Plain password authentication
3: Certificate authentication
Username_strstring (ASCII)User name
HashedPassword_binstring (Base64 binary)SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).
PlainPassword_strstring (ASCII)Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).
ClientX_binstring (Base64 binary)Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
ClientK_binstring (Base64 binary)Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
SecPol_CheckMac_boolbooleanSecurity policy: Prohibit the duplicate MAC address
SecPol_CheckIP_boolbooleanSecurity policy: Prohibit a duplicate IP address (IPv4)
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
SecPol_RAFilter_boolbooleanSecurity policy: Filter the router advertisement packet (IPv6)
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
SecPol_CheckIPv6_boolbooleanSecurity policy: Prohibit the duplicate IP address (IPv6)
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+ +

Description

+

Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetLink",
+  "params": {
+    "HubName_Ex_str": "hubname_ex",
+    "CheckServerCert_bool": false,
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_Ex_str": "hubname_ex",
+    "Online_bool": false,
+    "CheckServerCert_bool": false,
+    "ServerCert_bin": "SGVsbG8gV29ybGQ=",
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "ProxyName_str": "clientoption_proxyname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "clientoption_proxyusername",
+    "ProxyPassword_str": "clientoption_proxypassword",
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "DisableQoS_bool": false,
+    "NoTls1_bool": false,
+    "NoUdpAcceleration_bool": false,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_Ex_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
CheckServerCert_boolbooleanThe flag to enable validation for the server certificate
ServerCert_binstring (Base64 binary)The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.
AccountName_utfstring (UTF8)Client Option Parameters: Specify the name of the Cascade Connection
Hostname_strstring (ASCII)Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.
Port_u32number (uint32)Client Option Parameters: Specify the port number of the destination VPN Server.
ProxyType_u32number (enum)Client Option Parameters: The type of the proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyName_strstring (ASCII)Client Option Parameters: The hostname or IP address of the proxy server name
ProxyPort_u32number (uint32)Client Option Parameters: The port number of the proxy server
ProxyUsername_strstring (ASCII)Client Option Parameters: The username to connect to the proxy server
ProxyPassword_strstring (ASCII)Client Option Parameters: The password to connect to the proxy server
HubName_strstring (ASCII)Client Option Parameters: The Virtual Hub on the destination VPN Server
MaxConnection_u32number (uint32)Client Option Parameters: Number of TCP Connections to Use in VPN Communication
UseEncrypt_boolbooleanClient Option Parameters: The flag to enable the encryption on the communication
UseCompress_boolbooleanClient Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection
HalfConnection_boolbooleanClient Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.
AdditionalConnectionInterval_u32number (uint32)Client Option Parameters: Connection attempt interval when additional connection will be established
ConnectionDisconnectSpan_u32number (uint32)Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)
DisableQoS_boolbooleanClient Option Parameters: Disable QoS Control Function if the value is true
NoTls1_boolbooleanClient Option Parameters: Do not use TLS 1.x of the value is true
NoUdpAcceleration_boolbooleanClient Option Parameters: Do not use UDP acceleration mode if the value is true
AuthType_u32number (enum)Authentication type
Values:
0: Anonymous authentication
1: SHA-0 hashed password authentication
2: Plain password authentication
3: Certificate authentication
Username_strstring (ASCII)User name
HashedPassword_binstring (Base64 binary)SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).
PlainPassword_strstring (ASCII)Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).
ClientX_binstring (Base64 binary)Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
ClientK_binstring (Base64 binary)Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
SecPol_CheckMac_boolbooleanSecurity policy: Prohibit the duplicate MAC address
SecPol_CheckIP_boolbooleanSecurity policy: Prohibit a duplicate IP address (IPv4)
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
SecPol_RAFilter_boolbooleanSecurity policy: Filter the router advertisement packet (IPv6)
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
SecPol_CheckIPv6_boolbooleanSecurity policy: Prohibit the duplicate IP address (IPv6)
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+ +

Description

+

Get List of Cascade Connections. Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumLink",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "NumLink_u32": 0,
+    "LinkList": [
+      {
+        "AccountName_utf": "accountname",
+        "Online_bool": false,
+        "Connected_bool": false,
+        "LastError_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Hostname_str": "hostname",
+        "TargetHubName_str": "targethubname"
+      },
+      {
+        "AccountName_utf": "accountname",
+        "Online_bool": false,
+        "Connected_bool": false,
+        "LastError_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Hostname_str": "hostname",
+        "TargetHubName_str": "targethubname"
+      },
+      {
+        "AccountName_utf": "accountname",
+        "Online_bool": false,
+        "Connected_bool": false,
+        "LastError_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Hostname_str": "hostname",
+        "TargetHubName_str": "targethubname"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
NumLink_u32number (uint32)Number of cascade connections
LinkListArray objectThe list of cascade connections
AccountName_utfstring (UTF8)The name of cascade connection
Online_boolbooleanOnline flag
Connected_boolbooleanThe flag indicates whether the cascade connection is established
LastError_u32number (uint32)The error last occurred if the cascade connection is in the fail state
ConnectedTime_dtDateConnection completion time
Hostname_strstring (ASCII)Host name of the destination VPN server
TargetHubName_strstring (ASCII)The Virtual Hub name
+
+

+

"SetLinkOnline" RPC API - Switch Cascade Connection to Online Status

+

Description

+

Switch Cascade Connection to Online Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetLinkOnline",
+  "params": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccountName_utfstring (UTF8)The name of the cascade connection
+
+

+

"SetLinkOffline" RPC API - Switch Cascade Connection to Offline Status

+

Description

+

Switch Cascade Connection to Offline Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetLinkOffline",
+  "params": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccountName_utfstring (UTF8)The name of the cascade connection
+
+

+ +

Description

+

Delete Cascade Connection Setting. Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteLink",
+  "params": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccountName_utfstring (UTF8)The name of the cascade connection
+
+

+ +

Description

+

Change Name of Cascade Connection. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "RenameLink",
+  "params": {
+    "HubName_str": "hubname",
+    "OldAccountName_utf": "oldaccountname",
+    "NewAccountName_utf": "newaccountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "OldAccountName_utf": "oldaccountname",
+    "NewAccountName_utf": "newaccountname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
OldAccountName_utfstring (UTF8)The old name of the cascade connection
NewAccountName_utfstring (UTF8)The new name of the cascade connection
+
+

+

"GetLinkStatus" RPC API - Get Current Cascade Connection Status

+

Description

+

Get Current Cascade Connection Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetLinkStatus",
+  "params": {
+    "HubName_Ex_str": "hubname_ex",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_Ex_str": "hubname_ex",
+    "AccountName_utf": "accountname",
+    "Active_bool": false,
+    "Connected_bool": false,
+    "SessionStatus_u32": 0,
+    "ServerName_str": "servername",
+    "ServerPort_u32": 0,
+    "ServerProductName_str": "serverproductname",
+    "ServerProductVer_u32": 0,
+    "ServerProductBuild_u32": 0,
+    "ServerX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "StartTime_dt": "2020-08-01T12:24:36.123",
+    "FirstConnectionEstablisiedTime_dt": "2020-08-01T12:24:36.123",
+    "CurrentConnectionEstablishTime_dt": "2020-08-01T12:24:36.123",
+    "NumConnectionsEatablished_u32": 0,
+    "HalfConnection_bool": false,
+    "QoS_bool": false,
+    "MaxTcpConnections_u32": 0,
+    "NumTcpConnections_u32": 0,
+    "NumTcpConnectionsUpload_u32": 0,
+    "NumTcpConnectionsDownload_u32": 0,
+    "UseEncrypt_bool": false,
+    "CipherName_str": "ciphername",
+    "UseCompress_bool": false,
+    "IsRUDPSession_bool": false,
+    "UnderlayProtocol_str": "underlayprotocol",
+    "IsUdpAccelerationEnabled_bool": false,
+    "IsUsingUdpAcceleration_bool": false,
+    "SessionName_str": "sessionname",
+    "ConnectionName_str": "connectionname",
+    "SessionKey_bin": "SGVsbG8gV29ybGQ=",
+    "TotalSendSize_u64": 0,
+    "TotalRecvSize_u64": 0,
+    "TotalSendSizeReal_u64": 0,
+    "TotalRecvSizeReal_u64": 0,
+    "IsBridgeMode_bool": false,
+    "IsMonitorMode_bool": false,
+    "VLanId_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_Ex_strstring (ASCII)The Virtual Hub name
AccountName_utfstring (UTF8)The name of the cascade connection
Active_boolbooleanThe flag whether the cascade connection is enabled
Connected_boolbooleanThe flag whether the cascade connection is established
SessionStatus_u32number (enum)The session status
Values:
0: Connecting
1: Negotiating
2: During user authentication
3: Connection complete
4: Wait to retry
5: Idle state
ServerName_strstring (ASCII)The destination VPN server name
ServerPort_u32number (uint32)The port number of the server
ServerProductName_strstring (ASCII)Server product name
ServerProductVer_u32number (uint32)Server product version
ServerProductBuild_u32number (uint32)Server product build number
ServerX_binstring (Base64 binary)Server's X.509 certificate
ClientX_binstring (Base64 binary)Client certificate
StartTime_dtDateConnection start time
FirstConnectionEstablisiedTime_dtDateConnection completion time of the first connection
CurrentConnectionEstablishTime_dtDateConnection completion time of this connection
NumConnectionsEatablished_u32number (uint32)Number of connections have been established so far
HalfConnection_boolbooleanHalf-connection
QoS_boolbooleanVoIP / QoS
MaxTcpConnections_u32number (uint32)Maximum number of the underlying TCP connections
NumTcpConnections_u32number (uint32)Number of current underlying TCP connections
NumTcpConnectionsUpload_u32number (uint32)Number of underlying inbound TCP connections
NumTcpConnectionsDownload_u32number (uint32)Number of underlying outbound TCP connections
UseEncrypt_boolbooleanUse of encryption
CipherName_strstring (ASCII)Cipher algorithm name
UseCompress_boolbooleanUse of compression
IsRUDPSession_boolbooleanThe flag whether this is a R-UDP session
UnderlayProtocol_strstring (ASCII)Underlying physical communication protocol
IsUdpAccelerationEnabled_boolbooleanThe UDP acceleration is enabled
IsUsingUdpAcceleration_boolbooleanThe UDP acceleration is being actually used
SessionName_strstring (ASCII)Session name
ConnectionName_strstring (ASCII)Connection name
SessionKey_binstring (Base64 binary)Session key
TotalSendSize_u64number (uint64)Total transmitted data size
TotalRecvSize_u64number (uint64)Total received data size
TotalSendSizeReal_u64number (uint64)Total transmitted data size (no compression)
TotalRecvSizeReal_u64number (uint64)Total received data size (no compression)
IsBridgeMode_boolbooleanThe flag whether the VPN session is Bridge Mode
IsMonitorMode_boolbooleanThe flag whether the VPN session is Monitor mode
VLanId_u32number (uint32)VLAN ID
+
+

+

"AddAccess" RPC API - Add Access List Rule

+

Description

+

Add Access List Rule. Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddAccess",
+  "params": {
+    "HubName_str": "hubname",
+    "AccessListSingle": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccessListSingle": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccessListSingleArray objectAccess list (Must be a single item)
Id_u32number (uint32)ID
Note_utfstring (UTF8)Specify a description (note) for this rule
Active_boolbooleanEnabled flag (true: enabled, false: disabled)
Priority_u32number (uint32)Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.
Discard_boolbooleanThe flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.
IsIPv6_boolbooleanThe flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.
SrcIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.
SrcSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
DestIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.
DestSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
SrcIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.
SrcSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
DestIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.
DestSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
Protocol_u32number (enum)The IP protocol number
Values:
1: ICMP for IPv4
6: TCP
17: UDP
58: ICMP for IPv6
SrcPortStart_u32number (uint32)The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcPortEnd_u32number (uint32)The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortStart_u32number (uint32)The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortEnd_u32number (uint32)The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcUsername_strstring (ASCII)Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
DestUsername_strstring (ASCII)Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
CheckSrcMac_boolbooleanSpecify true if you want to check the source MAC address.
SrcMacAddress_binstring (Base64 binary)Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
SrcMacMask_binstring (Base64 binary)Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckDstMac_boolbooleanSpecify true if you want to check the destination MAC address.
DstMacAddress_binstring (Base64 binary)Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
DstMacMask_binstring (Base64 binary)Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckTcpState_boolbooleanSpecify true if you want to check the state of the TCP connection.
Established_boolbooleanValid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.
Delay_u32number (uint32)Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.
Jitter_u32number (uint32)Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.
Loss_u32number (uint32)Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.
RedirectUrl_strstring (ASCII)The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.
+
+

+

"DeleteAccess" RPC API - Delete Rule from Access List

+

Description

+

Delete Rule from Access List. Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteAccess",
+  "params": {
+    "HubName_str": "hubname",
+    "Id_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Id_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Id_u32number (uint32)ID
+
+

+

"EnumAccess" RPC API - Get Access List Rule List

+

Description

+

Get Access List Rule List. Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumAccess",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccessList": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccessListArray objectAccess list
Id_u32number (uint32)ID
Note_utfstring (UTF8)Specify a description (note) for this rule
Active_boolbooleanEnabled flag (true: enabled, false: disabled)
Priority_u32number (uint32)Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.
Discard_boolbooleanThe flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.
IsIPv6_boolbooleanThe flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.
SrcIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.
SrcSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
DestIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.
DestSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
SrcIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.
SrcSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
DestIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.
DestSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
Protocol_u32number (enum)The IP protocol number
Values:
1: ICMP for IPv4
6: TCP
17: UDP
58: ICMP for IPv6
SrcPortStart_u32number (uint32)The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcPortEnd_u32number (uint32)The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortStart_u32number (uint32)The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortEnd_u32number (uint32)The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcUsername_strstring (ASCII)Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
DestUsername_strstring (ASCII)Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
CheckSrcMac_boolbooleanSpecify true if you want to check the source MAC address.
SrcMacAddress_binstring (Base64 binary)Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
SrcMacMask_binstring (Base64 binary)Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckDstMac_boolbooleanSpecify true if you want to check the destination MAC address.
DstMacAddress_binstring (Base64 binary)Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
DstMacMask_binstring (Base64 binary)Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckTcpState_boolbooleanSpecify true if you want to check the state of the TCP connection.
Established_boolbooleanValid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.
Delay_u32number (uint32)Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.
Jitter_u32number (uint32)Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.
Loss_u32number (uint32)Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.
RedirectUrl_strstring (ASCII)The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.
+
+

+

"SetAccessList" RPC API - Replace all access lists on a single bulk API call

+

Description

+

Replace all access lists on a single bulk API call. This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetAccessList",
+  "params": {
+    "HubName_str": "hubname",
+    "AccessList": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccessList": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccessListArray objectAccess list
Id_u32number (uint32)ID
Note_utfstring (UTF8)Specify a description (note) for this rule
Active_boolbooleanEnabled flag (true: enabled, false: disabled)
Priority_u32number (uint32)Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.
Discard_boolbooleanThe flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.
IsIPv6_boolbooleanThe flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.
SrcIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.
SrcSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
DestIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.
DestSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
SrcIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.
SrcSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
DestIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.
DestSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
Protocol_u32number (enum)The IP protocol number
Values:
1: ICMP for IPv4
6: TCP
17: UDP
58: ICMP for IPv6
SrcPortStart_u32number (uint32)The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcPortEnd_u32number (uint32)The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortStart_u32number (uint32)The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortEnd_u32number (uint32)The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcUsername_strstring (ASCII)Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
DestUsername_strstring (ASCII)Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
CheckSrcMac_boolbooleanSpecify true if you want to check the source MAC address.
SrcMacAddress_binstring (Base64 binary)Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
SrcMacMask_binstring (Base64 binary)Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckDstMac_boolbooleanSpecify true if you want to check the destination MAC address.
DstMacAddress_binstring (Base64 binary)Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
DstMacMask_binstring (Base64 binary)Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckTcpState_boolbooleanSpecify true if you want to check the state of the TCP connection.
Established_boolbooleanValid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.
Delay_u32number (uint32)Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.
Jitter_u32number (uint32)Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.
Loss_u32number (uint32)Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.
RedirectUrl_strstring (ASCII)The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.
+
+

+

"CreateUser" RPC API - Create a user

+

Description

+

Create a user. Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateUser",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "GroupName_str": "groupname",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "CreatedTime_dt": "2020-08-01T12:24:36.123",
+    "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "NumLogin_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)Specify the user name of the user
GroupName_strstring (ASCII)Assigned group name for the user
Realname_utfstring (UTF8)Optional real name (full name) of the user, allow using any Unicode characters
Note_utfstring (UTF8)Optional User Description
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateLast modified date and time
ExpireTime_dtDateExpiration date and time
AuthType_u32number (enum)Authentication method of the user
Values:
0: Anonymous authentication
1: Password authentication
2: User certificate authentication
3: Root certificate which is issued by trusted Certificate Authority
4: Radius authentication
5: Windows NT authentication
Auth_Password_strstring (ASCII)User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.
UserX_binstring (Base64 binary)User certificate, valid only if AuthType_u32 == UserCert(2).
Serial_binstring (Base64 binary)Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).
CommonName_utfstring (UTF8)Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).
RadiusUsername_utfstring (UTF8)Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).
NtUsername_utfstring (UTF8)Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).
NumLogin_u32number (uint32)Number of total logins of the user
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"SetUser" RPC API - Change User Settings

+

Description

+

Change User Settings. Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetUser",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "GroupName_str": "groupname",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "GroupName_str": "groupname",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "CreatedTime_dt": "2020-08-01T12:24:36.123",
+    "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "NumLogin_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)Specify the user name of the user
GroupName_strstring (ASCII)Assigned group name for the user
Realname_utfstring (UTF8)Optional real name (full name) of the user, allow using any Unicode characters
Note_utfstring (UTF8)Optional User Description
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateLast modified date and time
ExpireTime_dtDateExpiration date and time
AuthType_u32number (enum)Authentication method of the user
Values:
0: Anonymous authentication
1: Password authentication
2: User certificate authentication
3: Root certificate which is issued by trusted Certificate Authority
4: Radius authentication
5: Windows NT authentication
Auth_Password_strstring (ASCII)User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.
UserX_binstring (Base64 binary)User certificate, valid only if AuthType_u32 == UserCert(2).
Serial_binstring (Base64 binary)Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).
CommonName_utfstring (UTF8)Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).
RadiusUsername_utfstring (UTF8)Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).
NtUsername_utfstring (UTF8)Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).
NumLogin_u32number (uint32)Number of total logins of the user
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"GetUser" RPC API - Get User Settings

+

Description

+

Get User Settings. Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetUser",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "GroupName_str": "groupname",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "CreatedTime_dt": "2020-08-01T12:24:36.123",
+    "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "NumLogin_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)Specify the user name of the user
GroupName_strstring (ASCII)Assigned group name for the user
Realname_utfstring (UTF8)Optional real name (full name) of the user, allow using any Unicode characters
Note_utfstring (UTF8)Optional User Description
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateLast modified date and time
ExpireTime_dtDateExpiration date and time
AuthType_u32number (enum)Authentication method of the user
Values:
0: Anonymous authentication
1: Password authentication
2: User certificate authentication
3: Root certificate which is issued by trusted Certificate Authority
4: Radius authentication
5: Windows NT authentication
Auth_Password_strstring (ASCII)User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.
UserX_binstring (Base64 binary)User certificate, valid only if AuthType_u32 == UserCert(2).
Serial_binstring (Base64 binary)Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).
CommonName_utfstring (UTF8)Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).
RadiusUsername_utfstring (UTF8)Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).
NtUsername_utfstring (UTF8)Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).
NumLogin_u32number (uint32)Number of total logins of the user
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"DeleteUser" RPC API - Delete a user

+

Description

+

Delete a user. Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteUser",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)User or group name
+
+

+

"EnumUser" RPC API - Get List of Users

+

Description

+

Get List of Users. Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumUser",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "UserList": [
+      {
+        "Name_str": "name",
+        "GroupName_str": "groupname",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "AuthType_u32": 0,
+        "NumLogin_u32": 0,
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "DenyAccess_bool": false,
+        "IsTrafficFilled_bool": false,
+        "IsExpiresFilled_bool": false,
+        "Expires_dt": "2020-08-01T12:24:36.123",
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      },
+      {
+        "Name_str": "name",
+        "GroupName_str": "groupname",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "AuthType_u32": 0,
+        "NumLogin_u32": 0,
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "DenyAccess_bool": false,
+        "IsTrafficFilled_bool": false,
+        "IsExpiresFilled_bool": false,
+        "Expires_dt": "2020-08-01T12:24:36.123",
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      },
+      {
+        "Name_str": "name",
+        "GroupName_str": "groupname",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "AuthType_u32": 0,
+        "NumLogin_u32": 0,
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "DenyAccess_bool": false,
+        "IsTrafficFilled_bool": false,
+        "IsExpiresFilled_bool": false,
+        "Expires_dt": "2020-08-01T12:24:36.123",
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
UserListArray objectUser list
Name_strstring (ASCII)User name
GroupName_strstring (ASCII)Group name
Realname_utfstring (UTF8)Real name
Note_utfstring (UTF8)Note
AuthType_u32number (enum)Authentication method
Values:
0: Anonymous authentication
1: Password authentication
2: User certificate authentication
3: Root certificate which is issued by trusted Certificate Authority
4: Radius authentication
5: Windows NT authentication
NumLogin_u32number (uint32)Number of logins
LastLoginTime_dtDateLast login date and time
DenyAccess_boolbooleanAccess denied
IsTrafficFilled_boolbooleanFlag of whether the traffic variable is set
IsExpiresFilled_boolbooleanFlag of whether expiration date variable is set
Expires_dtDateExpiration date
Ex.Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Ex.Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Ex.Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Ex.Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Ex.Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Ex.Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Ex.Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Ex.Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
+
+

+

"CreateGroup" RPC API - Create Group

+

Description

+

Create Group. Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateGroup",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)The group name
Realname_utfstring (UTF8)Optional real name (full name) of the group, allow using any Unicode characters
Note_utfstring (UTF8)Optional, specify a description of the group
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"SetGroup" RPC API - Set group settings

+

Description

+

Set group settings. Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetGroup",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)The group name
Realname_utfstring (UTF8)Optional real name (full name) of the group, allow using any Unicode characters
Note_utfstring (UTF8)Optional, specify a description of the group
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"GetGroup" RPC API - Get Group Setting (Sync mode)

+

Description

+

Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetGroup",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)The group name
Realname_utfstring (UTF8)Optional real name (full name) of the group, allow using any Unicode characters
Note_utfstring (UTF8)Optional, specify a description of the group
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"DeleteGroup" RPC API - Delete User from Group

+

Description

+

Delete User from Group. Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteGroup",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)User or group name
+
+

+

"EnumGroup" RPC API - Get List of Groups

+

Description

+

Get List of Groups. Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumGroup",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "GroupList": [
+      {
+        "Name_str": "name",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "NumUsers_u32": 0,
+        "DenyAccess_bool": false
+      },
+      {
+        "Name_str": "name",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "NumUsers_u32": 0,
+        "DenyAccess_bool": false
+      },
+      {
+        "Name_str": "name",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "NumUsers_u32": 0,
+        "DenyAccess_bool": false
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
GroupListArray objectGroup list
Name_strstring (ASCII)User name
Realname_utfstring (UTF8)Real name
Note_utfstring (UTF8)Note
NumUsers_u32number (uint32)Number of users
DenyAccess_boolbooleanAccess denied
+
+

+

"EnumSession" RPC API - Get List of Connected VPN Sessions

+

Description

+

Get List of Connected VPN Sessions. Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumSession",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "SessionList": [
+      {
+        "Name_str": "name",
+        "RemoteSession_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "Username_str": "username",
+        "ClientIP_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "MaxNumTcp_u32": 0,
+        "CurrentNumTcp_u32": 0,
+        "PacketSize_u64": 0,
+        "PacketNum_u64": 0,
+        "LinkMode_bool": false,
+        "SecureNATMode_bool": false,
+        "BridgeMode_bool": false,
+        "Layer3Mode_bool": false,
+        "Client_BridgeMode_bool": false,
+        "Client_MonitorMode_bool": false,
+        "VLanId_u32": 0,
+        "UniqueId_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "Name_str": "name",
+        "RemoteSession_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "Username_str": "username",
+        "ClientIP_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "MaxNumTcp_u32": 0,
+        "CurrentNumTcp_u32": 0,
+        "PacketSize_u64": 0,
+        "PacketNum_u64": 0,
+        "LinkMode_bool": false,
+        "SecureNATMode_bool": false,
+        "BridgeMode_bool": false,
+        "Layer3Mode_bool": false,
+        "Client_BridgeMode_bool": false,
+        "Client_MonitorMode_bool": false,
+        "VLanId_u32": 0,
+        "UniqueId_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "Name_str": "name",
+        "RemoteSession_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "Username_str": "username",
+        "ClientIP_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "MaxNumTcp_u32": 0,
+        "CurrentNumTcp_u32": 0,
+        "PacketSize_u64": 0,
+        "PacketNum_u64": 0,
+        "LinkMode_bool": false,
+        "SecureNATMode_bool": false,
+        "BridgeMode_bool": false,
+        "Layer3Mode_bool": false,
+        "Client_BridgeMode_bool": false,
+        "Client_MonitorMode_bool": false,
+        "VLanId_u32": 0,
+        "UniqueId_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
SessionListArray objectVPN sessions list
Name_strstring (ASCII)Session name
RemoteSession_boolbooleanRemote session
RemoteHostname_strstring (ASCII)Remote server name
Username_strstring (ASCII)User name
ClientIP_ipstring (IP address)IP address
Hostname_strstring (ASCII)Host name
MaxNumTcp_u32number (uint32)Maximum number of underlying TCP connections
CurrentNumTcp_u32number (uint32)Number of current underlying TCP connections
PacketSize_u64number (uint64)Packet size transmitted
PacketNum_u64number (uint64)Number of packets transmitted
LinkMode_boolbooleanIs a Cascade VPN session
SecureNATMode_boolbooleanIs a SecureNAT VPN session
BridgeMode_boolbooleanIs the VPN session for Local Bridge
Layer3Mode_boolbooleanIs a Layer-3 Switch VPN session
Client_BridgeMode_boolbooleanIs in Bridge Mode
Client_MonitorMode_boolbooleanIs in Monitor Mode
VLanId_u32number (uint32)VLAN ID
UniqueId_binstring (Base64 binary)Unique ID of the VPN Session
CreatedTime_dtDateCreation date and time
LastCommTime_dtDateLast communication date and time
+
+

+

"GetSessionStatus" RPC API - Get Session Status

+

Description

+

Get Session Status. Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSessionStatus",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Username_str": "username",
+    "RealUsername_str": "realusername",
+    "GroupName_str": "groupname",
+    "LinkMode_bool": false,
+    "Client_Ip_Address_ip": "192.168.0.1",
+    "SessionStatus_ClientHostName_str": "clienthostname",
+    "Active_bool": false,
+    "Connected_bool": false,
+    "SessionStatus_u32": 0,
+    "ServerName_str": "servername",
+    "ServerPort_u32": 0,
+    "ServerProductName_str": "serverproductname",
+    "ServerProductVer_u32": 0,
+    "ServerProductBuild_u32": 0,
+    "StartTime_dt": "2020-08-01T12:24:36.123",
+    "FirstConnectionEstablisiedTime_dt": "2020-08-01T12:24:36.123",
+    "CurrentConnectionEstablishTime_dt": "2020-08-01T12:24:36.123",
+    "NumConnectionsEatablished_u32": 0,
+    "HalfConnection_bool": false,
+    "QoS_bool": false,
+    "MaxTcpConnections_u32": 0,
+    "NumTcpConnections_u32": 0,
+    "NumTcpConnectionsUpload_u32": 0,
+    "NumTcpConnectionsDownload_u32": 0,
+    "UseEncrypt_bool": false,
+    "CipherName_str": "ciphername",
+    "UseCompress_bool": false,
+    "IsRUDPSession_bool": false,
+    "UnderlayProtocol_str": "underlayprotocol",
+    "IsUdpAccelerationEnabled_bool": false,
+    "IsUsingUdpAcceleration_bool": false,
+    "SessionName_str": "sessionname",
+    "ConnectionName_str": "connectionname",
+    "SessionKey_bin": "SGVsbG8gV29ybGQ=",
+    "TotalSendSize_u64": 0,
+    "TotalRecvSize_u64": 0,
+    "TotalSendSizeReal_u64": 0,
+    "TotalRecvSizeReal_u64": 0,
+    "IsBridgeMode_bool": false,
+    "IsMonitorMode_bool": false,
+    "VLanId_u32": 0,
+    "ClientProductName_str": "clientproductname",
+    "ClientProductVer_u32": 0,
+    "ClientProductBuild_u32": 0,
+    "ClientOsName_str": "clientosname",
+    "ClientOsVer_str": "clientosver",
+    "ClientOsProductId_str": "clientosproductid",
+    "ClientHostname_str": "clienthostname",
+    "UniqueId_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)VPN session name
Username_strstring (ASCII)User name
RealUsername_strstring (ASCII)Real user name which was used for the authentication
GroupName_strstring (ASCII)Group name
LinkMode_boolbooleanIs Cascade Session
Client_Ip_Address_ipstring (IP address)Client IP address
SessionStatus_ClientHostName_strstring (ASCII)Client host name
Active_boolbooleanOperation flag
Connected_boolbooleanConnected flag
SessionStatus_u32number (enum)State of the client session
Values:
0: Connecting
1: Negotiating
2: During user authentication
3: Connection complete
4: Wait to retry
5: Idle state
ServerName_strstring (ASCII)Server name
ServerPort_u32number (uint32)Port number of the server
ServerProductName_strstring (ASCII)Server product name
ServerProductVer_u32number (uint32)Server product version
ServerProductBuild_u32number (uint32)Server product build number
StartTime_dtDateConnection start time
FirstConnectionEstablisiedTime_dtDateConnection completion time of the first connection
CurrentConnectionEstablishTime_dtDateConnection completion time of this connection
NumConnectionsEatablished_u32number (uint32)Number of connections have been established so far
HalfConnection_boolbooleanHalf-connection
QoS_boolbooleanVoIP / QoS
MaxTcpConnections_u32number (uint32)Maximum number of the underlying TCP connections
NumTcpConnections_u32number (uint32)Number of current underlying TCP connections
NumTcpConnectionsUpload_u32number (uint32)Number of inbound underlying connections
NumTcpConnectionsDownload_u32number (uint32)Number of outbound underlying connections
UseEncrypt_boolbooleanUse of encryption
CipherName_strstring (ASCII)Cipher algorithm name
UseCompress_boolbooleanUse of compression
IsRUDPSession_boolbooleanIs R-UDP session
UnderlayProtocol_strstring (ASCII)Physical underlying communication protocol
IsUdpAccelerationEnabled_boolbooleanThe UDP acceleration is enabled
IsUsingUdpAcceleration_boolbooleanUsing the UDP acceleration function
SessionName_strstring (ASCII)VPN session name
ConnectionName_strstring (ASCII)Connection name
SessionKey_binstring (Base64 binary)Session key
TotalSendSize_u64number (uint64)Total transmitted data size
TotalRecvSize_u64number (uint64)Total received data size
TotalSendSizeReal_u64number (uint64)Total transmitted data size (no compression)
TotalRecvSizeReal_u64number (uint64)Total received data size (no compression)
IsBridgeMode_boolbooleanIs Bridge Mode
IsMonitorMode_boolbooleanIs Monitor mode
VLanId_u32number (uint32)VLAN ID
ClientProductName_strstring (ASCII)Client product name
ClientProductVer_u32number (uint32)Client version
ClientProductBuild_u32number (uint32)Client build number
ClientOsName_strstring (ASCII)Client OS name
ClientOsVer_strstring (ASCII)Client OS version
ClientOsProductId_strstring (ASCII)Client OS Product ID
ClientHostname_strstring (ASCII)Client host name
UniqueId_binstring (Base64 binary)Unique ID
+
+

+

"DeleteSession" RPC API - Disconnect Session

+

Description

+

Disconnect Session. Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteSession",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)Session name
+
+

+

"EnumMacTable" RPC API - Get the MAC Address Table Database

+

Description

+

Get the MAC Address Table Database. Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumMacTable",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "MacTable": [
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "VlanId_u32": 0
+      },
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "VlanId_u32": 0
+      },
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "VlanId_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
MacTableArray objectMAC table
Key_u32number (uint32)Key ID
SessionName_strstring (ASCII)Session name
MacAddress_binstring (Base64 binary)MAC address
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateUpdating date
RemoteItem_boolbooleanRemote items
RemoteHostname_strstring (ASCII)Remote host name
VlanId_u32number (uint32)VLAN ID
+
+

+

"DeleteMacTable" RPC API - Delete MAC Address Table Entry

+

Description

+

Delete MAC Address Table Entry. Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteMacTable",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
+
+

+

"EnumIpTable" RPC API - Get the IP Address Table Database

+

Description

+

Get the IP Address Table Database. Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumIpTable",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "IpTable": [
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "IpAddress_ip": "192.168.0.1",
+        "DhcpAllocated_bool": false,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname"
+      },
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "IpAddress_ip": "192.168.0.1",
+        "DhcpAllocated_bool": false,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname"
+      },
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "IpAddress_ip": "192.168.0.1",
+        "DhcpAllocated_bool": false,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
IpTableArray objectMAC table
Key_u32number (uint32)Key ID
SessionName_strstring (ASCII)Session name
IpAddress_ipstring (IP address)IP address
DhcpAllocated_boolbooleanAssigned by the DHCP
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateUpdating date
RemoteItem_boolbooleanRemote items
RemoteHostname_strstring (ASCII)Remote host name
+
+

+

"DeleteIpTable" RPC API - Delete IP Address Table Entry

+

Description

+

Delete IP Address Table Entry. Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteIpTable",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
+
+

+

"SetKeep" RPC API - Set the Keep Alive Internet Connection Function

+

Description

+

Set the Keep Alive Internet Connection Function. Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetKeep",
+  "params": {
+    "UseKeepConnect_bool": false,
+    "KeepConnectHost_str": "keepconnecthost",
+    "KeepConnectPort_u32": 0,
+    "KeepConnectProtocol_u32": 0,
+    "KeepConnectInterval_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "UseKeepConnect_bool": false,
+    "KeepConnectHost_str": "keepconnecthost",
+    "KeepConnectPort_u32": 0,
+    "KeepConnectProtocol_u32": 0,
+    "KeepConnectInterval_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
UseKeepConnect_boolbooleanThe flag to enable keep-alive to the Internet
KeepConnectHost_strstring (ASCII)Specify the host name or IP address of the destination
KeepConnectPort_u32number (uint32)Specify the port number of the destination
KeepConnectProtocol_u32number (enum)Protocol type
Values:
0: TCP
1: UDP
KeepConnectInterval_u32number (uint32)Interval Between Packets Sends (Seconds)
+
+

+

"GetKeep" RPC API - Get the Keep Alive Internet Connection Function

+

Description

+

Get the Keep Alive Internet Connection Function. Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetKeep",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "UseKeepConnect_bool": false,
+    "KeepConnectHost_str": "keepconnecthost",
+    "KeepConnectPort_u32": 0,
+    "KeepConnectProtocol_u32": 0,
+    "KeepConnectInterval_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
UseKeepConnect_boolbooleanThe flag to enable keep-alive to the Internet
KeepConnectHost_strstring (ASCII)Specify the host name or IP address of the destination
KeepConnectPort_u32number (uint32)Specify the port number of the destination
KeepConnectProtocol_u32number (enum)Protocol type
Values:
0: TCP
1: UDP
KeepConnectInterval_u32number (uint32)Interval Between Packets Sends (Seconds)
+
+

+

"EnableSecureNAT" RPC API - Enable the Virtual NAT and DHCP Server Function (SecureNAT Function)

+

Description

+

Enable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnableSecureNAT",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
+
+

+

"DisableSecureNAT" RPC API - Disable the Virtual NAT and DHCP Server Function (SecureNAT Function)

+

Description

+

Disable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DisableSecureNAT",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
+
+

+

"SetSecureNATOption" RPC API - Change Settings of SecureNAT Function

+

Description

+

Change Settings of SecureNAT Function. Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetSecureNATOption",
+  "params": {
+    "RpcHubName_str": "rpchubname",
+    "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+    "Ip_ip": "192.168.0.1",
+    "Mask_ip": "255.255.255.255",
+    "UseNat_bool": false,
+    "Mtu_u32": 0,
+    "NatTcpTimeout_u32": 0,
+    "NatUdpTimeout_u32": 0,
+    "UseDhcp_bool": false,
+    "DhcpLeaseIPStart_ip": "192.168.0.1",
+    "DhcpLeaseIPEnd_ip": "192.168.0.1",
+    "DhcpSubnetMask_ip": "255.255.255.255",
+    "DhcpExpireTimeSpan_u32": 0,
+    "DhcpGatewayAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress2_ip": "192.168.0.1",
+    "DhcpDomainName_str": "dhcpdomainname",
+    "SaveLog_bool": false,
+    "ApplyDhcpPushRoutes_bool": false,
+    "DhcpPushRoutes_str": "dhcppushroutes"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "RpcHubName_str": "rpchubname",
+    "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+    "Ip_ip": "192.168.0.1",
+    "Mask_ip": "255.255.255.255",
+    "UseNat_bool": false,
+    "Mtu_u32": 0,
+    "NatTcpTimeout_u32": 0,
+    "NatUdpTimeout_u32": 0,
+    "UseDhcp_bool": false,
+    "DhcpLeaseIPStart_ip": "192.168.0.1",
+    "DhcpLeaseIPEnd_ip": "192.168.0.1",
+    "DhcpSubnetMask_ip": "255.255.255.255",
+    "DhcpExpireTimeSpan_u32": 0,
+    "DhcpGatewayAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress2_ip": "192.168.0.1",
+    "DhcpDomainName_str": "dhcpdomainname",
+    "SaveLog_bool": false,
+    "ApplyDhcpPushRoutes_bool": false,
+    "DhcpPushRoutes_str": "dhcppushroutes"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
RpcHubName_strstring (ASCII)Target Virtual HUB name
MacAddress_binstring (Base64 binary)MAC address
Ip_ipstring (IP address)IP address
Mask_ipstring (IP address)Subnet mask
UseNat_boolbooleanUse flag of the Virtual NAT function
Mtu_u32number (uint32)MTU value (Standard: 1500)
NatTcpTimeout_u32number (uint32)NAT TCP timeout in seconds
NatUdpTimeout_u32number (uint32)NAT UDP timeout in seconds
UseDhcp_boolbooleanUsing flag of DHCP function
DhcpLeaseIPStart_ipstring (IP address)Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10)
DhcpLeaseIPEnd_ipstring (IP address)Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200)
DhcpSubnetMask_ipstring (IP address)Specify the subnet mask to be specified for the client. (Example: 255.255.255.0)
DhcpExpireTimeSpan_u32number (uint32)Specify the expiration date in second units for leasing an IP address to a client.
DhcpGatewayAddress_ipstring (IP address)Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway.
DhcpDnsServerAddress_ipstring (IP address)Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.
DhcpDnsServerAddress2_ipstring (IP address)Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.
DhcpDomainName_strstring (ASCII)Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name.
SaveLog_boolbooleanSpecify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting.
ApplyDhcpPushRoutes_boolbooleanThe flag to enable the DhcpPushRoutes_str field.
DhcpPushRoutes_strstring (ASCII)Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes.
+
+

+

"GetSecureNATOption" RPC API - Get Settings of SecureNAT Function

+

Description

+

Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSecureNATOption",
+  "params": {
+    "RpcHubName_str": "rpchubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "RpcHubName_str": "rpchubname",
+    "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+    "Ip_ip": "192.168.0.1",
+    "Mask_ip": "255.255.255.255",
+    "UseNat_bool": false,
+    "Mtu_u32": 0,
+    "NatTcpTimeout_u32": 0,
+    "NatUdpTimeout_u32": 0,
+    "UseDhcp_bool": false,
+    "DhcpLeaseIPStart_ip": "192.168.0.1",
+    "DhcpLeaseIPEnd_ip": "192.168.0.1",
+    "DhcpSubnetMask_ip": "255.255.255.255",
+    "DhcpExpireTimeSpan_u32": 0,
+    "DhcpGatewayAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress2_ip": "192.168.0.1",
+    "DhcpDomainName_str": "dhcpdomainname",
+    "SaveLog_bool": false,
+    "ApplyDhcpPushRoutes_bool": false,
+    "DhcpPushRoutes_str": "dhcppushroutes"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
RpcHubName_strstring (ASCII)Target Virtual HUB name
MacAddress_binstring (Base64 binary)MAC address
Ip_ipstring (IP address)IP address
Mask_ipstring (IP address)Subnet mask
UseNat_boolbooleanUse flag of the Virtual NAT function
Mtu_u32number (uint32)MTU value (Standard: 1500)
NatTcpTimeout_u32number (uint32)NAT TCP timeout in seconds
NatUdpTimeout_u32number (uint32)NAT UDP timeout in seconds
UseDhcp_boolbooleanUsing flag of DHCP function
DhcpLeaseIPStart_ipstring (IP address)Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10)
DhcpLeaseIPEnd_ipstring (IP address)Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200)
DhcpSubnetMask_ipstring (IP address)Specify the subnet mask to be specified for the client. (Example: 255.255.255.0)
DhcpExpireTimeSpan_u32number (uint32)Specify the expiration date in second units for leasing an IP address to a client.
DhcpGatewayAddress_ipstring (IP address)Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway.
DhcpDnsServerAddress_ipstring (IP address)Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.
DhcpDnsServerAddress2_ipstring (IP address)Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.
DhcpDomainName_strstring (ASCII)Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name.
SaveLog_boolbooleanSpecify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting.
ApplyDhcpPushRoutes_boolbooleanThe flag to enable the DhcpPushRoutes_str field.
DhcpPushRoutes_strstring (ASCII)Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes.
+
+

+

"EnumNAT" RPC API - Get Virtual NAT Function Session Table of SecureNAT Function

+

Description

+

Get Virtual NAT Function Session Table of SecureNAT Function. Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumNAT",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "NatTable": [
+      {
+        "Id_u32": 0,
+        "Protocol_u32": 0,
+        "SrcIp_ip": "192.168.0.1",
+        "SrcHost_str": "srchost",
+        "SrcPort_u32": 0,
+        "DestIp_ip": "192.168.0.1",
+        "DestHost_str": "desthost",
+        "DestPort_u32": 0,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "SendSize_u64": 0,
+        "RecvSize_u64": 0,
+        "TcpStatus_u32": 0
+      },
+      {
+        "Id_u32": 0,
+        "Protocol_u32": 0,
+        "SrcIp_ip": "192.168.0.1",
+        "SrcHost_str": "srchost",
+        "SrcPort_u32": 0,
+        "DestIp_ip": "192.168.0.1",
+        "DestHost_str": "desthost",
+        "DestPort_u32": 0,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "SendSize_u64": 0,
+        "RecvSize_u64": 0,
+        "TcpStatus_u32": 0
+      },
+      {
+        "Id_u32": 0,
+        "Protocol_u32": 0,
+        "SrcIp_ip": "192.168.0.1",
+        "SrcHost_str": "srchost",
+        "SrcPort_u32": 0,
+        "DestIp_ip": "192.168.0.1",
+        "DestHost_str": "desthost",
+        "DestPort_u32": 0,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "SendSize_u64": 0,
+        "RecvSize_u64": 0,
+        "TcpStatus_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual Hub Name
NatTableArray objectNAT item
Id_u32number (uint32)ID
Protocol_u32number (enum)Protocol
Values:
0: TCP
1: UDP
2: DNS
3: ICMP
SrcIp_ipstring (IP address)Source IP address
SrcHost_strstring (ASCII)Source host name
SrcPort_u32number (uint32)Source port number
DestIp_ipstring (IP address)Destination IP address
DestHost_strstring (ASCII)Destination host name
DestPort_u32number (uint32)Destination port number
CreatedTime_dtDateConnection time
LastCommTime_dtDateLast communication time
SendSize_u64number (uint64)Transmission size
RecvSize_u64number (uint64)Receive size
TcpStatus_u32number (enum)TCP state
Values:
0: Connecting
1: Send the RST (Connection failure or disconnected)
2: Connection complete
3: Connection established
4: Wait for socket disconnection
+
+

+

"EnumDHCP" RPC API - Get Virtual DHCP Server Function Lease Table of SecureNAT Function

+

Description

+

Get Virtual DHCP Server Function Lease Table of SecureNAT Function. Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumDHCP",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "DhcpTable": [
+      {
+        "Id_u32": 0,
+        "LeasedTime_dt": "2020-08-01T12:24:36.123",
+        "ExpireTime_dt": "2020-08-01T12:24:36.123",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "IpAddress_ip": "192.168.0.1",
+        "Mask_u32": 0,
+        "Hostname_str": "hostname"
+      },
+      {
+        "Id_u32": 0,
+        "LeasedTime_dt": "2020-08-01T12:24:36.123",
+        "ExpireTime_dt": "2020-08-01T12:24:36.123",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "IpAddress_ip": "192.168.0.1",
+        "Mask_u32": 0,
+        "Hostname_str": "hostname"
+      },
+      {
+        "Id_u32": 0,
+        "LeasedTime_dt": "2020-08-01T12:24:36.123",
+        "ExpireTime_dt": "2020-08-01T12:24:36.123",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "IpAddress_ip": "192.168.0.1",
+        "Mask_u32": 0,
+        "Hostname_str": "hostname"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual Hub Name
DhcpTableArray objectDHCP Item
Id_u32number (uint32)ID
LeasedTime_dtDateLease time
ExpireTime_dtDateExpiration date
MacAddress_binstring (Base64 binary)MAC address
IpAddress_ipstring (IP address)IP address
Mask_u32number (uint32)Subnet mask
Hostname_strstring (ASCII)Host name
+
+

+

"GetSecureNATStatus" RPC API - Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function)

+

Description

+

Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSecureNATStatus",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "NumTcpSessions_u32": 0,
+    "NumUdpSessions_u32": 0,
+    "NumIcmpSessions_u32": 0,
+    "NumDnsSessions_u32": 0,
+    "NumDhcpClients_u32": 0,
+    "IsKernelMode_bool": false,
+    "IsRawIpMode_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual Hub Name
NumTcpSessions_u32number (uint32)Number of TCP sessions
NumUdpSessions_u32number (uint32)Ntmber of UDP sessions
NumIcmpSessions_u32number (uint32)Nymber of ICMP sessions
NumDnsSessions_u32number (uint32)Number of DNS sessions
NumDhcpClients_u32number (uint32)Number of DHCP clients
IsKernelMode_boolbooleanWhether the NAT is operating in the Kernel Mode
IsRawIpMode_boolbooleanWhether the NAT is operating in the Raw IP Mode
+
+

+

"EnumEthernet" RPC API - Get List of Network Adapters Usable as Local Bridge

+

Description

+

Get List of Network Adapters Usable as Local Bridge. Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumEthernet",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "EthList": [
+      {
+        "DeviceName_str": "devicename",
+        "NetworkConnectionName_utf": "networkconnectionname"
+      },
+      {
+        "DeviceName_str": "devicename",
+        "NetworkConnectionName_utf": "networkconnectionname"
+      },
+      {
+        "DeviceName_str": "devicename",
+        "NetworkConnectionName_utf": "networkconnectionname"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
EthListArray objectEthernet Network Adapters list
DeviceName_strstring (ASCII)Device name
NetworkConnectionName_utfstring (UTF8)Network connection name (description)
+
+

+

"AddLocalBridge" RPC API - Create Local Bridge Connection

+

Description

+

Create Local Bridge Connection. Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddLocalBridge",
+  "params": {
+    "DeviceName_str": "devicename",
+    "HubNameLB_str": "hubnamelb"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "DeviceName_str": "devicename",
+    "HubNameLB_str": "hubnamelb",
+    "Online_bool": false,
+    "Active_bool": false,
+    "TapMode_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
DeviceName_strstring (ASCII)Physical Ethernet device name
HubNameLB_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
Active_boolbooleanRunning flag
TapMode_boolbooleanSpecify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).
+
+

+

"DeleteLocalBridge" RPC API - Delete Local Bridge Connection

+

Description

+

Delete Local Bridge Connection. Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteLocalBridge",
+  "params": {
+    "DeviceName_str": "devicename",
+    "HubNameLB_str": "hubnamelb"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "DeviceName_str": "devicename",
+    "HubNameLB_str": "hubnamelb",
+    "Online_bool": false,
+    "Active_bool": false,
+    "TapMode_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
DeviceName_strstring (ASCII)Physical Ethernet device name
HubNameLB_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
Active_boolbooleanRunning flag
TapMode_boolbooleanSpecify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).
+
+

+

"EnumLocalBridge" RPC API - Get List of Local Bridge Connection

+

Description

+

Get List of Local Bridge Connection. Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumLocalBridge",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "LocalBridgeList": [
+      {
+        "DeviceName_str": "devicename",
+        "HubNameLB_str": "hubnamelb",
+        "Online_bool": false,
+        "Active_bool": false,
+        "TapMode_bool": false
+      },
+      {
+        "DeviceName_str": "devicename",
+        "HubNameLB_str": "hubnamelb",
+        "Online_bool": false,
+        "Active_bool": false,
+        "TapMode_bool": false
+      },
+      {
+        "DeviceName_str": "devicename",
+        "HubNameLB_str": "hubnamelb",
+        "Online_bool": false,
+        "Active_bool": false,
+        "TapMode_bool": false
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
LocalBridgeListArray objectLocal Bridge list
DeviceName_strstring (ASCII)Physical Ethernet device name
HubNameLB_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
Active_boolbooleanRunning flag
TapMode_boolbooleanSpecify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).
+
+

+

"GetBridgeSupport" RPC API - Get whether the localbridge function is supported on the current system

+

Description

+

Get whether the localbridge function is supported on the current system.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetBridgeSupport",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IsBridgeSupportedOs_bool": false,
+    "IsWinPcapNeeded_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IsBridgeSupportedOs_boolbooleanWhether the OS supports the Local Bridge function
IsWinPcapNeeded_boolbooleanWhether WinPcap is necessary to install
+
+

+

"RebootServer" RPC API - Reboot VPN Server Service

+

Description

+

Reboot VPN Server Service. Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "RebootServer",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"GetCaps" RPC API - Get List of Server Functions / Capability

+

Description

+

Get List of Server Functions / Capability. Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetCaps",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "CapsList": [
+      {
+        "CapsName_str": "capsname",
+        "CapsValue_u32": 0,
+        "CapsDescrption_utf": "capsdescrption"
+      },
+      {
+        "CapsName_str": "capsname",
+        "CapsValue_u32": 0,
+        "CapsDescrption_utf": "capsdescrption"
+      },
+      {
+        "CapsName_str": "capsname",
+        "CapsValue_u32": 0,
+        "CapsDescrption_utf": "capsdescrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
CapsListArray objectCaps list of the VPN Server
CapsName_strstring (ASCII)Name
CapsValue_u32number (uint32)Value
CapsDescrption_utfstring (UTF8)Descrption
+
+

+

"GetConfig" RPC API - Get the current configuration of the VPN Server

+

Description

+

Get the current configuration of the VPN Server. Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetConfig",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "FileName_str": "filename",
+    "FileData_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
FileName_strstring (ASCII)File name (valid only for returning from the server)
FileData_binstring (Base64 binary)File data
+
+

+

"SetConfig" RPC API - Write Configuration File to VPN Server

+

Description

+

Write Configuration File to VPN Server. Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetConfig",
+  "params": {
+    "FileData_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "FileName_str": "filename",
+    "FileData_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
FileName_strstring (ASCII)File name (valid only for returning from the server)
FileData_binstring (Base64 binary)File data
+
+

+

"GetDefaultHubAdminOptions" RPC API - Get Virtual Hub Administration Option default values

+

Description

+

Get Virtual Hub Administration Option default values.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetDefaultHubAdminOptions",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"GetHubAdminOptions" RPC API - Get List of Virtual Hub Administration Options

+

Description

+

Get List of Virtual Hub Administration Options. Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubAdminOptions",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"SetHubAdminOptions" RPC API - Set Values of Virtual Hub Administration Options

+

Description

+

Set Values of Virtual Hub Administration Options. Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubAdminOptions",
+  "params": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"GetHubExtOptions" RPC API - Get List of Virtual Hub Extended Options

+

Description

+

Get List of Virtual Hub Extended Options. Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubExtOptions",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"SetHubExtOptions" RPC API - Set a Value of Virtual Hub Extended Options

+

Description

+

Set a Value of Virtual Hub Extended Options. Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubExtOptions",
+  "params": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"AddL3Switch" RPC API - Define New Virtual Layer 3 Switch

+

Description

+

Define New Virtual Layer 3 Switch. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddL3Switch",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 Switch name
+
+

+

"DelL3Switch" RPC API - Delete Virtual Layer 3 Switch

+

Description

+

Delete Virtual Layer 3 Switch. Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DelL3Switch",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 Switch name
+
+

+

"EnumL3Switch" RPC API - Get List of Virtual Layer 3 Switches

+

Description

+

Get List of Virtual Layer 3 Switches. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumL3Switch",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "L3SWList": [
+      {
+        "Name_str": "name",
+        "NumInterfaces_u32": 0,
+        "NumTables_u32": 0,
+        "Active_bool": false,
+        "Online_bool": false
+      },
+      {
+        "Name_str": "name",
+        "NumInterfaces_u32": 0,
+        "NumTables_u32": 0,
+        "Active_bool": false,
+        "Online_bool": false
+      },
+      {
+        "Name_str": "name",
+        "NumInterfaces_u32": 0,
+        "NumTables_u32": 0,
+        "Active_bool": false,
+        "Online_bool": false
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
L3SWListArray objectLayer-3 switch list
Name_strstring (ASCII)Name of the layer-3 switch
NumInterfaces_u32number (uint32)Number of layer-3 switch virtual interfaces
NumTables_u32number (uint32)Number of routing tables
Active_boolbooleanActivated flag
Online_boolbooleanOnline flag
+
+

+

"StartL3Switch" RPC API - Start Virtual Layer 3 Switch Operation

+

Description

+

Start Virtual Layer 3 Switch Operation. Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "StartL3Switch",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 Switch name
+
+

+

"StopL3Switch" RPC API - Stop Virtual Layer 3 Switch Operation

+

Description

+

Stop Virtual Layer 3 Switch Operation. Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "StopL3Switch",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 Switch name
+
+

+

"AddL3If" RPC API - Add Virtual Interface to Virtual Layer 3 Switch

+

Description

+

Add Virtual Interface to Virtual Layer 3 Switch. Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddL3If",
+  "params": {
+    "Name_str": "name",
+    "HubName_str": "hubname",
+    "IpAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "HubName_str": "hubname",
+    "IpAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
HubName_strstring (ASCII)Virtual HUB name
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask
+
+

+

"DelL3If" RPC API - Delete Virtual Interface of Virtual Layer 3 Switch

+

Description

+

Delete Virtual Interface of Virtual Layer 3 Switch. Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DelL3If",
+  "params": {
+    "Name_str": "name",
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "HubName_str": "hubname",
+    "IpAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
HubName_strstring (ASCII)Virtual HUB name
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask
+
+

+

"EnumL3If" RPC API - Get List of Interfaces Registered on the Virtual Layer 3 Switch

+

Description

+

Get List of Interfaces Registered on the Virtual Layer 3 Switch. Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumL3If",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "L3IFList": [
+      {
+        "Name_str": "name",
+        "HubName_str": "hubname",
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Name_str": "name",
+        "HubName_str": "hubname",
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Name_str": "name",
+        "HubName_str": "hubname",
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 switch name
L3IFListArray objectLayer-3 interface list
Name_strstring (ASCII)L3 switch name
HubName_strstring (ASCII)Virtual HUB name
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask
+
+

+

"AddL3Table" RPC API - Add Routing Table Entry for Virtual Layer 3 Switch

+

Description

+

Add Routing Table Entry for Virtual Layer 3 Switch. Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddL3Table",
+  "params": {
+    "Name_str": "name",
+    "NetworkAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255",
+    "GatewayAddress_ip": "192.168.0.1",
+    "Metric_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "NetworkAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255",
+    "GatewayAddress_ip": "192.168.0.1",
+    "Metric_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
NetworkAddress_ipstring (IP address)Network address
SubnetMask_ipstring (IP address)Subnet mask
GatewayAddress_ipstring (IP address)Gateway address
Metric_u32number (uint32)Metric
+
+

+

"DelL3Table" RPC API - Delete Routing Table Entry of Virtual Layer 3 Switch

+

Description

+

Delete Routing Table Entry of Virtual Layer 3 Switch. Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DelL3Table",
+  "params": {
+    "Name_str": "name",
+    "NetworkAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255",
+    "GatewayAddress_ip": "192.168.0.1",
+    "Metric_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "NetworkAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255",
+    "GatewayAddress_ip": "192.168.0.1",
+    "Metric_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
NetworkAddress_ipstring (IP address)Network address
SubnetMask_ipstring (IP address)Subnet mask
GatewayAddress_ipstring (IP address)Gateway address
Metric_u32number (uint32)Metric
+
+

+

"EnumL3Table" RPC API - Get List of Routing Tables of Virtual Layer 3 Switch

+

Description

+

Get List of Routing Tables of Virtual Layer 3 Switch. Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumL3Table",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "L3Table": [
+      {
+        "Name_str": "name",
+        "NetworkAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255",
+        "GatewayAddress_ip": "192.168.0.1",
+        "Metric_u32": 0
+      },
+      {
+        "Name_str": "name",
+        "NetworkAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255",
+        "GatewayAddress_ip": "192.168.0.1",
+        "Metric_u32": 0
+      },
+      {
+        "Name_str": "name",
+        "NetworkAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255",
+        "GatewayAddress_ip": "192.168.0.1",
+        "Metric_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
L3TableArray objectRouting table item list
Name_strstring (ASCII)L3 switch name
NetworkAddress_ipstring (IP address)Network address
SubnetMask_ipstring (IP address)Subnet mask
GatewayAddress_ipstring (IP address)Gateway address
Metric_u32number (uint32)Metric
+
+

+

"EnumCrl" RPC API - Get List of Certificates Revocation List

+

Description

+

Get List of Certificates Revocation List. Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumCrl",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "CRLList": [
+      {
+        "Key_u32": 0,
+        "CrlInfo_utf": "crlinfo"
+      },
+      {
+        "Key_u32": 0,
+        "CrlInfo_utf": "crlinfo"
+      },
+      {
+        "Key_u32": 0,
+        "CrlInfo_utf": "crlinfo"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
CRLListArray objectCRL list
Key_u32number (uint32)Key ID
CrlInfo_utfstring (UTF8)The contents of the CRL item
+
+

+

"AddCrl" RPC API - Add a Revoked Certificate

+

Description

+

Add a Revoked Certificate. Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddCrl",
+  "params": {
+    "HubName_str": "hubname",
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
CommonName_utfstring (UTF8)CN, optional
Organization_utfstring (UTF8)O, optional
Unit_utfstring (UTF8)OU, optional
Country_utfstring (UTF8)C, optional
State_utfstring (UTF8)ST, optional
Local_utfstring (UTF8)L, optional
Serial_binstring (Base64 binary)Serial, optional
DigestMD5_binstring (Base64 binary)MD5 Digest, optional
DigestSHA1_binstring (Base64 binary)SHA1 Digest, optional
+
+

+

"DelCrl" RPC API - Delete a Revoked Certificate

+

Description

+

Delete a Revoked Certificate. Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DelCrl",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
CommonName_utfstring (UTF8)CN, optional
Organization_utfstring (UTF8)O, optional
Unit_utfstring (UTF8)OU, optional
Country_utfstring (UTF8)C, optional
State_utfstring (UTF8)ST, optional
Local_utfstring (UTF8)L, optional
Serial_binstring (Base64 binary)Serial, optional
DigestMD5_binstring (Base64 binary)MD5 Digest, optional
DigestSHA1_binstring (Base64 binary)SHA1 Digest, optional
+
+

+

"GetCrl" RPC API - Get a Revoked Certificate

+

Description

+

Get a Revoked Certificate. Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetCrl",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
CommonName_utfstring (UTF8)CN, optional
Organization_utfstring (UTF8)O, optional
Unit_utfstring (UTF8)OU, optional
Country_utfstring (UTF8)C, optional
State_utfstring (UTF8)ST, optional
Local_utfstring (UTF8)L, optional
Serial_binstring (Base64 binary)Serial, optional
DigestMD5_binstring (Base64 binary)MD5 Digest, optional
DigestSHA1_binstring (Base64 binary)SHA1 Digest, optional
+
+

+

"SetCrl" RPC API - Change Existing CRL (Certificate Revocation List) Entry

+

Description

+

Change Existing CRL (Certificate Revocation List) Entry. Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetCrl",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
CommonName_utfstring (UTF8)CN, optional
Organization_utfstring (UTF8)O, optional
Unit_utfstring (UTF8)OU, optional
Country_utfstring (UTF8)C, optional
State_utfstring (UTF8)ST, optional
Local_utfstring (UTF8)L, optional
Serial_binstring (Base64 binary)Serial, optional
DigestMD5_binstring (Base64 binary)MD5 Digest, optional
DigestSHA1_binstring (Base64 binary)SHA1 Digest, optional
+
+

+

"SetAcList" RPC API - Add Rule to Source IP Address Limit List

+

Description

+

Add Rule to Source IP Address Limit List. Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetAcList",
+  "params": {
+    "HubName_str": "hubname",
+    "ACList": [
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "ACList": [
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
ACListArray objectSource IP Address Limit List
Id_u32number (uint32)ID
Priority_u32number (uint32)Priority
Deny_boolbooleanDeny access
Masked_boolbooleanSet true if you want to specify the SubnetMask_ip item.
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask, valid only if Masked_bool == true
+
+

+

"GetAcList" RPC API - Get List of Rule Items of Source IP Address Limit List

+

Description

+

Get List of Rule Items of Source IP Address Limit List. Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetAcList",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "ACList": [
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
ACListArray objectSource IP Address Limit List
Id_u32number (uint32)ID
Priority_u32number (uint32)Priority
Deny_boolbooleanDeny access
Masked_boolbooleanSet true if you want to specify the SubnetMask_ip item.
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask, valid only if Masked_bool == true
+
+

+

"EnumLogFile" RPC API - Get List of Log Files

+

Description

+

Get List of Log Files. Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumLogFile",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "LogFiles": [
+      {
+        "ServerName_str": "servername",
+        "FilePath_str": "filepath",
+        "FileSize_u32": 0,
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "ServerName_str": "servername",
+        "FilePath_str": "filepath",
+        "FileSize_u32": 0,
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "ServerName_str": "servername",
+        "FilePath_str": "filepath",
+        "FileSize_u32": 0,
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
LogFilesArray objectLog file list
ServerName_strstring (ASCII)Server name
FilePath_strstring (ASCII)File path
FileSize_u32number (uint32)File size
UpdatedTime_dtDateLast write date
+
+

+

"ReadLogFile" RPC API - Download a part of Log File

+

Description

+

Download a part of Log File. Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "ReadLogFile",
+  "params": {
+    "FilePath_str": "filepath"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerName_str": "servername",
+    "FilePath_str": "filepath",
+    "Offset_u32": 0,
+    "Buffer_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerName_strstring (ASCII)Server name
FilePath_strstring (ASCII)File Path
Offset_u32number (uint32)Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field.
Buffer_binstring (Base64 binary)Received buffer
+
+

+

"SetSysLog" RPC API - Set syslog Send Function

+

Description

+

Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetSysLog",
+  "params": {
+    "SaveType_u32": 0,
+    "Hostname_str": "hostname",
+    "Port_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "SaveType_u32": 0,
+    "Hostname_str": "hostname",
+    "Port_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
SaveType_u32number (enum)The behavior of the syslog function
Values:
0: Do not use syslog
1: Only server log
2: Server and Virtual HUB security log
3: Server, Virtual HUB security, and packet log
Hostname_strstring (ASCII)Specify the host name or IP address of the syslog server
Port_u32number (uint32)Specify the port number of the syslog server
+
+

+

"GetSysLog" RPC API - Get syslog Send Function

+

Description

+

Get syslog Send Function. This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSysLog",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "SaveType_u32": 0,
+    "Hostname_str": "hostname",
+    "Port_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
SaveType_u32number (enum)The behavior of the syslog function
Values:
0: Do not use syslog
1: Only server log
2: Server and Virtual HUB security log
3: Server, Virtual HUB security, and packet log
Hostname_strstring (ASCII)Specify the host name or IP address of the syslog server
Port_u32number (uint32)Specify the port number of the syslog server
+
+

+

"SetHubMsg" RPC API - Set Today's Message of Virtual Hub

+

Description

+

Set Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubMsg",
+  "params": {
+    "HubName_str": "hubname",
+    "Msg_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Msg_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Msg_binstring (Base64 binary)Message (Unicode strings acceptable)
+
+

+

"GetHubMsg" RPC API - Get Today's Message of Virtual Hub

+

Description

+

Get Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubMsg",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Msg_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Msg_binstring (Base64 binary)Message (Unicode strings acceptable)
+
+

+

"Crash" RPC API - Raise a vital error on the VPN Server / Bridge to terminate the process forcefully

+

Description

+

Raise a vital error on the VPN Server / Bridge to terminate the process forcefully. This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "Crash",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"GetAdminMsg" RPC API - Get the message for administrators

+

Description

+

Get the message for administrators.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetAdminMsg",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Msg_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Msg_binstring (Base64 binary)Message (Unicode strings acceptable)
+
+

+

"Flush" RPC API - Save All Volatile Data of VPN Server / Bridge to the Configuration File

+

Description

+

Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "Flush",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"SetIPsecServices" RPC API - Enable or Disable IPsec VPN Server Function

+

Description

+

Enable or Disable IPsec VPN Server Function. Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetIPsecServices",
+  "params": {
+    "L2TP_Raw_bool": false,
+    "L2TP_IPsec_bool": false,
+    "EtherIP_IPsec_bool": false,
+    "IPsec_Secret_str": "ipsec_secret",
+    "L2TP_DefaultHub_str": "l2tp_defaulthub"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "L2TP_Raw_bool": false,
+    "L2TP_IPsec_bool": false,
+    "EtherIP_IPsec_bool": false,
+    "IPsec_Secret_str": "ipsec_secret",
+    "L2TP_DefaultHub_str": "l2tp_defaulthub"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
L2TP_Raw_boolbooleanEnable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option.
L2TP_IPsec_boolbooleanEnable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option.
EtherIP_IPsec_boolbooleanEnable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging.
IPsec_Secret_strstring (ASCII)Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters.
L2TP_DefaultHub_strstring (ASCII)Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target.
+
+

+

"GetIPsecServices" RPC API - Get the Current IPsec VPN Server Settings

+

Description

+

Get the Current IPsec VPN Server Settings. Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetIPsecServices",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "L2TP_Raw_bool": false,
+    "L2TP_IPsec_bool": false,
+    "EtherIP_IPsec_bool": false,
+    "IPsec_Secret_str": "ipsec_secret",
+    "L2TP_DefaultHub_str": "l2tp_defaulthub"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
L2TP_Raw_boolbooleanEnable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option.
L2TP_IPsec_boolbooleanEnable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option.
EtherIP_IPsec_boolbooleanEnable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging.
IPsec_Secret_strstring (ASCII)Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters.
L2TP_DefaultHub_strstring (ASCII)Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target.
+
+

+

"AddEtherIpId" RPC API - Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices

+

Description

+

Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices. Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddEtherIpId",
+  "params": {
+    "Id_str": "id",
+    "HubName_str": "hubname",
+    "UserName_str": "username",
+    "Password_str": "password"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Id_str": "id",
+    "HubName_str": "hubname",
+    "UserName_str": "username",
+    "Password_str": "password"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Id_strstring (ASCII)Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.
HubName_strstring (ASCII)Specify the name of the Virtual Hub to connect.
UserName_strstring (ASCII)Specify the username to login to the destination Virtual Hub.
Password_strstring (ASCII)Specify the password to login to the destination Virtual Hub.
+
+

+

"GetEtherIpId" RPC API - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions

+

Description

+

Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetEtherIpId",
+  "params": {
+    "Id_str": "id"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Id_str": "id",
+    "HubName_str": "hubname",
+    "UserName_str": "username",
+    "Password_str": "password"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Id_strstring (ASCII)Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.
HubName_strstring (ASCII)Specify the name of the Virtual Hub to connect.
UserName_strstring (ASCII)Specify the username to login to the destination Virtual Hub.
Password_strstring (ASCII)Specify the password to login to the destination Virtual Hub.
+
+

+

"DeleteEtherIpId" RPC API - Delete an EtherIP / L2TPv3 over IPsec Client Setting

+

Description

+

Delete an EtherIP / L2TPv3 over IPsec Client Setting. This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteEtherIpId",
+  "params": {
+    "Id_str": "id"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Id_str": "id",
+    "HubName_str": "hubname",
+    "UserName_str": "username",
+    "Password_str": "password"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Id_strstring (ASCII)Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.
HubName_strstring (ASCII)Specify the name of the Virtual Hub to connect.
UserName_strstring (ASCII)Specify the username to login to the destination Virtual Hub.
Password_strstring (ASCII)Specify the password to login to the destination Virtual Hub.
+
+

+

"EnumEtherIpId" RPC API - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions

+

Description

+

Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumEtherIpId",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Settings": [
+      {
+        "Id_str": "id",
+        "HubName_str": "hubname",
+        "UserName_str": "username",
+        "Password_str": "password"
+      },
+      {
+        "Id_str": "id",
+        "HubName_str": "hubname",
+        "UserName_str": "username",
+        "Password_str": "password"
+      },
+      {
+        "Id_str": "id",
+        "HubName_str": "hubname",
+        "UserName_str": "username",
+        "Password_str": "password"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
SettingsArray objectSetting list
Id_strstring (ASCII)Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.
HubName_strstring (ASCII)Specify the name of the Virtual Hub to connect.
UserName_strstring (ASCII)Specify the username to login to the destination Virtual Hub.
Password_strstring (ASCII)Specify the password to login to the destination Virtual Hub.
+
+

+

"SetOpenVpnSstpConfig" RPC API - Set Settings for OpenVPN Clone Server Function

+

Description

+

Set Settings for OpenVPN Clone Server Function. The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetOpenVpnSstpConfig",
+  "params": {
+    "EnableOpenVPN_bool": false,
+    "OpenVPNPortList_str": "openvpnportlist",
+    "EnableSSTP_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "EnableOpenVPN_bool": false,
+    "OpenVPNPortList_str": "openvpnportlist",
+    "EnableSSTP_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
EnableOpenVPN_boolbooleanSpecify true to enable the OpenVPN Clone Server Function. Specify false to disable.
OpenVPNPortList_strstring (ASCII)Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports.
EnableSSTP_boolbooleanpecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable.
+
+

+

"GetOpenVpnSstpConfig" RPC API - Get the Current Settings of OpenVPN Clone Server Function

+

Description

+

Get the Current Settings of OpenVPN Clone Server Function. Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetOpenVpnSstpConfig",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "EnableOpenVPN_bool": false,
+    "OpenVPNPortList_str": "openvpnportlist",
+    "EnableSSTP_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
EnableOpenVPN_boolbooleanSpecify true to enable the OpenVPN Clone Server Function. Specify false to disable.
OpenVPNPortList_strstring (ASCII)Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports.
EnableSSTP_boolbooleanpecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable.
+
+

+

"GetDDnsClientStatus" RPC API - Show the Current Status of Dynamic DNS Function

+

Description

+

Show the Current Status of Dynamic DNS Function. Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetDDnsClientStatus",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Err_IPv4_u32": 0,
+    "ErrStr_IPv4_utf": "errstr_ipv4",
+    "Err_IPv6_u32": 0,
+    "ErrStr_IPv6_utf": "errstr_ipv6",
+    "CurrentHostName_str": "currenthostname",
+    "CurrentFqdn_str": "currentfqdn",
+    "DnsSuffix_str": "dnssuffix",
+    "CurrentIPv4_str": "currentipv4",
+    "CurrentIPv6_str": "currentipv6"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Err_IPv4_u32number (uint32)Last error code (IPv4)
ErrStr_IPv4_utfstring (UTF8)Last error string (IPv4)
Err_IPv6_u32number (uint32)Last error code (IPv6)
ErrStr_IPv6_utfstring (UTF8)Last error string (IPv6)
CurrentHostName_strstring (ASCII)Current DDNS host name
CurrentFqdn_strstring (ASCII)Current FQDN of the DDNS hostname
DnsSuffix_strstring (ASCII)DDNS suffix
CurrentIPv4_strstring (ASCII)Current IPv4 address of the VPN Server
CurrentIPv6_strstring (ASCII)Current IPv6 address of the VPN Server
+
+

+

"ChangeDDnsClientHostname" RPC API - Set the Dynamic DNS Hostname

+

Description

+

Set the Dynamic DNS Hostname. You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "ChangeDDnsClientHostname",
+  "params": {
+    "StrValue_str": "strvalue"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"RegenerateServerCert" RPC API - Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server

+

Description

+

Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server. You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "RegenerateServerCert",
+  "params": {
+    "StrValue_str": "strvalue"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"MakeOpenVpnConfigFile" RPC API - Generate a Sample Setting File for OpenVPN Client

+

Description

+

Generate a Sample Setting File for OpenVPN Client. Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "MakeOpenVpnConfigFile",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerName_str": "servername",
+    "FilePath_str": "filepath",
+    "Offset_u32": 0,
+    "Buffer_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerName_strstring (ASCII)Server name
FilePath_strstring (ASCII)File Path
Offset_u32number (uint32)Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field.
Buffer_binstring (Base64 binary)Received buffer
+
+

+

"SetSpecialListener" RPC API - Enable / Disable the VPN over ICMP / VPN over DNS Server Function

+

Description

+

Enable / Disable the VPN over ICMP / VPN over DNS Server Function. You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetSpecialListener",
+  "params": {
+    "VpnOverIcmpListener_bool": false,
+    "VpnOverDnsListener_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "VpnOverIcmpListener_bool": false,
+    "VpnOverDnsListener_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
VpnOverIcmpListener_boolbooleanThe flag to activate the VPN over ICMP server function
VpnOverDnsListener_boolbooleanThe flag to activate the VPN over DNS function
+
+

+

"GetSpecialListener" RPC API - Get Current Setting of the VPN over ICMP / VPN over DNS Function

+

Description

+

Get Current Setting of the VPN over ICMP / VPN over DNS Function. Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSpecialListener",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "VpnOverIcmpListener_bool": false,
+    "VpnOverDnsListener_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
VpnOverIcmpListener_boolbooleanThe flag to activate the VPN over ICMP server function
VpnOverDnsListener_boolbooleanThe flag to activate the VPN over DNS function
+
+

+

"GetAzureStatus" RPC API - Show the current status of VPN Azure function

+

Description

+

Show the current status of VPN Azure function. Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetAzureStatus",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IsEnabled_bool": false,
+    "IsConnected_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IsEnabled_boolbooleanWhether VPN Azure Function is Enabled
IsConnected_boolbooleanWhether connection to VPN Azure Cloud Server is established
+
+

+

"SetAzureStatus" RPC API - Enable / Disable VPN Azure Function

+

Description

+

Enable / Disable VPN Azure Function. Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetAzureStatus",
+  "params": {
+    "IsEnabled_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IsEnabled_bool": false,
+    "IsConnected_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IsEnabled_boolbooleanWhether VPN Azure Function is Enabled
IsConnected_boolbooleanWhether connection to VPN Azure Cloud Server is established
+
+

+

"GetDDnsInternetSettng" RPC API - Get the Proxy Settings for Connecting to the DDNS server

+

Description

+

Get the Proxy Settings for Connecting to the DDNS server.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetDDnsInternetSettng",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ProxyType_u32": 0,
+    "ProxyHostName_str": "proxyhostname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "proxyusername",
+    "ProxyPassword_str": "proxypassword"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ProxyType_u32number (enum)Type of proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyHostName_strstring (ASCII)Proxy server host name
ProxyPort_u32number (uint32)Proxy server port number
ProxyUsername_strstring (ASCII)Proxy server user name
ProxyPassword_strstring (ASCII)Proxy server password
+
+

+

"SetDDnsInternetSettng" RPC API - Set the Proxy Settings for Connecting to the DDNS server

+

Description

+

Set the Proxy Settings for Connecting to the DDNS server.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetDDnsInternetSettng",
+  "params": {
+    "ProxyType_u32": 0,
+    "ProxyHostName_str": "proxyhostname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "proxyusername",
+    "ProxyPassword_str": "proxypassword"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ProxyType_u32": 0,
+    "ProxyHostName_str": "proxyhostname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "proxyusername",
+    "ProxyPassword_str": "proxypassword"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ProxyType_u32number (enum)Type of proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyHostName_strstring (ASCII)Proxy server host name
ProxyPort_u32number (uint32)Proxy server port number
ProxyUsername_strstring (ASCII)Proxy server user name
ProxyPassword_strstring (ASCII)Proxy server password
+
+

Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen.
+Copyright (c) 2014-2019 SoftEther VPN Project under the Apache License 2.0.

+ +
+ + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/README.md softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/README.md --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/README.md 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/README.md 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,8735 @@ +# SoftEther VPN Server JSON-RPC API Suite Document +This reference describes all JSON-RPC functions available on SoftEther VPN Server. + + +You can access to the latest [SoftEther VPN Server JSON-RPC Document on GitHub](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/). + + +## What is SoftEther VPN Server JSON-RPC API Suite? +The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions). + + - Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API. + - You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.) + - If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server. + - No need to use any specific API client library since all APIs are provided on the [JSON-RPC 2.0 Specification](https://www.jsonrpc.org/specification). You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment. + - Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. [The Node.js Client Library for VPN Server RPC (vpnrpc)](https://www.npmjs.com/package/vpnrpc) package is also available. + + +## Principle + +### Entry point +The entry point URL of JSON-RPC is: +``` +https://:/api/ +``` + + - Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs. + - If you want to completely disable the JSON-RPC on your VPN Server, set the `DisableJsonRpcWebApi` variable to `true` on the `vpn_server.config`. + + +### JSON-RPC specification +You must use HTTPS 1.1 `POST` method to call each of JSON-RPC APIs. +All APIs are based on the [JSON-RPC 2.0 Specification](https://www.jsonrpc.org/specification). + - JSON-RPC Notification is not supported. + - JSON-RPC Batch is not supported. + + +### "vpnrpc": Node.js Client Library package for VPN Server JSON-RPC +If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [JavaScript Client Library for VPN Server RPC (vpnrpc)](https://www.npmjs.com/package/vpnrpc). + + - You can use the `vpnrpc` library in JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js. + - As a sample code there is the [sample.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts) program in TypeScript. This sample calls all of available JSON-RPC APIs against the specified SoftEther VPN Server. (Note: This sample code is written in TypeScript.) + +You can use the following command to download the `vpnrpc` library package with Node.js. +``` +$ npm install --save-dev vpnrpc +``` + + + +### "vpnrpc.ts": TypeScript Client Library for VPN Server JSON-RPC +If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [TypeScript Client Library for VPN Server RPC (vpnrpc.ts)](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/). + + - You can use the [vpnrpc.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/vpnrpc.ts) library in TypeScript / JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js. + - As a sample code there is the [sample.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts) program in TypeScript. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server. + + +### "vpnserver-jsonrpc-client-csharp": C# Client Library for VPN Server JSON-RPC +If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [vpnserver-jsonrpc-client-csharp C# library](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/). + + - The [client library codes for C#](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/) is written in pure C# 7.3. It works on .NET Core 2.1 or later on Windows, Linux and macOS. Very comfort with Visual Studio for both Windows or macOS. + - As a sample code there is the [VpnServerRpcTest.cs](https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/VpnServerRpcTest.cs) program in C#. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server. + + + +### HTTPS Authentication +You must specify the following HTTPS custom headers for authentication on each of requests. + + +Value | Description +--- | --- +`X-VPNADMIN-HUBNAME` | The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify empty string if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. +`X-VPNADMIN-PASSWORD` | Specify the administration password. + + +- You can omit the above HTTPS custom authentication headers if you are calling JSON-RPC APIs from the web browser which is already logged in to the VPN Server with HTTPS Basic Authentication. In such usage the credential of HTTPS Basic Authtication will be used. + +*** + +## Table of contents +- [Test - Test RPC function](#test) +- [GetServerInfo - Get server information](#getserverinfo) +- [GetServerStatus - Get Current Server Status](#getserverstatus) +- [CreateListener - Create New TCP Listener](#createlistener) +- [EnumListener - Get List of TCP Listeners](#enumlistener) +- [DeleteListener - Delete TCP Listener](#deletelistener) +- [EnableListener - Enable / Disable TCP Listener](#enablelistener) +- [SetServerPassword - Set VPN Server Administrator Password](#setserverpassword) +- [SetFarmSetting - Set the VPN Server clustering configuration](#setfarmsetting) +- [GetFarmSetting - Get Clustering Configuration of Current VPN Server](#getfarmsetting) +- [GetFarmInfo - Get Cluster Member Information](#getfarminfo) +- [EnumFarmMember - Get List of Cluster Members](#enumfarmmember) +- [GetFarmConnectionStatus - Get Connection Status to Cluster Controller](#getfarmconnectionstatus) +- [SetServerCert - Set SSL Certificate and Private Key of VPN Server](#setservercert) +- [GetServerCert - Get SSL Certificate and Private Key of VPN Server](#getservercert) +- [GetServerCipher - Get the Encrypted Algorithm Used for VPN Communication](#getservercipher) +- [SetServerCipher - Set the Encrypted Algorithm Used for VPN Communication](#setservercipher) +- [CreateHub - Create New Virtual Hub](#createhub) +- [SetHub - Set the Virtual Hub configuration](#sethub) +- [GetHub - Get the Virtual Hub configuration](#gethub) +- [EnumHub - Get List of Virtual Hubs](#enumhub) +- [DeleteHub - Delete Virtual Hub](#deletehub) +- [GetHubRadius - Get Setting of RADIUS Server Used for User Authentication](#gethubradius) +- [SetHubRadius - Set RADIUS Server to use for User Authentication](#sethubradius) +- [EnumConnection - Get List of TCP Connections Connecting to the VPN Server](#enumconnection) +- [DisconnectConnection - Disconnect TCP Connections Connecting to the VPN Server](#disconnectconnection) +- [GetConnectionInfo - Get Information of TCP Connections Connecting to the VPN Server](#getconnectioninfo) +- [SetHubOnline - Switch Virtual Hub to Online or Offline](#sethubonline) +- [GetHubStatus - Get Current Status of Virtual Hub](#gethubstatus) +- [SetHubLog - Set the logging configuration of the Virtual Hub](#sethublog) +- [GetHubLog - Get the logging configuration of the Virtual Hub](#gethublog) +- [AddCa - Add Trusted CA Certificate](#addca) +- [EnumCa - Get List of Trusted CA Certificates](#enumca) +- [GetCa - Get Trusted CA Certificate](#getca) +- [DeleteCa - Delete Trusted CA Certificate](#deleteca) +- [CreateLink - Create New Cascade Connection](#createlink) +- [GetLink - Get the Cascade Connection Setting](#getlink) +- [SetLink - Change Existing Cascade Connection](#setlink) +- [EnumLink - Get List of Cascade Connections](#enumlink) +- [SetLinkOnline - Switch Cascade Connection to Online Status](#setlinkonline) +- [SetLinkOffline - Switch Cascade Connection to Offline Status](#setlinkoffline) +- [DeleteLink - Delete Cascade Connection Setting](#deletelink) +- [RenameLink - Change Name of Cascade Connection](#renamelink) +- [GetLinkStatus - Get Current Cascade Connection Status](#getlinkstatus) +- [AddAccess - Add Access List Rule](#addaccess) +- [DeleteAccess - Delete Rule from Access List](#deleteaccess) +- [EnumAccess - Get Access List Rule List](#enumaccess) +- [SetAccessList - Replace all access lists on a single bulk API call](#setaccesslist) +- [CreateUser - Create a user](#createuser) +- [SetUser - Change User Settings](#setuser) +- [GetUser - Get User Settings](#getuser) +- [DeleteUser - Delete a user](#deleteuser) +- [EnumUser - Get List of Users](#enumuser) +- [CreateGroup - Create Group](#creategroup) +- [SetGroup - Set group settings](#setgroup) +- [GetGroup - Get Group Setting (Sync mode)](#getgroup) +- [DeleteGroup - Delete User from Group](#deletegroup) +- [EnumGroup - Get List of Groups](#enumgroup) +- [EnumSession - Get List of Connected VPN Sessions](#enumsession) +- [GetSessionStatus - Get Session Status](#getsessionstatus) +- [DeleteSession - Disconnect Session](#deletesession) +- [EnumMacTable - Get the MAC Address Table Database](#enummactable) +- [DeleteMacTable - Delete MAC Address Table Entry](#deletemactable) +- [EnumIpTable - Get the IP Address Table Database](#enumiptable) +- [DeleteIpTable - Delete IP Address Table Entry](#deleteiptable) +- [SetKeep - Set the Keep Alive Internet Connection Function](#setkeep) +- [GetKeep - Get the Keep Alive Internet Connection Function](#getkeep) +- [EnableSecureNAT - Enable the Virtual NAT and DHCP Server Function (SecureNAT Function)](#enablesecurenat) +- [DisableSecureNAT - Disable the Virtual NAT and DHCP Server Function (SecureNAT Function)](#disablesecurenat) +- [SetSecureNATOption - Change Settings of SecureNAT Function](#setsecurenatoption) +- [GetSecureNATOption - Get Settings of SecureNAT Function](#getsecurenatoption) +- [EnumNAT - Get Virtual NAT Function Session Table of SecureNAT Function](#enumnat) +- [EnumDHCP - Get Virtual DHCP Server Function Lease Table of SecureNAT Function](#enumdhcp) +- [GetSecureNATStatus - Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function)](#getsecurenatstatus) +- [EnumEthernet - Get List of Network Adapters Usable as Local Bridge](#enumethernet) +- [AddLocalBridge - Create Local Bridge Connection](#addlocalbridge) +- [DeleteLocalBridge - Delete Local Bridge Connection](#deletelocalbridge) +- [EnumLocalBridge - Get List of Local Bridge Connection](#enumlocalbridge) +- [GetBridgeSupport - Get whether the localbridge function is supported on the current system](#getbridgesupport) +- [RebootServer - Reboot VPN Server Service](#rebootserver) +- [GetCaps - Get List of Server Functions / Capability](#getcaps) +- [GetConfig - Get the current configuration of the VPN Server](#getconfig) +- [SetConfig - Write Configuration File to VPN Server](#setconfig) +- [GetDefaultHubAdminOptions - Get Virtual Hub Administration Option default values](#getdefaulthubadminoptions) +- [GetHubAdminOptions - Get List of Virtual Hub Administration Options](#gethubadminoptions) +- [SetHubAdminOptions - Set Values of Virtual Hub Administration Options](#sethubadminoptions) +- [GetHubExtOptions - Get List of Virtual Hub Extended Options](#gethubextoptions) +- [SetHubExtOptions - Set a Value of Virtual Hub Extended Options](#sethubextoptions) +- [AddL3Switch - Define New Virtual Layer 3 Switch](#addl3switch) +- [DelL3Switch - Delete Virtual Layer 3 Switch](#dell3switch) +- [EnumL3Switch - Get List of Virtual Layer 3 Switches](#enuml3switch) +- [StartL3Switch - Start Virtual Layer 3 Switch Operation](#startl3switch) +- [StopL3Switch - Stop Virtual Layer 3 Switch Operation](#stopl3switch) +- [AddL3If - Add Virtual Interface to Virtual Layer 3 Switch](#addl3if) +- [DelL3If - Delete Virtual Interface of Virtual Layer 3 Switch](#dell3if) +- [EnumL3If - Get List of Interfaces Registered on the Virtual Layer 3 Switch](#enuml3if) +- [AddL3Table - Add Routing Table Entry for Virtual Layer 3 Switch](#addl3table) +- [DelL3Table - Delete Routing Table Entry of Virtual Layer 3 Switch](#dell3table) +- [EnumL3Table - Get List of Routing Tables of Virtual Layer 3 Switch](#enuml3table) +- [EnumCrl - Get List of Certificates Revocation List](#enumcrl) +- [AddCrl - Add a Revoked Certificate](#addcrl) +- [DelCrl - Delete a Revoked Certificate](#delcrl) +- [GetCrl - Get a Revoked Certificate](#getcrl) +- [SetCrl - Change Existing CRL (Certificate Revocation List) Entry](#setcrl) +- [SetAcList - Add Rule to Source IP Address Limit List](#setaclist) +- [GetAcList - Get List of Rule Items of Source IP Address Limit List](#getaclist) +- [EnumLogFile - Get List of Log Files](#enumlogfile) +- [ReadLogFile - Download a part of Log File](#readlogfile) +- [SetSysLog - Set syslog Send Function](#setsyslog) +- [GetSysLog - Get syslog Send Function](#getsyslog) +- [SetHubMsg - Set Today's Message of Virtual Hub](#sethubmsg) +- [GetHubMsg - Get Today's Message of Virtual Hub](#gethubmsg) +- [Crash - Raise a vital error on the VPN Server / Bridge to terminate the process forcefully](#crash) +- [GetAdminMsg - Get the message for administrators](#getadminmsg) +- [Flush - Save All Volatile Data of VPN Server / Bridge to the Configuration File](#flush) +- [SetIPsecServices - Enable or Disable IPsec VPN Server Function](#setipsecservices) +- [GetIPsecServices - Get the Current IPsec VPN Server Settings](#getipsecservices) +- [AddEtherIpId - Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices](#addetheripid) +- [GetEtherIpId - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions](#getetheripid) +- [DeleteEtherIpId - Delete an EtherIP / L2TPv3 over IPsec Client Setting](#deleteetheripid) +- [EnumEtherIpId - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions](#enumetheripid) +- [SetOpenVpnSstpConfig - Set Settings for OpenVPN Clone Server Function](#setopenvpnsstpconfig) +- [GetOpenVpnSstpConfig - Get the Current Settings of OpenVPN Clone Server Function](#getopenvpnsstpconfig) +- [GetDDnsClientStatus - Show the Current Status of Dynamic DNS Function](#getddnsclientstatus) +- [ChangeDDnsClientHostname - Set the Dynamic DNS Hostname](#changeddnsclienthostname) +- [RegenerateServerCert - Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server](#regenerateservercert) +- [MakeOpenVpnConfigFile - Generate a Sample Setting File for OpenVPN Client](#makeopenvpnconfigfile) +- [SetSpecialListener - Enable / Disable the VPN over ICMP / VPN over DNS Server Function](#setspeciallistener) +- [GetSpecialListener - Get Current Setting of the VPN over ICMP / VPN over DNS Function](#getspeciallistener) +- [GetAzureStatus - Show the current status of VPN Azure function](#getazurestatus) +- [SetAzureStatus - Enable / Disable VPN Azure Function](#setazurestatus) +- [GetDDnsInternetSettng - Get the Proxy Settings for Connecting to the DDNS server](#getddnsinternetsettng) +- [SetDDnsInternetSettng - Set the Proxy Settings for Connecting to the DDNS server](#setddnsinternetsettng) +- [SetVgsConfig - Set the VPN Gate Server Configuration](#setvgsconfig) +- [GetVgsConfig - Get the VPN Gate Server Configuration](#getvgsconfig) + +*** + +## "Test" RPC API - Test RPC function +### Description +Test RPC function. Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "Test", + "params": { + "IntValue_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IntValue_u32": 0, + "Int64Value_u64": 0, + "StrValue_str": "strvalue", + "UniStrValue_utf": "unistrvalue" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IntValue_u32` | `number` (uint32) | A 32-bit integer field +`Int64Value_u64` | `number` (uint64) | A 64-bit integer field +`StrValue_str` | `string` (ASCII) | An Ascii string field +`UniStrValue_utf` | `string` (UTF8) | An UTF-8 string field + +*** + +## "GetServerInfo" RPC API - Get server information +### Description +Get server information. This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetServerInfo", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ServerProductName_str": "serverproductname", + "ServerVersionString_str": "serverversionstring", + "ServerBuildInfoString_str": "serverbuildinfostring", + "ServerVerInt_u32": 0, + "ServerBuildInt_u32": 0, + "ServerHostName_str": "serverhostname", + "ServerType_u32": 0, + "ServerBuildDate_dt": "2020-08-01T12:24:36.123", + "ServerFamilyName_str": "serverfamilyname", + "OsType_u32": 0, + "OsServicePack_u32": 0, + "OsSystemName_str": "ossystemname", + "OsProductName_str": "osproductname", + "OsVendorName_str": "osvendorname", + "OsVersion_str": "osversion", + "KernelName_str": "kernelname", + "KernelVersion_str": "kernelversion" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ServerProductName_str` | `string` (ASCII) | Server product name +`ServerVersionString_str` | `string` (ASCII) | Server version string +`ServerBuildInfoString_str` | `string` (ASCII) | Server build information string +`ServerVerInt_u32` | `number` (uint32) | Server version integer value +`ServerBuildInt_u32` | `number` (uint32) | Server build number integer value +`ServerHostName_str` | `string` (ASCII) | Server host name +`ServerType_u32` | `number` (enum) | Type of server
Values:
`0`: Stand-alone server
`1`: Farm controller server
`2`: Farm member server +`ServerBuildDate_dt` | `Date` | Build date and time of the server +`ServerFamilyName_str` | `string` (ASCII) | Family name +`OsType_u32` | `number` (enum) | OS type
Values:
`1100`: Windows 95
`1200`: Windows 98
`1300`: Windows Me
`1400`: Windows (unknown)
`2100`: Windows NT 4.0 Workstation
`2110`: Windows NT 4.0 Server
`2111`: Windows NT 4.0 Server, Enterprise Edition
`2112`: Windows NT 4.0 Terminal Server
`2113`: BackOffice Server 4.5
`2114`: Small Business Server 4.5
`2200`: Windows 2000 Professional
`2211`: Windows 2000 Server
`2212`: Windows 2000 Advanced Server
`2213`: Windows 2000 Datacenter Server
`2214`: BackOffice Server 2000
`2215`: Small Business Server 2000
`2300`: Windows XP Home Edition
`2301`: Windows XP Professional
`2410`: Windows Server 2003 Web Edition
`2411`: Windows Server 2003 Standard Edition
`2412`: Windows Server 2003 Enterprise Edition
`2413`: Windows Server 2003 DataCenter Edition
`2414`: BackOffice Server 2003
`2415`: Small Business Server 2003
`2500`: Windows Vista
`2510`: Windows Server 2008
`2600`: Windows 7
`2610`: Windows Server 2008 R2
`2700`: Windows 8
`2710`: Windows Server 2012
`2701`: Windows 8.1
`2711`: Windows Server 2012 R2
`2702`: Windows 10
`2712`: Windows Server 10
`2800`: Windows 11 or later
`2810`: Windows Server 11 or later
`3000`: Unknown UNIX
`3100`: Linux
`3200`: Solaris
`3300`: Cygwin
`3400`: BSD
`3500`: MacOS X +`OsServicePack_u32` | `number` (uint32) | Service pack number +`OsSystemName_str` | `string` (ASCII) | OS system name +`OsProductName_str` | `string` (ASCII) | OS product name +`OsVendorName_str` | `string` (ASCII) | OS vendor name +`OsVersion_str` | `string` (ASCII) | OS version +`KernelName_str` | `string` (ASCII) | Kernel name +`KernelVersion_str` | `string` (ASCII) | Kernel version + +*** + +## "GetServerStatus" RPC API - Get Current Server Status +### Description +Get Current Server Status. This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetServerStatus", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ServerType_u32": 0, + "NumTcpConnections_u32": 0, + "NumTcpConnectionsLocal_u32": 0, + "NumTcpConnectionsRemote_u32": 0, + "NumHubTotal_u32": 0, + "NumHubStandalone_u32": 0, + "NumHubStatic_u32": 0, + "NumHubDynamic_u32": 0, + "NumSessionsTotal_u32": 0, + "NumSessionsLocal_u32": 0, + "NumSessionsRemote_u32": 0, + "NumMacTables_u32": 0, + "NumIpTables_u32": 0, + "NumUsers_u32": 0, + "NumGroups_u32": 0, + "AssignedBridgeLicenses_u32": 0, + "AssignedClientLicenses_u32": 0, + "AssignedBridgeLicensesTotal_u32": 0, + "AssignedClientLicensesTotal_u32": 0, + "Recv.BroadcastBytes_u64": 0, + "Recv.BroadcastCount_u64": 0, + "Recv.UnicastBytes_u64": 0, + "Recv.UnicastCount_u64": 0, + "Send.BroadcastBytes_u64": 0, + "Send.BroadcastCount_u64": 0, + "Send.UnicastBytes_u64": 0, + "Send.UnicastCount_u64": 0, + "CurrentTime_dt": "2020-08-01T12:24:36.123", + "CurrentTick_u64": 0, + "StartTime_dt": "2020-08-01T12:24:36.123", + "TotalMemory_u64": 0, + "UsedMemory_u64": 0, + "FreeMemory_u64": 0, + "TotalPhys_u64": 0, + "UsedPhys_u64": 0, + "FreePhys_u64": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ServerType_u32` | `number` (enum) | Type of server
Values:
`0`: Stand-alone server
`1`: Farm controller server
`2`: Farm member server +`NumTcpConnections_u32` | `number` (uint32) | Total number of TCP connections +`NumTcpConnectionsLocal_u32` | `number` (uint32) | Number of Local TCP connections +`NumTcpConnectionsRemote_u32` | `number` (uint32) | Number of remote TCP connections +`NumHubTotal_u32` | `number` (uint32) | Total number of HUBs +`NumHubStandalone_u32` | `number` (uint32) | Nymber of stand-alone HUB +`NumHubStatic_u32` | `number` (uint32) | Number of static HUBs +`NumHubDynamic_u32` | `number` (uint32) | Number of Dynamic HUBs +`NumSessionsTotal_u32` | `number` (uint32) | Total number of sessions +`NumSessionsLocal_u32` | `number` (uint32) | Number of local VPN sessions +`NumSessionsRemote_u32` | `number` (uint32) | The number of remote sessions +`NumMacTables_u32` | `number` (uint32) | Number of MAC table entries (total sum of all Virtual Hubs) +`NumIpTables_u32` | `number` (uint32) | Number of IP table entries (total sum of all Virtual Hubs) +`NumUsers_u32` | `number` (uint32) | Number of users (total sum of all Virtual Hubs) +`NumGroups_u32` | `number` (uint32) | Number of groups (total sum of all Virtual Hubs) +`AssignedBridgeLicenses_u32` | `number` (uint32) | Number of assigned bridge licenses (Useful to make a commercial version) +`AssignedClientLicenses_u32` | `number` (uint32) | Number of assigned client licenses (Useful to make a commercial version) +`AssignedBridgeLicensesTotal_u32` | `number` (uint32) | Number of Assigned bridge license (cluster-wide), useful to make a commercial version +`AssignedClientLicensesTotal_u32` | `number` (uint32) | Number of assigned client licenses (cluster-wide), useful to make a commercial version +`Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) +`CurrentTime_dt` | `Date` | Current time +`CurrentTick_u64` | `number` (uint64) | 64 bit High-Precision Logical System Clock +`StartTime_dt` | `Date` | VPN Server Start-up time +`TotalMemory_u64` | `number` (uint64) | Memory information: Total Memory +`UsedMemory_u64` | `number` (uint64) | Memory information: Used Memory +`FreeMemory_u64` | `number` (uint64) | Memory information: Free Memory +`TotalPhys_u64` | `number` (uint64) | Memory information: Total Phys +`UsedPhys_u64` | `number` (uint64) | Memory information: Used Phys +`FreePhys_u64` | `number` (uint64) | Memory information: Free Phys + +*** + +## "CreateListener" RPC API - Create New TCP Listener +### Description +Create New TCP Listener. This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "CreateListener", + "params": { + "Port_u32": 0, + "Enable_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Port_u32": 0, + "Enable_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Port_u32` | `number` (uint32) | Port number (Range: 1 - 65535) +`Enable_bool` | `boolean` | Active state + +*** + +## "EnumListener" RPC API - Get List of TCP Listeners +### Description +Get List of TCP Listeners. This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumListener", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ListenerList": [ + { + "Ports_u32": 0, + "Enables_bool": false, + "Errors_bool": false + }, + { + "Ports_u32": 0, + "Enables_bool": false, + "Errors_bool": false + }, + { + "Ports_u32": 0, + "Enables_bool": false, + "Errors_bool": false + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ListenerList` | `Array object` | List of listener items +`Ports_u32` | `number` (uint32) | TCP port number (range: 1 - 65535) +`Enables_bool` | `boolean` | Active state +`Errors_bool` | `boolean` | The flag to indicate if the error occurred on the listener port + +*** + +## "DeleteListener" RPC API - Delete TCP Listener +### Description +Delete TCP Listener. This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteListener", + "params": { + "Port_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Port_u32": 0, + "Enable_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Port_u32` | `number` (uint32) | Port number (Range: 1 - 65535) +`Enable_bool` | `boolean` | Active state + +*** + +## "EnableListener" RPC API - Enable / Disable TCP Listener +### Description +Enable / Disable TCP Listener. This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnableListener", + "params": { + "Port_u32": 0, + "Enable_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Port_u32": 0, + "Enable_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Port_u32` | `number` (uint32) | Port number (Range: 1 - 65535) +`Enable_bool` | `boolean` | Active state + +*** + +## "SetServerPassword" RPC API - Set VPN Server Administrator Password +### Description +Set VPN Server Administrator Password. This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetServerPassword", + "params": { + "PlainTextPassword_str": "plaintextpassword" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "PlainTextPassword_str": "plaintextpassword" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`PlainTextPassword_str` | `string` (ASCII) | The plaintext password + +*** + +## "SetFarmSetting" RPC API - Set the VPN Server clustering configuration +### Description +Set the VPN Server clustering configuration. Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetFarmSetting", + "params": { + "ServerType_u32": 0, + "NumPort_u32": 0, + "Ports_u32": [ + 1, + 2, + 3 + ], + "PublicIp_ip": "192.168.0.1", + "ControllerName_str": "controllername", + "ControllerPort_u32": 0, + "MemberPasswordPlaintext_str": "memberpasswordplaintext", + "Weight_u32": 0, + "ControllerOnly_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ServerType_u32": 0, + "NumPort_u32": 0, + "Ports_u32": [ + 1, + 2, + 3 + ], + "PublicIp_ip": "192.168.0.1", + "ControllerName_str": "controllername", + "ControllerPort_u32": 0, + "MemberPasswordPlaintext_str": "memberpasswordplaintext", + "Weight_u32": 0, + "ControllerOnly_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ServerType_u32` | `number` (enum) | Type of server
Values:
`0`: Stand-alone server
`1`: Farm controller server
`2`: Farm member server +`NumPort_u32` | `number` (uint32) | Valid only for Cluster Member servers. Number of the Ports_u32 element. +`Ports_u32` | `number[]` (uint32) | Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers. +`PublicIp_ip` | `string` (IP address) | Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used. +`ControllerName_str` | `string` (ASCII) | Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. +`ControllerPort_u32` | `number` (uint32) | Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. +`MemberPasswordPlaintext_str` | `string` (ASCII) | Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller. +`Weight_u32` | `number` (uint32) | This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used. +`ControllerOnly_bool` | `boolean` | Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments. + +*** + +## "GetFarmSetting" RPC API - Get Clustering Configuration of Current VPN Server +### Description +Get Clustering Configuration of Current VPN Server. You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetFarmSetting", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ServerType_u32": 0, + "NumPort_u32": 0, + "Ports_u32": [ + 1, + 2, + 3 + ], + "PublicIp_ip": "192.168.0.1", + "ControllerName_str": "controllername", + "ControllerPort_u32": 0, + "MemberPasswordPlaintext_str": "memberpasswordplaintext", + "Weight_u32": 0, + "ControllerOnly_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ServerType_u32` | `number` (enum) | Type of server
Values:
`0`: Stand-alone server
`1`: Farm controller server
`2`: Farm member server +`NumPort_u32` | `number` (uint32) | Valid only for Cluster Member servers. Number of the Ports_u32 element. +`Ports_u32` | `number[]` (uint32) | Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers. +`PublicIp_ip` | `string` (IP address) | Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used. +`ControllerName_str` | `string` (ASCII) | Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. +`ControllerPort_u32` | `number` (uint32) | Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. +`MemberPasswordPlaintext_str` | `string` (ASCII) | Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller. +`Weight_u32` | `number` (uint32) | This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used. +`ControllerOnly_bool` | `boolean` | Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments. + +*** + +## "GetFarmInfo" RPC API - Get Cluster Member Information +### Description +Get Cluster Member Information. When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetFarmInfo", + "params": { + "Id_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Id_u32": 0, + "Controller_bool": false, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Ip_ip": "192.168.0.1", + "Hostname_str": "hostname", + "Point_u32": 0, + "NumPort_u32": 0, + "Ports_u32": [ + 1, + 2, + 3 + ], + "ServerCert_bin": "SGVsbG8gV29ybGQ=", + "NumFarmHub_u32": 0, + "HubsList": [ + { + "HubName_str": "hubname", + "DynamicHub_bool": false + }, + { + "HubName_str": "hubname", + "DynamicHub_bool": false + }, + { + "HubName_str": "hubname", + "DynamicHub_bool": false + } + ], + "NumSessions_u32": 0, + "NumTcpConnections_u32": 0, + "Weight_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Id_u32` | `number` (uint32) | ID +`Controller_bool` | `boolean` | The flag if the server is Cluster Controller (false: Cluster Member servers) +`ConnectedTime_dt` | `Date` | Connection Established Time +`Ip_ip` | `string` (IP address) | IP address +`Hostname_str` | `string` (ASCII) | Host name +`Point_u32` | `number` (uint32) | Point +`NumPort_u32` | `number` (uint32) | Number of Public Ports +`Ports_u32` | `number[]` (uint32) | Public Ports +`ServerCert_bin` | `string` (Base64 binary) | Server certificate +`NumFarmHub_u32` | `number` (uint32) | Number of farm HUB +`HubsList` | `Array object` | The hosted Virtual Hub list +`NumSessions_u32` | `number` (uint32) | Number of hosted VPN sessions +`NumTcpConnections_u32` | `number` (uint32) | Number of TCP connections +`Weight_u32` | `number` (uint32) | Performance Standard Ratio +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`DynamicHub_bool` | `boolean` | Dynamic HUB + +*** + +## "EnumFarmMember" RPC API - Get List of Cluster Members +### Description +Get List of Cluster Members. Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumFarmMember", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "NumFarm_u32": 0, + "FarmMemberList": [ + { + "Id_u32": 0, + "Controller_bool": false, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Ip_ip": "192.168.0.1", + "Hostname_str": "hostname", + "Point_u32": 0, + "NumSessions_u32": 0, + "NumTcpConnections_u32": 0, + "NumHubs_u32": 0, + "AssignedClientLicense_u32": 0, + "AssignedBridgeLicense_u32": 0 + }, + { + "Id_u32": 0, + "Controller_bool": false, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Ip_ip": "192.168.0.1", + "Hostname_str": "hostname", + "Point_u32": 0, + "NumSessions_u32": 0, + "NumTcpConnections_u32": 0, + "NumHubs_u32": 0, + "AssignedClientLicense_u32": 0, + "AssignedBridgeLicense_u32": 0 + }, + { + "Id_u32": 0, + "Controller_bool": false, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Ip_ip": "192.168.0.1", + "Hostname_str": "hostname", + "Point_u32": 0, + "NumSessions_u32": 0, + "NumTcpConnections_u32": 0, + "NumHubs_u32": 0, + "AssignedClientLicense_u32": 0, + "AssignedBridgeLicense_u32": 0 + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`NumFarm_u32` | `number` (uint32) | Number of Cluster Members +`FarmMemberList` | `Array object` | Cluster Members list +`Id_u32` | `number` (uint32) | ID +`Controller_bool` | `boolean` | Controller +`ConnectedTime_dt` | `Date` | Connection time +`Ip_ip` | `string` (IP address) | IP address +`Hostname_str` | `string` (ASCII) | Host name +`Point_u32` | `number` (uint32) | Point +`NumSessions_u32` | `number` (uint32) | Number of sessions +`NumTcpConnections_u32` | `number` (uint32) | Number of TCP connections +`NumHubs_u32` | `number` (uint32) | Number of HUBs +`AssignedClientLicense_u32` | `number` (uint32) | Number of assigned client licenses +`AssignedBridgeLicense_u32` | `number` (uint32) | Number of assigned bridge licenses + +*** + +## "GetFarmConnectionStatus" RPC API - Get Connection Status to Cluster Controller +### Description +Get Connection Status to Cluster Controller. Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetFarmConnectionStatus", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Ip_ip": "192.168.0.1", + "Port_u32": 0, + "Online_bool": false, + "LastError_u32": 0, + "StartedTime_dt": "2020-08-01T12:24:36.123", + "FirstConnectedTime_dt": "2020-08-01T12:24:36.123", + "CurrentConnectedTime_dt": "2020-08-01T12:24:36.123", + "NumTry_u32": 0, + "NumConnected_u32": 0, + "NumFailed_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Ip_ip` | `string` (IP address) | IP address +`Port_u32` | `number` (uint32) | Port number +`Online_bool` | `boolean` | Online state +`LastError_u32` | `number` (uint32) | Last error code +`StartedTime_dt` | `Date` | Connection start time +`FirstConnectedTime_dt` | `Date` | First connection time +`CurrentConnectedTime_dt` | `Date` | Connection time of this time +`NumTry_u32` | `number` (uint32) | Number of retries +`NumConnected_u32` | `number` (uint32) | Number of connection count +`NumFailed_u32` | `number` (uint32) | Connection failure count + +*** + +## "SetServerCert" RPC API - Set SSL Certificate and Private Key of VPN Server +### Description +Set SSL Certificate and Private Key of VPN Server. You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetServerCert", + "params": { + "Cert_bin": "SGVsbG8gV29ybGQ=", + "Key_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Cert_bin": "SGVsbG8gV29ybGQ=", + "Key_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Cert_bin` | `string` (Base64 binary) | The body of the certificate +`Key_bin` | `string` (Base64 binary) | The body of the private key + +*** + +## "GetServerCert" RPC API - Get SSL Certificate and Private Key of VPN Server +### Description +Get SSL Certificate and Private Key of VPN Server. Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetServerCert", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Cert_bin": "SGVsbG8gV29ybGQ=", + "Key_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Cert_bin` | `string` (Base64 binary) | The body of the certificate +`Key_bin` | `string` (Base64 binary) | The body of the private key + +*** + +## "GetServerCipher" RPC API - Get the Encrypted Algorithm Used for VPN Communication +### Description +Get the Encrypted Algorithm Used for VPN Communication. Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetServerCipher", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "String_str": "string" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`String_str` | `string` (ASCII) | A string value + +*** + +## "SetServerCipher" RPC API - Set the Encrypted Algorithm Used for VPN Communication +### Description +Set the Encrypted Algorithm Used for VPN Communication. Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetServerCipher", + "params": { + "String_str": "string" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "String_str": "string" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`String_str` | `string` (ASCII) | A string value + +*** + +## "CreateHub" RPC API - Create New Virtual Hub +### Description +Create New Virtual Hub. Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "CreateHub", + "params": { + "HubName_str": "hubname", + "AdminPasswordPlainText_str": "adminpasswordplaintext", + "Online_bool": false, + "MaxSession_u32": 0, + "NoEnum_bool": false, + "HubType_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AdminPasswordPlainText_str": "adminpasswordplaintext", + "Online_bool": false, + "MaxSession_u32": 0, + "NoEnum_bool": false, + "HubType_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Specify the name of the Virtual Hub to create / update. +`AdminPasswordPlainText_str` | `string` (ASCII) | Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. +`Online_bool` | `boolean` | Online flag +`MaxSession_u32` | `number` (uint32) | Maximum number of VPN sessions +`NoEnum_bool` | `boolean` | No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. +`HubType_u32` | `number` (enum) | Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
`0`: Stand-alone HUB
`1`: Static HUB
`2`: Dynamic HUB + +*** + +## "SetHub" RPC API - Set the Virtual Hub configuration +### Description +Set the Virtual Hub configuration. You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetHub", + "params": { + "HubName_str": "hubname", + "AdminPasswordPlainText_str": "adminpasswordplaintext", + "Online_bool": false, + "MaxSession_u32": 0, + "NoEnum_bool": false, + "HubType_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AdminPasswordPlainText_str": "adminpasswordplaintext", + "Online_bool": false, + "MaxSession_u32": 0, + "NoEnum_bool": false, + "HubType_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Specify the name of the Virtual Hub to create / update. +`AdminPasswordPlainText_str` | `string` (ASCII) | Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. +`Online_bool` | `boolean` | Online flag +`MaxSession_u32` | `number` (uint32) | Maximum number of VPN sessions +`NoEnum_bool` | `boolean` | No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. +`HubType_u32` | `number` (enum) | Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
`0`: Stand-alone HUB
`1`: Static HUB
`2`: Dynamic HUB + +*** + +## "GetHub" RPC API - Get the Virtual Hub configuration +### Description +Get the Virtual Hub configuration. You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetHub", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AdminPasswordPlainText_str": "adminpasswordplaintext", + "Online_bool": false, + "MaxSession_u32": 0, + "NoEnum_bool": false, + "HubType_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Specify the name of the Virtual Hub to create / update. +`AdminPasswordPlainText_str` | `string` (ASCII) | Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. +`Online_bool` | `boolean` | Online flag +`MaxSession_u32` | `number` (uint32) | Maximum number of VPN sessions +`NoEnum_bool` | `boolean` | No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. +`HubType_u32` | `number` (enum) | Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
`0`: Stand-alone HUB
`1`: Static HUB
`2`: Dynamic HUB + +*** + +## "EnumHub" RPC API - Get List of Virtual Hubs +### Description +Get List of Virtual Hubs. Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumHub", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "NumHub_u32": 0, + "HubList": [ + { + "HubName_str": "hubname", + "Online_bool": false, + "HubType_u32": 0, + "NumUsers_u32": 0, + "NumGroups_u32": 0, + "NumSessions_u32": 0, + "NumMacTables_u32": 0, + "NumIpTables_u32": 0, + "LastCommTime_dt": "2020-08-01T12:24:36.123", + "LastLoginTime_dt": "2020-08-01T12:24:36.123", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "NumLogin_u32": 0, + "IsTrafficFilled_bool": false, + "Ex.Recv.BroadcastBytes_u64": 0, + "Ex.Recv.BroadcastCount_u64": 0, + "Ex.Recv.UnicastBytes_u64": 0, + "Ex.Recv.UnicastCount_u64": 0, + "Ex.Send.BroadcastBytes_u64": 0, + "Ex.Send.BroadcastCount_u64": 0, + "Ex.Send.UnicastBytes_u64": 0, + "Ex.Send.UnicastCount_u64": 0 + }, + { + "HubName_str": "hubname", + "Online_bool": false, + "HubType_u32": 0, + "NumUsers_u32": 0, + "NumGroups_u32": 0, + "NumSessions_u32": 0, + "NumMacTables_u32": 0, + "NumIpTables_u32": 0, + "LastCommTime_dt": "2020-08-01T12:24:36.123", + "LastLoginTime_dt": "2020-08-01T12:24:36.123", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "NumLogin_u32": 0, + "IsTrafficFilled_bool": false, + "Ex.Recv.BroadcastBytes_u64": 0, + "Ex.Recv.BroadcastCount_u64": 0, + "Ex.Recv.UnicastBytes_u64": 0, + "Ex.Recv.UnicastCount_u64": 0, + "Ex.Send.BroadcastBytes_u64": 0, + "Ex.Send.BroadcastCount_u64": 0, + "Ex.Send.UnicastBytes_u64": 0, + "Ex.Send.UnicastCount_u64": 0 + }, + { + "HubName_str": "hubname", + "Online_bool": false, + "HubType_u32": 0, + "NumUsers_u32": 0, + "NumGroups_u32": 0, + "NumSessions_u32": 0, + "NumMacTables_u32": 0, + "NumIpTables_u32": 0, + "LastCommTime_dt": "2020-08-01T12:24:36.123", + "LastLoginTime_dt": "2020-08-01T12:24:36.123", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "NumLogin_u32": 0, + "IsTrafficFilled_bool": false, + "Ex.Recv.BroadcastBytes_u64": 0, + "Ex.Recv.BroadcastCount_u64": 0, + "Ex.Recv.UnicastBytes_u64": 0, + "Ex.Recv.UnicastCount_u64": 0, + "Ex.Send.BroadcastBytes_u64": 0, + "Ex.Send.BroadcastCount_u64": 0, + "Ex.Send.UnicastBytes_u64": 0, + "Ex.Send.UnicastCount_u64": 0 + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`NumHub_u32` | `number` (uint32) | Number of Virtual Hubs +`HubList` | `Array object` | Virtual Hubs +`HubName_str` | `string` (ASCII) | The name of the Virtual Hub +`Online_bool` | `boolean` | Online state +`HubType_u32` | `number` (enum) | Type of HUB (Valid only for Clustered VPN Servers)
Values:
`0`: Stand-alone HUB
`1`: Static HUB
`2`: Dynamic HUB +`NumUsers_u32` | `number` (uint32) | Number of users +`NumGroups_u32` | `number` (uint32) | Number of registered groups +`NumSessions_u32` | `number` (uint32) | Number of registered sessions +`NumMacTables_u32` | `number` (uint32) | Number of current MAC table entries +`NumIpTables_u32` | `number` (uint32) | Number of current IP table entries +`LastCommTime_dt` | `Date` | Last communication date and time +`LastLoginTime_dt` | `Date` | Last login date and time +`CreatedTime_dt` | `Date` | Creation date and time +`NumLogin_u32` | `number` (uint32) | Number of accumulated logins +`IsTrafficFilled_bool` | `boolean` | Whether the traffic information is provided +`Ex.Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Ex.Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Ex.Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Ex.Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Ex.Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Ex.Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Ex.Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Ex.Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) + +*** + +## "DeleteHub" RPC API - Delete Virtual Hub +### Description +Delete Virtual Hub. Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteHub", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name + +*** + +## "GetHubRadius" RPC API - Get Setting of RADIUS Server Used for User Authentication +### Description +Get Setting of RADIUS Server Used for User Authentication. Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetHubRadius", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "RadiusServerName_str": "radiusservername", + "RadiusPort_u32": 0, + "RadiusSecret_str": "radiussecret", + "RadiusRetryInterval_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`RadiusServerName_str` | `string` (ASCII) | RADIUS server name +`RadiusPort_u32` | `number` (uint32) | RADIUS port number +`RadiusSecret_str` | `string` (ASCII) | Secret key +`RadiusRetryInterval_u32` | `number` (uint32) | Radius retry interval + +*** + +## "SetHubRadius" RPC API - Set RADIUS Server to use for User Authentication +### Description +Set RADIUS Server to use for User Authentication. To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetHubRadius", + "params": { + "HubName_str": "hubname", + "RadiusServerName_str": "radiusservername", + "RadiusPort_u32": 0, + "RadiusSecret_str": "radiussecret", + "RadiusRetryInterval_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "RadiusServerName_str": "radiusservername", + "RadiusPort_u32": 0, + "RadiusSecret_str": "radiussecret", + "RadiusRetryInterval_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`RadiusServerName_str` | `string` (ASCII) | RADIUS server name +`RadiusPort_u32` | `number` (uint32) | RADIUS port number +`RadiusSecret_str` | `string` (ASCII) | Secret key +`RadiusRetryInterval_u32` | `number` (uint32) | Radius retry interval + +*** + +## "EnumConnection" RPC API - Get List of TCP Connections Connecting to the VPN Server +### Description +Get List of TCP Connections Connecting to the VPN Server. Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumConnection", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "NumConnection_u32": 0, + "ConnectionList": [ + { + "Name_str": "name", + "Hostname_str": "hostname", + "Ip_ip": "192.168.0.1", + "Port_u32": 0, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Type_u32": 0 + }, + { + "Name_str": "name", + "Hostname_str": "hostname", + "Ip_ip": "192.168.0.1", + "Port_u32": 0, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Type_u32": 0 + }, + { + "Name_str": "name", + "Hostname_str": "hostname", + "Ip_ip": "192.168.0.1", + "Port_u32": 0, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Type_u32": 0 + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`NumConnection_u32` | `number` (uint32) | Number of connections +`ConnectionList` | `Array object` | Connection list +`Name_str` | `string` (ASCII) | Connection name +`Hostname_str` | `string` (ASCII) | Host name +`Ip_ip` | `string` (IP address) | IP address +`Port_u32` | `number` (uint32) | Port number +`ConnectedTime_dt` | `Date` | Connected time +`Type_u32` | `number` (enum) | Connection type
Values:
`0`: VPN Client
`1`: During initialization
`2`: Login connection
`3`: Additional connection
`4`: RPC for server farm
`5`: RPC for Management
`6`: HUB enumeration
`7`: Password change
`8`: SSTP
`9`: OpenVPN + +*** + +## "DisconnectConnection" RPC API - Disconnect TCP Connections Connecting to the VPN Server +### Description +Disconnect TCP Connections Connecting to the VPN Server. Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DisconnectConnection", + "params": { + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | Connection name + +*** + +## "GetConnectionInfo" RPC API - Get Information of TCP Connections Connecting to the VPN Server +### Description +Get Information of TCP Connections Connecting to the VPN Server. Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetConnectionInfo", + "params": { + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name", + "Type_u32": 0, + "Hostname_str": "hostname", + "Ip_ip": "192.168.0.1", + "Port_u32": 0, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "ServerStr_str": "serverstr", + "ServerVer_u32": 0, + "ServerBuild_u32": 0, + "ClientStr_str": "clientstr", + "ClientVer_u32": 0, + "ClientBuild_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | Connection name +`Type_u32` | `number` (enum) | Type
Values:
`0`: VPN Client
`1`: During initialization
`2`: Login connection
`3`: Additional connection
`4`: RPC for server farm
`5`: RPC for Management
`6`: HUB enumeration
`7`: Password change
`8`: SSTP
`9`: OpenVPN +`Hostname_str` | `string` (ASCII) | Host name +`Ip_ip` | `string` (IP address) | IP address +`Port_u32` | `number` (uint32) | Port number +`ConnectedTime_dt` | `Date` | Connected time +`ServerStr_str` | `string` (ASCII) | Server string +`ServerVer_u32` | `number` (uint32) | Server version +`ServerBuild_u32` | `number` (uint32) | Server build number +`ClientStr_str` | `string` (ASCII) | Client string +`ClientVer_u32` | `number` (uint32) | Client version +`ClientBuild_u32` | `number` (uint32) | Client build number + +*** + +## "SetHubOnline" RPC API - Switch Virtual Hub to Online or Offline +### Description +Switch Virtual Hub to Online or Offline. Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetHubOnline", + "params": { + "HubName_str": "hubname", + "Online_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Online_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Online_bool` | `boolean` | Online / offline flag + +*** + +## "GetHubStatus" RPC API - Get Current Status of Virtual Hub +### Description +Get Current Status of Virtual Hub. Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetHubStatus", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Online_bool": false, + "HubType_u32": 0, + "NumSessions_u32": 0, + "NumSessionsClient_u32": 0, + "NumSessionsBridge_u32": 0, + "NumAccessLists_u32": 0, + "NumUsers_u32": 0, + "NumGroups_u32": 0, + "NumMacTables_u32": 0, + "NumIpTables_u32": 0, + "Recv.BroadcastBytes_u64": 0, + "Recv.BroadcastCount_u64": 0, + "Recv.UnicastBytes_u64": 0, + "Recv.UnicastCount_u64": 0, + "Send.BroadcastBytes_u64": 0, + "Send.BroadcastCount_u64": 0, + "Send.UnicastBytes_u64": 0, + "Send.UnicastCount_u64": 0, + "SecureNATEnabled_bool": false, + "LastCommTime_dt": "2020-08-01T12:24:36.123", + "LastLoginTime_dt": "2020-08-01T12:24:36.123", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "NumLogin_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Online_bool` | `boolean` | Online +`HubType_u32` | `number` (enum) | Type of HUB
Values:
`0`: Stand-alone HUB
`1`: Static HUB
`2`: Dynamic HUB +`NumSessions_u32` | `number` (uint32) | Number of sessions +`NumSessionsClient_u32` | `number` (uint32) | Number of sessions (client mode) +`NumSessionsBridge_u32` | `number` (uint32) | Number of sessions (bridge mode) +`NumAccessLists_u32` | `number` (uint32) | Number of Access list entries +`NumUsers_u32` | `number` (uint32) | Number of users +`NumGroups_u32` | `number` (uint32) | Number of groups +`NumMacTables_u32` | `number` (uint32) | Number of MAC table entries +`NumIpTables_u32` | `number` (uint32) | Number of IP table entries +`Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) +`SecureNATEnabled_bool` | `boolean` | Whether SecureNAT is enabled +`LastCommTime_dt` | `Date` | Last communication date and time +`LastLoginTime_dt` | `Date` | Last login date and time +`CreatedTime_dt` | `Date` | Creation date and time +`NumLogin_u32` | `number` (uint32) | Number of logins + +*** + +## "SetHubLog" RPC API - Set the logging configuration of the Virtual Hub +### Description +Set the logging configuration of the Virtual Hub. Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetHubLog", + "params": { + "HubName_str": "hubname", + "SaveSecurityLog_bool": false, + "SecurityLogSwitchType_u32": 0, + "SavePacketLog_bool": false, + "PacketLogSwitchType_u32": 0, + "PacketLogConfig_u32": [ + 1, + 2, + 3 + ] + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "SaveSecurityLog_bool": false, + "SecurityLogSwitchType_u32": 0, + "SavePacketLog_bool": false, + "PacketLogSwitchType_u32": 0, + "PacketLogConfig_u32": [ + 1, + 2, + 3 + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`SaveSecurityLog_bool` | `boolean` | The flag to enable / disable saving the security log +`SecurityLogSwitchType_u32` | `number` (enum) | The log filename switching setting of the security log
Values:
`0`: No switching
`1`: Secondly basis
`2`: Minutely basis
`3`: Hourly basis
`4`: Daily basis
`5`: Monthly basis +`SavePacketLog_bool` | `boolean` | The flag to enable / disable saving the security log +`PacketLogSwitchType_u32` | `number` (enum) | The log filename switching settings of the packet logs
Values:
`0`: No switching
`1`: Secondly basis
`2`: Minutely basis
`3`: Hourly basis
`4`: Daily basis
`5`: Monthly basis +`PacketLogConfig_u32` | `number` (enum) | Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7.
Values:
`0`: Not save
`1`: Only header
`2`: All payloads + +*** + +## "GetHubLog" RPC API - Get the logging configuration of the Virtual Hub +### Description +Get the logging configuration of the Virtual Hub. Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetHubLog", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "SaveSecurityLog_bool": false, + "SecurityLogSwitchType_u32": 0, + "SavePacketLog_bool": false, + "PacketLogSwitchType_u32": 0, + "PacketLogConfig_u32": [ + 1, + 2, + 3 + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`SaveSecurityLog_bool` | `boolean` | The flag to enable / disable saving the security log +`SecurityLogSwitchType_u32` | `number` (enum) | The log filename switching setting of the security log
Values:
`0`: No switching
`1`: Secondly basis
`2`: Minutely basis
`3`: Hourly basis
`4`: Daily basis
`5`: Monthly basis +`SavePacketLog_bool` | `boolean` | The flag to enable / disable saving the security log +`PacketLogSwitchType_u32` | `number` (enum) | The log filename switching settings of the packet logs
Values:
`0`: No switching
`1`: Secondly basis
`2`: Minutely basis
`3`: Hourly basis
`4`: Daily basis
`5`: Monthly basis +`PacketLogConfig_u32` | `number` (enum) | Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7.
Values:
`0`: Not save
`1`: Only header
`2`: All payloads + +*** + +## "AddCa" RPC API - Add Trusted CA Certificate +### Description +Add Trusted CA Certificate. Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "AddCa", + "params": { + "HubName_str": "hubname", + "Cert_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Cert_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Cert_bin` | `string` (Base64 binary) | The body of the X.509 certificate + +*** + +## "EnumCa" RPC API - Get List of Trusted CA Certificates +### Description +Get List of Trusted CA Certificates. Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumCa", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "CAList": [ + { + "Key_u32": 0, + "SubjectName_utf": "subjectname", + "IssuerName_utf": "issuername", + "Expires_dt": "2020-08-01T12:24:36.123" + }, + { + "Key_u32": 0, + "SubjectName_utf": "subjectname", + "IssuerName_utf": "issuername", + "Expires_dt": "2020-08-01T12:24:36.123" + }, + { + "Key_u32": 0, + "SubjectName_utf": "subjectname", + "IssuerName_utf": "issuername", + "Expires_dt": "2020-08-01T12:24:36.123" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`CAList` | `Array object` | The list of CA +`Key_u32` | `number` (uint32) | The key id of the item +`SubjectName_utf` | `string` (UTF8) | Subject +`IssuerName_utf` | `string` (UTF8) | Issuer +`Expires_dt` | `Date` | Expiration date + +*** + +## "GetCa" RPC API - Get Trusted CA Certificate +### Description +Get Trusted CA Certificate. Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetCa", + "params": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Key_u32": 0, + "Cert_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Key_u32` | `number` (uint32) | The key id of the certificate +`Cert_bin` | `string` (Base64 binary) | The body of the X.509 certificate + +*** + +## "DeleteCa" RPC API - Delete Trusted CA Certificate +### Description +Delete Trusted CA Certificate. Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteCa", + "params": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Key_u32` | `number` (uint32) | Certificate key id to be deleted + +*** + +## "CreateLink" RPC API - Create New Cascade Connection +### Description +Create New Cascade Connection. Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "CreateLink", + "params": { + "HubName_Ex_str": "hubname_ex", + "CheckServerCert_bool": false, + "AccountName_utf": "clientoption_accountname", + "Hostname_str": "clientoption_hostname", + "Port_u32": 0, + "ProxyType_u32": 0, + "HubName_str": "clientoption_hubname", + "MaxConnection_u32": 0, + "UseEncrypt_bool": false, + "UseCompress_bool": false, + "HalfConnection_bool": false, + "AdditionalConnectionInterval_u32": 0, + "ConnectionDisconnectSpan_u32": 0, + "AuthType_u32": 0, + "Username_str": "clientauth_username", + "HashedPassword_bin": "SGVsbG8gV29ybGQ=", + "PlainPassword_str": "clientauth_plainpassword", + "ClientX_bin": "SGVsbG8gV29ybGQ=", + "ClientK_bin": "SGVsbG8gV29ybGQ=", + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "SecPol_CheckMac_bool": false, + "SecPol_CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:RSandRAFilter_bool": false, + "SecPol_RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "SecPol_CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_Ex_str": "hubname_ex", + "Online_bool": false, + "CheckServerCert_bool": false, + "ServerCert_bin": "SGVsbG8gV29ybGQ=", + "AccountName_utf": "clientoption_accountname", + "Hostname_str": "clientoption_hostname", + "Port_u32": 0, + "ProxyType_u32": 0, + "ProxyName_str": "clientoption_proxyname", + "ProxyPort_u32": 0, + "ProxyUsername_str": "clientoption_proxyusername", + "ProxyPassword_str": "clientoption_proxypassword", + "HubName_str": "clientoption_hubname", + "MaxConnection_u32": 0, + "UseEncrypt_bool": false, + "UseCompress_bool": false, + "HalfConnection_bool": false, + "AdditionalConnectionInterval_u32": 0, + "ConnectionDisconnectSpan_u32": 0, + "DisableQoS_bool": false, + "NoTls1_bool": false, + "NoUdpAcceleration_bool": false, + "AuthType_u32": 0, + "Username_str": "clientauth_username", + "HashedPassword_bin": "SGVsbG8gV29ybGQ=", + "PlainPassword_str": "clientauth_plainpassword", + "ClientX_bin": "SGVsbG8gV29ybGQ=", + "ClientK_bin": "SGVsbG8gV29ybGQ=", + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "SecPol_CheckMac_bool": false, + "SecPol_CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:RSandRAFilter_bool": false, + "SecPol_RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "SecPol_CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_Ex_str` | `string` (ASCII) | The Virtual Hub name +`Online_bool` | `boolean` | Online flag +`CheckServerCert_bool` | `boolean` | The flag to enable validation for the server certificate +`ServerCert_bin` | `string` (Base64 binary) | The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. +`AccountName_utf` | `string` (UTF8) | Client Option Parameters: Specify the name of the Cascade Connection +`Hostname_str` | `string` (ASCII) | Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. +`Port_u32` | `number` (uint32) | Client Option Parameters: Specify the port number of the destination VPN Server. +`ProxyType_u32` | `number` (enum) | Client Option Parameters: The type of the proxy server
Values:
`0`: Direct TCP connection
`1`: Connection via HTTP proxy server
`2`: Connection via SOCKS proxy server +`ProxyName_str` | `string` (ASCII) | Client Option Parameters: The hostname or IP address of the proxy server name +`ProxyPort_u32` | `number` (uint32) | Client Option Parameters: The port number of the proxy server +`ProxyUsername_str` | `string` (ASCII) | Client Option Parameters: The username to connect to the proxy server +`ProxyPassword_str` | `string` (ASCII) | Client Option Parameters: The password to connect to the proxy server +`HubName_str` | `string` (ASCII) | Client Option Parameters: The Virtual Hub on the destination VPN Server +`MaxConnection_u32` | `number` (uint32) | Client Option Parameters: Number of TCP Connections to Use in VPN Communication +`UseEncrypt_bool` | `boolean` | Client Option Parameters: The flag to enable the encryption on the communication +`UseCompress_bool` | `boolean` | Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection +`HalfConnection_bool` | `boolean` | Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. +`AdditionalConnectionInterval_u32` | `number` (uint32) | Client Option Parameters: Connection attempt interval when additional connection will be established +`ConnectionDisconnectSpan_u32` | `number` (uint32) | Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) +`DisableQoS_bool` | `boolean` | Client Option Parameters: Disable QoS Control Function if the value is true +`NoTls1_bool` | `boolean` | Client Option Parameters: Do not use TLS 1.x of the value is true +`NoUdpAcceleration_bool` | `boolean` | Client Option Parameters: Do not use UDP acceleration mode if the value is true +`AuthType_u32` | `number` (enum) | Authentication type
Values:
`0`: Anonymous authentication
`1`: SHA-0 hashed password authentication
`2`: Plain password authentication
`3`: Certificate authentication +`Username_str` | `string` (ASCII) | User name +`HashedPassword_bin` | `string` (Base64 binary) | SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). +`PlainPassword_str` | `string` (ASCII) | Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). +`ClientX_bin` | `string` (Base64 binary) | Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). +`ClientK_bin` | `string` (Base64 binary) | Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`SecPol_CheckMac_bool` | `boolean` | Security policy: Prohibit the duplicate MAC address +`SecPol_CheckIP_bool` | `boolean` | Security policy: Prohibit a duplicate IP address (IPv4) +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`SecPol_RAFilter_bool` | `boolean` | Security policy: Filter the router advertisement packet (IPv6) +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`SecPol_CheckIPv6_bool` | `boolean` | Security policy: Prohibit the duplicate IP address (IPv6) +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "GetLink" RPC API - Get the Cascade Connection Setting +### Description +Get the Cascade Connection Setting. Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetLink", + "params": { + "HubName_Ex_str": "hubname_ex", + "AccountName_utf": "clientoption_accountname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_Ex_str": "hubname_ex", + "Online_bool": false, + "CheckServerCert_bool": false, + "ServerCert_bin": "SGVsbG8gV29ybGQ=", + "AccountName_utf": "clientoption_accountname", + "Hostname_str": "clientoption_hostname", + "Port_u32": 0, + "ProxyType_u32": 0, + "ProxyName_str": "clientoption_proxyname", + "ProxyPort_u32": 0, + "ProxyUsername_str": "clientoption_proxyusername", + "ProxyPassword_str": "clientoption_proxypassword", + "HubName_str": "clientoption_hubname", + "MaxConnection_u32": 0, + "UseEncrypt_bool": false, + "UseCompress_bool": false, + "HalfConnection_bool": false, + "AdditionalConnectionInterval_u32": 0, + "ConnectionDisconnectSpan_u32": 0, + "DisableQoS_bool": false, + "NoTls1_bool": false, + "NoUdpAcceleration_bool": false, + "AuthType_u32": 0, + "Username_str": "clientauth_username", + "HashedPassword_bin": "SGVsbG8gV29ybGQ=", + "PlainPassword_str": "clientauth_plainpassword", + "ClientX_bin": "SGVsbG8gV29ybGQ=", + "ClientK_bin": "SGVsbG8gV29ybGQ=", + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "SecPol_CheckMac_bool": false, + "SecPol_CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:RSandRAFilter_bool": false, + "SecPol_RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "SecPol_CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_Ex_str` | `string` (ASCII) | The Virtual Hub name +`Online_bool` | `boolean` | Online flag +`CheckServerCert_bool` | `boolean` | The flag to enable validation for the server certificate +`ServerCert_bin` | `string` (Base64 binary) | The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. +`AccountName_utf` | `string` (UTF8) | Client Option Parameters: Specify the name of the Cascade Connection +`Hostname_str` | `string` (ASCII) | Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. +`Port_u32` | `number` (uint32) | Client Option Parameters: Specify the port number of the destination VPN Server. +`ProxyType_u32` | `number` (enum) | Client Option Parameters: The type of the proxy server
Values:
`0`: Direct TCP connection
`1`: Connection via HTTP proxy server
`2`: Connection via SOCKS proxy server +`ProxyName_str` | `string` (ASCII) | Client Option Parameters: The hostname or IP address of the proxy server name +`ProxyPort_u32` | `number` (uint32) | Client Option Parameters: The port number of the proxy server +`ProxyUsername_str` | `string` (ASCII) | Client Option Parameters: The username to connect to the proxy server +`ProxyPassword_str` | `string` (ASCII) | Client Option Parameters: The password to connect to the proxy server +`HubName_str` | `string` (ASCII) | Client Option Parameters: The Virtual Hub on the destination VPN Server +`MaxConnection_u32` | `number` (uint32) | Client Option Parameters: Number of TCP Connections to Use in VPN Communication +`UseEncrypt_bool` | `boolean` | Client Option Parameters: The flag to enable the encryption on the communication +`UseCompress_bool` | `boolean` | Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection +`HalfConnection_bool` | `boolean` | Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. +`AdditionalConnectionInterval_u32` | `number` (uint32) | Client Option Parameters: Connection attempt interval when additional connection will be established +`ConnectionDisconnectSpan_u32` | `number` (uint32) | Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) +`DisableQoS_bool` | `boolean` | Client Option Parameters: Disable QoS Control Function if the value is true +`NoTls1_bool` | `boolean` | Client Option Parameters: Do not use TLS 1.x of the value is true +`NoUdpAcceleration_bool` | `boolean` | Client Option Parameters: Do not use UDP acceleration mode if the value is true +`AuthType_u32` | `number` (enum) | Authentication type
Values:
`0`: Anonymous authentication
`1`: SHA-0 hashed password authentication
`2`: Plain password authentication
`3`: Certificate authentication +`Username_str` | `string` (ASCII) | User name +`HashedPassword_bin` | `string` (Base64 binary) | SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). +`PlainPassword_str` | `string` (ASCII) | Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). +`ClientX_bin` | `string` (Base64 binary) | Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). +`ClientK_bin` | `string` (Base64 binary) | Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`SecPol_CheckMac_bool` | `boolean` | Security policy: Prohibit the duplicate MAC address +`SecPol_CheckIP_bool` | `boolean` | Security policy: Prohibit a duplicate IP address (IPv4) +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`SecPol_RAFilter_bool` | `boolean` | Security policy: Filter the router advertisement packet (IPv6) +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`SecPol_CheckIPv6_bool` | `boolean` | Security policy: Prohibit the duplicate IP address (IPv6) +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "SetLink" RPC API - Change Existing Cascade Connection +### Description +Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetLink", + "params": { + "HubName_Ex_str": "hubname_ex", + "CheckServerCert_bool": false, + "AccountName_utf": "clientoption_accountname", + "Hostname_str": "clientoption_hostname", + "Port_u32": 0, + "ProxyType_u32": 0, + "HubName_str": "clientoption_hubname", + "MaxConnection_u32": 0, + "UseEncrypt_bool": false, + "UseCompress_bool": false, + "HalfConnection_bool": false, + "AdditionalConnectionInterval_u32": 0, + "ConnectionDisconnectSpan_u32": 0, + "AuthType_u32": 0, + "Username_str": "clientauth_username", + "HashedPassword_bin": "SGVsbG8gV29ybGQ=", + "PlainPassword_str": "clientauth_plainpassword", + "ClientX_bin": "SGVsbG8gV29ybGQ=", + "ClientK_bin": "SGVsbG8gV29ybGQ=", + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "SecPol_CheckMac_bool": false, + "SecPol_CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:RSandRAFilter_bool": false, + "SecPol_RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "SecPol_CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_Ex_str": "hubname_ex", + "Online_bool": false, + "CheckServerCert_bool": false, + "ServerCert_bin": "SGVsbG8gV29ybGQ=", + "AccountName_utf": "clientoption_accountname", + "Hostname_str": "clientoption_hostname", + "Port_u32": 0, + "ProxyType_u32": 0, + "ProxyName_str": "clientoption_proxyname", + "ProxyPort_u32": 0, + "ProxyUsername_str": "clientoption_proxyusername", + "ProxyPassword_str": "clientoption_proxypassword", + "HubName_str": "clientoption_hubname", + "MaxConnection_u32": 0, + "UseEncrypt_bool": false, + "UseCompress_bool": false, + "HalfConnection_bool": false, + "AdditionalConnectionInterval_u32": 0, + "ConnectionDisconnectSpan_u32": 0, + "DisableQoS_bool": false, + "NoTls1_bool": false, + "NoUdpAcceleration_bool": false, + "AuthType_u32": 0, + "Username_str": "clientauth_username", + "HashedPassword_bin": "SGVsbG8gV29ybGQ=", + "PlainPassword_str": "clientauth_plainpassword", + "ClientX_bin": "SGVsbG8gV29ybGQ=", + "ClientK_bin": "SGVsbG8gV29ybGQ=", + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "SecPol_CheckMac_bool": false, + "SecPol_CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:RSandRAFilter_bool": false, + "SecPol_RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "SecPol_CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_Ex_str` | `string` (ASCII) | The Virtual Hub name +`Online_bool` | `boolean` | Online flag +`CheckServerCert_bool` | `boolean` | The flag to enable validation for the server certificate +`ServerCert_bin` | `string` (Base64 binary) | The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. +`AccountName_utf` | `string` (UTF8) | Client Option Parameters: Specify the name of the Cascade Connection +`Hostname_str` | `string` (ASCII) | Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. +`Port_u32` | `number` (uint32) | Client Option Parameters: Specify the port number of the destination VPN Server. +`ProxyType_u32` | `number` (enum) | Client Option Parameters: The type of the proxy server
Values:
`0`: Direct TCP connection
`1`: Connection via HTTP proxy server
`2`: Connection via SOCKS proxy server +`ProxyName_str` | `string` (ASCII) | Client Option Parameters: The hostname or IP address of the proxy server name +`ProxyPort_u32` | `number` (uint32) | Client Option Parameters: The port number of the proxy server +`ProxyUsername_str` | `string` (ASCII) | Client Option Parameters: The username to connect to the proxy server +`ProxyPassword_str` | `string` (ASCII) | Client Option Parameters: The password to connect to the proxy server +`HubName_str` | `string` (ASCII) | Client Option Parameters: The Virtual Hub on the destination VPN Server +`MaxConnection_u32` | `number` (uint32) | Client Option Parameters: Number of TCP Connections to Use in VPN Communication +`UseEncrypt_bool` | `boolean` | Client Option Parameters: The flag to enable the encryption on the communication +`UseCompress_bool` | `boolean` | Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection +`HalfConnection_bool` | `boolean` | Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. +`AdditionalConnectionInterval_u32` | `number` (uint32) | Client Option Parameters: Connection attempt interval when additional connection will be established +`ConnectionDisconnectSpan_u32` | `number` (uint32) | Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) +`DisableQoS_bool` | `boolean` | Client Option Parameters: Disable QoS Control Function if the value is true +`NoTls1_bool` | `boolean` | Client Option Parameters: Do not use TLS 1.x of the value is true +`NoUdpAcceleration_bool` | `boolean` | Client Option Parameters: Do not use UDP acceleration mode if the value is true +`AuthType_u32` | `number` (enum) | Authentication type
Values:
`0`: Anonymous authentication
`1`: SHA-0 hashed password authentication
`2`: Plain password authentication
`3`: Certificate authentication +`Username_str` | `string` (ASCII) | User name +`HashedPassword_bin` | `string` (Base64 binary) | SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). +`PlainPassword_str` | `string` (ASCII) | Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). +`ClientX_bin` | `string` (Base64 binary) | Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). +`ClientK_bin` | `string` (Base64 binary) | Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`SecPol_CheckMac_bool` | `boolean` | Security policy: Prohibit the duplicate MAC address +`SecPol_CheckIP_bool` | `boolean` | Security policy: Prohibit a duplicate IP address (IPv4) +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`SecPol_RAFilter_bool` | `boolean` | Security policy: Filter the router advertisement packet (IPv6) +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`SecPol_CheckIPv6_bool` | `boolean` | Security policy: Prohibit the duplicate IP address (IPv6) +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "EnumLink" RPC API - Get List of Cascade Connections +### Description +Get List of Cascade Connections. Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumLink", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "NumLink_u32": 0, + "LinkList": [ + { + "AccountName_utf": "accountname", + "Online_bool": false, + "Connected_bool": false, + "LastError_u32": 0, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Hostname_str": "hostname", + "TargetHubName_str": "targethubname" + }, + { + "AccountName_utf": "accountname", + "Online_bool": false, + "Connected_bool": false, + "LastError_u32": 0, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Hostname_str": "hostname", + "TargetHubName_str": "targethubname" + }, + { + "AccountName_utf": "accountname", + "Online_bool": false, + "Connected_bool": false, + "LastError_u32": 0, + "ConnectedTime_dt": "2020-08-01T12:24:36.123", + "Hostname_str": "hostname", + "TargetHubName_str": "targethubname" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`NumLink_u32` | `number` (uint32) | Number of cascade connections +`LinkList` | `Array object` | The list of cascade connections +`AccountName_utf` | `string` (UTF8) | The name of cascade connection +`Online_bool` | `boolean` | Online flag +`Connected_bool` | `boolean` | The flag indicates whether the cascade connection is established +`LastError_u32` | `number` (uint32) | The error last occurred if the cascade connection is in the fail state +`ConnectedTime_dt` | `Date` | Connection completion time +`Hostname_str` | `string` (ASCII) | Host name of the destination VPN server +`TargetHubName_str` | `string` (ASCII) | The Virtual Hub name + +*** + +## "SetLinkOnline" RPC API - Switch Cascade Connection to Online Status +### Description +Switch Cascade Connection to Online Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetLinkOnline", + "params": { + "HubName_str": "hubname", + "AccountName_utf": "accountname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AccountName_utf": "accountname" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`AccountName_utf` | `string` (UTF8) | The name of the cascade connection + +*** + +## "SetLinkOffline" RPC API - Switch Cascade Connection to Offline Status +### Description +Switch Cascade Connection to Offline Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetLinkOffline", + "params": { + "HubName_str": "hubname", + "AccountName_utf": "accountname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AccountName_utf": "accountname" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`AccountName_utf` | `string` (UTF8) | The name of the cascade connection + +*** + +## "DeleteLink" RPC API - Delete Cascade Connection Setting +### Description +Delete Cascade Connection Setting. Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteLink", + "params": { + "HubName_str": "hubname", + "AccountName_utf": "accountname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AccountName_utf": "accountname" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`AccountName_utf` | `string` (UTF8) | The name of the cascade connection + +*** + +## "RenameLink" RPC API - Change Name of Cascade Connection +### Description +Change Name of Cascade Connection. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "RenameLink", + "params": { + "HubName_str": "hubname", + "OldAccountName_utf": "oldaccountname", + "NewAccountName_utf": "newaccountname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "OldAccountName_utf": "oldaccountname", + "NewAccountName_utf": "newaccountname" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`OldAccountName_utf` | `string` (UTF8) | The old name of the cascade connection +`NewAccountName_utf` | `string` (UTF8) | The new name of the cascade connection + +*** + +## "GetLinkStatus" RPC API - Get Current Cascade Connection Status +### Description +Get Current Cascade Connection Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetLinkStatus", + "params": { + "HubName_Ex_str": "hubname_ex", + "AccountName_utf": "accountname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_Ex_str": "hubname_ex", + "AccountName_utf": "accountname", + "Active_bool": false, + "Connected_bool": false, + "SessionStatus_u32": 0, + "ServerName_str": "servername", + "ServerPort_u32": 0, + "ServerProductName_str": "serverproductname", + "ServerProductVer_u32": 0, + "ServerProductBuild_u32": 0, + "ServerX_bin": "SGVsbG8gV29ybGQ=", + "ClientX_bin": "SGVsbG8gV29ybGQ=", + "StartTime_dt": "2020-08-01T12:24:36.123", + "FirstConnectionEstablisiedTime_dt": "2020-08-01T12:24:36.123", + "CurrentConnectionEstablishTime_dt": "2020-08-01T12:24:36.123", + "NumConnectionsEatablished_u32": 0, + "HalfConnection_bool": false, + "QoS_bool": false, + "MaxTcpConnections_u32": 0, + "NumTcpConnections_u32": 0, + "NumTcpConnectionsUpload_u32": 0, + "NumTcpConnectionsDownload_u32": 0, + "UseEncrypt_bool": false, + "CipherName_str": "ciphername", + "UseCompress_bool": false, + "IsRUDPSession_bool": false, + "UnderlayProtocol_str": "underlayprotocol", + "IsUdpAccelerationEnabled_bool": false, + "IsUsingUdpAcceleration_bool": false, + "SessionName_str": "sessionname", + "ConnectionName_str": "connectionname", + "SessionKey_bin": "SGVsbG8gV29ybGQ=", + "TotalSendSize_u64": 0, + "TotalRecvSize_u64": 0, + "TotalSendSizeReal_u64": 0, + "TotalRecvSizeReal_u64": 0, + "IsBridgeMode_bool": false, + "IsMonitorMode_bool": false, + "VLanId_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_Ex_str` | `string` (ASCII) | The Virtual Hub name +`AccountName_utf` | `string` (UTF8) | The name of the cascade connection +`Active_bool` | `boolean` | The flag whether the cascade connection is enabled +`Connected_bool` | `boolean` | The flag whether the cascade connection is established +`SessionStatus_u32` | `number` (enum) | The session status
Values:
`0`: Connecting
`1`: Negotiating
`2`: During user authentication
`3`: Connection complete
`4`: Wait to retry
`5`: Idle state +`ServerName_str` | `string` (ASCII) | The destination VPN server name +`ServerPort_u32` | `number` (uint32) | The port number of the server +`ServerProductName_str` | `string` (ASCII) | Server product name +`ServerProductVer_u32` | `number` (uint32) | Server product version +`ServerProductBuild_u32` | `number` (uint32) | Server product build number +`ServerX_bin` | `string` (Base64 binary) | Server's X.509 certificate +`ClientX_bin` | `string` (Base64 binary) | Client certificate +`StartTime_dt` | `Date` | Connection start time +`FirstConnectionEstablisiedTime_dt` | `Date` | Connection completion time of the first connection +`CurrentConnectionEstablishTime_dt` | `Date` | Connection completion time of this connection +`NumConnectionsEatablished_u32` | `number` (uint32) | Number of connections have been established so far +`HalfConnection_bool` | `boolean` | Half-connection +`QoS_bool` | `boolean` | VoIP / QoS +`MaxTcpConnections_u32` | `number` (uint32) | Maximum number of the underlying TCP connections +`NumTcpConnections_u32` | `number` (uint32) | Number of current underlying TCP connections +`NumTcpConnectionsUpload_u32` | `number` (uint32) | Number of underlying inbound TCP connections +`NumTcpConnectionsDownload_u32` | `number` (uint32) | Number of underlying outbound TCP connections +`UseEncrypt_bool` | `boolean` | Use of encryption +`CipherName_str` | `string` (ASCII) | Cipher algorithm name +`UseCompress_bool` | `boolean` | Use of compression +`IsRUDPSession_bool` | `boolean` | The flag whether this is a R-UDP session +`UnderlayProtocol_str` | `string` (ASCII) | Underlying physical communication protocol +`IsUdpAccelerationEnabled_bool` | `boolean` | The UDP acceleration is enabled +`IsUsingUdpAcceleration_bool` | `boolean` | The UDP acceleration is being actually used +`SessionName_str` | `string` (ASCII) | Session name +`ConnectionName_str` | `string` (ASCII) | Connection name +`SessionKey_bin` | `string` (Base64 binary) | Session key +`TotalSendSize_u64` | `number` (uint64) | Total transmitted data size +`TotalRecvSize_u64` | `number` (uint64) | Total received data size +`TotalSendSizeReal_u64` | `number` (uint64) | Total transmitted data size (no compression) +`TotalRecvSizeReal_u64` | `number` (uint64) | Total received data size (no compression) +`IsBridgeMode_bool` | `boolean` | The flag whether the VPN session is Bridge Mode +`IsMonitorMode_bool` | `boolean` | The flag whether the VPN session is Monitor mode +`VLanId_u32` | `number` (uint32) | VLAN ID + +*** + +## "AddAccess" RPC API - Add Access List Rule +### Description +Add Access List Rule. Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "AddAccess", + "params": { + "HubName_str": "hubname", + "AccessListSingle": [ + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + } + ] + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AccessListSingle": [ + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`AccessListSingle` | `Array object` | Access list (Must be a single item) +`Id_u32` | `number` (uint32) | ID +`Note_utf` | `string` (UTF8) | Specify a description (note) for this rule +`Active_bool` | `boolean` | Enabled flag (true: enabled, false: disabled) +`Priority_u32` | `number` (uint32) | Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. +`Discard_bool` | `boolean` | The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. +`IsIPv6_bool` | `boolean` | The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. +`SrcIpAddress_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. +`SrcSubnetMask_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. +`DestIpAddress_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. +`DestSubnetMask_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. +`SrcIpAddress6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. +`SrcSubnetMask6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. +`DestIpAddress6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. +`DestSubnetMask6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. +`Protocol_u32` | `number` (enum) | The IP protocol number
Values:
`1`: ICMP for IPv4
`6`: TCP
`17`: UDP
`58`: ICMP for IPv6 +`SrcPortStart_u32` | `number` (uint32) | The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`SrcPortEnd_u32` | `number` (uint32) | The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`DestPortStart_u32` | `number` (uint32) | The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`DestPortEnd_u32` | `number` (uint32) | The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`SrcUsername_str` | `string` (ASCII) | Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. +`DestUsername_str` | `string` (ASCII) | Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. +`CheckSrcMac_bool` | `boolean` | Specify true if you want to check the source MAC address. +`SrcMacAddress_bin` | `string` (Base64 binary) | Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. +`SrcMacMask_bin` | `string` (Base64 binary) | Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. +`CheckDstMac_bool` | `boolean` | Specify true if you want to check the destination MAC address. +`DstMacAddress_bin` | `string` (Base64 binary) | Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. +`DstMacMask_bin` | `string` (Base64 binary) | Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. +`CheckTcpState_bool` | `boolean` | Specify true if you want to check the state of the TCP connection. +`Established_bool` | `boolean` | Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. +`Delay_u32` | `number` (uint32) | Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. +`Jitter_u32` | `number` (uint32) | Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. +`Loss_u32` | `number` (uint32) | Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. +`RedirectUrl_str` | `string` (ASCII) | The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. + +*** + +## "DeleteAccess" RPC API - Delete Rule from Access List +### Description +Delete Rule from Access List. Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteAccess", + "params": { + "HubName_str": "hubname", + "Id_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Id_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Id_u32` | `number` (uint32) | ID + +*** + +## "EnumAccess" RPC API - Get Access List Rule List +### Description +Get Access List Rule List. Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumAccess", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AccessList": [ + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + }, + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + }, + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`AccessList` | `Array object` | Access list +`Id_u32` | `number` (uint32) | ID +`Note_utf` | `string` (UTF8) | Specify a description (note) for this rule +`Active_bool` | `boolean` | Enabled flag (true: enabled, false: disabled) +`Priority_u32` | `number` (uint32) | Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. +`Discard_bool` | `boolean` | The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. +`IsIPv6_bool` | `boolean` | The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. +`SrcIpAddress_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. +`SrcSubnetMask_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. +`DestIpAddress_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. +`DestSubnetMask_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. +`SrcIpAddress6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. +`SrcSubnetMask6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. +`DestIpAddress6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. +`DestSubnetMask6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. +`Protocol_u32` | `number` (enum) | The IP protocol number
Values:
`1`: ICMP for IPv4
`6`: TCP
`17`: UDP
`58`: ICMP for IPv6 +`SrcPortStart_u32` | `number` (uint32) | The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`SrcPortEnd_u32` | `number` (uint32) | The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`DestPortStart_u32` | `number` (uint32) | The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`DestPortEnd_u32` | `number` (uint32) | The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`SrcUsername_str` | `string` (ASCII) | Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. +`DestUsername_str` | `string` (ASCII) | Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. +`CheckSrcMac_bool` | `boolean` | Specify true if you want to check the source MAC address. +`SrcMacAddress_bin` | `string` (Base64 binary) | Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. +`SrcMacMask_bin` | `string` (Base64 binary) | Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. +`CheckDstMac_bool` | `boolean` | Specify true if you want to check the destination MAC address. +`DstMacAddress_bin` | `string` (Base64 binary) | Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. +`DstMacMask_bin` | `string` (Base64 binary) | Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. +`CheckTcpState_bool` | `boolean` | Specify true if you want to check the state of the TCP connection. +`Established_bool` | `boolean` | Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. +`Delay_u32` | `number` (uint32) | Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. +`Jitter_u32` | `number` (uint32) | Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. +`Loss_u32` | `number` (uint32) | Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. +`RedirectUrl_str` | `string` (ASCII) | The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. + +*** + +## "SetAccessList" RPC API - Replace all access lists on a single bulk API call +### Description +Replace all access lists on a single bulk API call. This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetAccessList", + "params": { + "HubName_str": "hubname", + "AccessList": [ + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + }, + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + }, + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + } + ] + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AccessList": [ + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + }, + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + }, + { + "Id_u32": 0, + "Note_utf": "note", + "Active_bool": false, + "Priority_u32": 0, + "Discard_bool": false, + "IsIPv6_bool": false, + "SrcIpAddress_ip": "192.168.0.1", + "SrcSubnetMask_ip": "255.255.255.255", + "DestIpAddress_ip": "192.168.0.1", + "DestSubnetMask_ip": "255.255.255.255", + "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=", + "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=", + "Protocol_u32": 0, + "SrcPortStart_u32": 0, + "SrcPortEnd_u32": 0, + "DestPortStart_u32": 0, + "DestPortEnd_u32": 0, + "SrcUsername_str": "srcusername", + "DestUsername_str": "destusername", + "CheckSrcMac_bool": false, + "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=", + "SrcMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckDstMac_bool": false, + "DstMacAddress_bin": "SGVsbG8gV29ybGQ=", + "DstMacMask_bin": "SGVsbG8gV29ybGQ=", + "CheckTcpState_bool": false, + "Established_bool": false, + "Delay_u32": 0, + "Jitter_u32": 0, + "Loss_u32": 0, + "RedirectUrl_str": "redirecturl" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`AccessList` | `Array object` | Access list +`Id_u32` | `number` (uint32) | ID +`Note_utf` | `string` (UTF8) | Specify a description (note) for this rule +`Active_bool` | `boolean` | Enabled flag (true: enabled, false: disabled) +`Priority_u32` | `number` (uint32) | Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. +`Discard_bool` | `boolean` | The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. +`IsIPv6_bool` | `boolean` | The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. +`SrcIpAddress_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. +`SrcSubnetMask_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. +`DestIpAddress_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. +`DestSubnetMask_ip` | `string` (IP address) | Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. +`SrcIpAddress6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. +`SrcSubnetMask6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. +`DestIpAddress6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. +`DestSubnetMask6_bin` | `string` (Base64 binary) | Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. +`Protocol_u32` | `number` (enum) | The IP protocol number
Values:
`1`: ICMP for IPv4
`6`: TCP
`17`: UDP
`58`: ICMP for IPv6 +`SrcPortStart_u32` | `number` (uint32) | The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`SrcPortEnd_u32` | `number` (uint32) | The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`DestPortStart_u32` | `number` (uint32) | The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`DestPortEnd_u32` | `number` (uint32) | The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. +`SrcUsername_str` | `string` (ASCII) | Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. +`DestUsername_str` | `string` (ASCII) | Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. +`CheckSrcMac_bool` | `boolean` | Specify true if you want to check the source MAC address. +`SrcMacAddress_bin` | `string` (Base64 binary) | Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. +`SrcMacMask_bin` | `string` (Base64 binary) | Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. +`CheckDstMac_bool` | `boolean` | Specify true if you want to check the destination MAC address. +`DstMacAddress_bin` | `string` (Base64 binary) | Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. +`DstMacMask_bin` | `string` (Base64 binary) | Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. +`CheckTcpState_bool` | `boolean` | Specify true if you want to check the state of the TCP connection. +`Established_bool` | `boolean` | Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. +`Delay_u32` | `number` (uint32) | Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. +`Jitter_u32` | `number` (uint32) | Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. +`Loss_u32` | `number` (uint32) | Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. +`RedirectUrl_str` | `string` (ASCII) | The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. + +*** + +## "CreateUser" RPC API - Create a user +### Description +Create a user. Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "CreateUser", + "params": { + "HubName_str": "hubname", + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "ExpireTime_dt": "2020-08-01T12:24:36.123", + "AuthType_u32": 0, + "Auth_Password_str": "auth_password", + "UserX_bin": "SGVsbG8gV29ybGQ=", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "CommonName_utf": "auth_rootcert_commonname", + "RadiusUsername_utf": "auth_radius_radiususername", + "NtUsername_utf": "auth_nt_ntusername", + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name", + "GroupName_str": "groupname", + "Realname_utf": "realname", + "Note_utf": "note", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "ExpireTime_dt": "2020-08-01T12:24:36.123", + "AuthType_u32": 0, + "Auth_Password_str": "auth_password", + "UserX_bin": "SGVsbG8gV29ybGQ=", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "CommonName_utf": "auth_rootcert_commonname", + "RadiusUsername_utf": "auth_radius_radiususername", + "NtUsername_utf": "auth_nt_ntusername", + "NumLogin_u32": 0, + "Recv.BroadcastBytes_u64": 0, + "Recv.BroadcastCount_u64": 0, + "Recv.UnicastBytes_u64": 0, + "Recv.UnicastCount_u64": 0, + "Send.BroadcastBytes_u64": 0, + "Send.BroadcastCount_u64": 0, + "Send.UnicastBytes_u64": 0, + "Send.UnicastCount_u64": 0, + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | Specify the user name of the user +`GroupName_str` | `string` (ASCII) | Assigned group name for the user +`Realname_utf` | `string` (UTF8) | Optional real name (full name) of the user, allow using any Unicode characters +`Note_utf` | `string` (UTF8) | Optional User Description +`CreatedTime_dt` | `Date` | Creation date and time +`UpdatedTime_dt` | `Date` | Last modified date and time +`ExpireTime_dt` | `Date` | Expiration date and time +`AuthType_u32` | `number` (enum) | Authentication method of the user
Values:
`0`: Anonymous authentication
`1`: Password authentication
`2`: User certificate authentication
`3`: Root certificate which is issued by trusted Certificate Authority
`4`: Radius authentication
`5`: Windows NT authentication +`Auth_Password_str` | `string` (ASCII) | User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. +`UserX_bin` | `string` (Base64 binary) | User certificate, valid only if AuthType_u32 == UserCert(2). +`Serial_bin` | `string` (Base64 binary) | Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). +`CommonName_utf` | `string` (UTF8) | Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). +`RadiusUsername_utf` | `string` (UTF8) | Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). +`NtUsername_utf` | `string` (UTF8) | Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). +`NumLogin_u32` | `number` (uint32) | Number of total logins of the user +`Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) +`UsePolicy_bool` | `boolean` | The flag whether to use security policy +`policy:Access_bool` | `boolean` | Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`policy:NoBridge_bool` | `boolean` | Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. +`policy:NoRouting_bool` | `boolean` | Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckMac_bool` | `boolean` | Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:CheckIP_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MonitorPort_bool` | `boolean` | Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. +`policy:MaxConnection_u32` | `number` (uint32) | Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. +`policy:TimeOut_u32` | `number` (uint32) | Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:FixPassword_bool` | `boolean` | Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. +`policy:MultiLogins_u32` | `number` (uint32) | Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. +`policy:NoQoS_bool` | `boolean` | Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`policy:RAFilter_bool` | `boolean` | Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`policy:NoRoutingV6_bool` | `boolean` | Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckIPv6_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:NoSavePassword_bool` | `boolean` | Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:AutoDisconnect_u32` | `number` (uint32) | Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:NoIPv6DefaultRouterInRAWhenIPv6_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "SetUser" RPC API - Change User Settings +### Description +Change User Settings. Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetUser", + "params": { + "HubName_str": "hubname", + "Name_str": "name", + "GroupName_str": "groupname", + "Realname_utf": "realname", + "Note_utf": "note", + "ExpireTime_dt": "2020-08-01T12:24:36.123", + "AuthType_u32": 0, + "Auth_Password_str": "auth_password", + "UserX_bin": "SGVsbG8gV29ybGQ=", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "CommonName_utf": "auth_rootcert_commonname", + "RadiusUsername_utf": "auth_radius_radiususername", + "NtUsername_utf": "auth_nt_ntusername", + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name", + "GroupName_str": "groupname", + "Realname_utf": "realname", + "Note_utf": "note", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "ExpireTime_dt": "2020-08-01T12:24:36.123", + "AuthType_u32": 0, + "Auth_Password_str": "auth_password", + "UserX_bin": "SGVsbG8gV29ybGQ=", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "CommonName_utf": "auth_rootcert_commonname", + "RadiusUsername_utf": "auth_radius_radiususername", + "NtUsername_utf": "auth_nt_ntusername", + "NumLogin_u32": 0, + "Recv.BroadcastBytes_u64": 0, + "Recv.BroadcastCount_u64": 0, + "Recv.UnicastBytes_u64": 0, + "Recv.UnicastCount_u64": 0, + "Send.BroadcastBytes_u64": 0, + "Send.BroadcastCount_u64": 0, + "Send.UnicastBytes_u64": 0, + "Send.UnicastCount_u64": 0, + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | Specify the user name of the user +`GroupName_str` | `string` (ASCII) | Assigned group name for the user +`Realname_utf` | `string` (UTF8) | Optional real name (full name) of the user, allow using any Unicode characters +`Note_utf` | `string` (UTF8) | Optional User Description +`CreatedTime_dt` | `Date` | Creation date and time +`UpdatedTime_dt` | `Date` | Last modified date and time +`ExpireTime_dt` | `Date` | Expiration date and time +`AuthType_u32` | `number` (enum) | Authentication method of the user
Values:
`0`: Anonymous authentication
`1`: Password authentication
`2`: User certificate authentication
`3`: Root certificate which is issued by trusted Certificate Authority
`4`: Radius authentication
`5`: Windows NT authentication +`Auth_Password_str` | `string` (ASCII) | User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. +`UserX_bin` | `string` (Base64 binary) | User certificate, valid only if AuthType_u32 == UserCert(2). +`Serial_bin` | `string` (Base64 binary) | Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). +`CommonName_utf` | `string` (UTF8) | Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). +`RadiusUsername_utf` | `string` (UTF8) | Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). +`NtUsername_utf` | `string` (UTF8) | Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). +`NumLogin_u32` | `number` (uint32) | Number of total logins of the user +`Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) +`UsePolicy_bool` | `boolean` | The flag whether to use security policy +`policy:Access_bool` | `boolean` | Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`policy:NoBridge_bool` | `boolean` | Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. +`policy:NoRouting_bool` | `boolean` | Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckMac_bool` | `boolean` | Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:CheckIP_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MonitorPort_bool` | `boolean` | Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. +`policy:MaxConnection_u32` | `number` (uint32) | Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. +`policy:TimeOut_u32` | `number` (uint32) | Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:FixPassword_bool` | `boolean` | Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. +`policy:MultiLogins_u32` | `number` (uint32) | Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. +`policy:NoQoS_bool` | `boolean` | Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`policy:RAFilter_bool` | `boolean` | Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`policy:NoRoutingV6_bool` | `boolean` | Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckIPv6_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:NoSavePassword_bool` | `boolean` | Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:AutoDisconnect_u32` | `number` (uint32) | Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:NoIPv6DefaultRouterInRAWhenIPv6_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "GetUser" RPC API - Get User Settings +### Description +Get User Settings. Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetUser", + "params": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name", + "GroupName_str": "groupname", + "Realname_utf": "realname", + "Note_utf": "note", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "ExpireTime_dt": "2020-08-01T12:24:36.123", + "AuthType_u32": 0, + "Auth_Password_str": "auth_password", + "UserX_bin": "SGVsbG8gV29ybGQ=", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "CommonName_utf": "auth_rootcert_commonname", + "RadiusUsername_utf": "auth_radius_radiususername", + "NtUsername_utf": "auth_nt_ntusername", + "NumLogin_u32": 0, + "Recv.BroadcastBytes_u64": 0, + "Recv.BroadcastCount_u64": 0, + "Recv.UnicastBytes_u64": 0, + "Recv.UnicastCount_u64": 0, + "Send.BroadcastBytes_u64": 0, + "Send.BroadcastCount_u64": 0, + "Send.UnicastBytes_u64": 0, + "Send.UnicastCount_u64": 0, + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | Specify the user name of the user +`GroupName_str` | `string` (ASCII) | Assigned group name for the user +`Realname_utf` | `string` (UTF8) | Optional real name (full name) of the user, allow using any Unicode characters +`Note_utf` | `string` (UTF8) | Optional User Description +`CreatedTime_dt` | `Date` | Creation date and time +`UpdatedTime_dt` | `Date` | Last modified date and time +`ExpireTime_dt` | `Date` | Expiration date and time +`AuthType_u32` | `number` (enum) | Authentication method of the user
Values:
`0`: Anonymous authentication
`1`: Password authentication
`2`: User certificate authentication
`3`: Root certificate which is issued by trusted Certificate Authority
`4`: Radius authentication
`5`: Windows NT authentication +`Auth_Password_str` | `string` (ASCII) | User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. +`UserX_bin` | `string` (Base64 binary) | User certificate, valid only if AuthType_u32 == UserCert(2). +`Serial_bin` | `string` (Base64 binary) | Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). +`CommonName_utf` | `string` (UTF8) | Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). +`RadiusUsername_utf` | `string` (UTF8) | Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). +`NtUsername_utf` | `string` (UTF8) | Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). +`NumLogin_u32` | `number` (uint32) | Number of total logins of the user +`Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) +`UsePolicy_bool` | `boolean` | The flag whether to use security policy +`policy:Access_bool` | `boolean` | Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`policy:NoBridge_bool` | `boolean` | Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. +`policy:NoRouting_bool` | `boolean` | Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckMac_bool` | `boolean` | Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:CheckIP_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MonitorPort_bool` | `boolean` | Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. +`policy:MaxConnection_u32` | `number` (uint32) | Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. +`policy:TimeOut_u32` | `number` (uint32) | Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:FixPassword_bool` | `boolean` | Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. +`policy:MultiLogins_u32` | `number` (uint32) | Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. +`policy:NoQoS_bool` | `boolean` | Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`policy:RAFilter_bool` | `boolean` | Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`policy:NoRoutingV6_bool` | `boolean` | Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckIPv6_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:NoSavePassword_bool` | `boolean` | Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:AutoDisconnect_u32` | `number` (uint32) | Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:NoIPv6DefaultRouterInRAWhenIPv6_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "DeleteUser" RPC API - Delete a user +### Description +Delete a user. Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteUser", + "params": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | User or group name + +*** + +## "EnumUser" RPC API - Get List of Users +### Description +Get List of Users. Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumUser", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "UserList": [ + { + "Name_str": "name", + "GroupName_str": "groupname", + "Realname_utf": "realname", + "Note_utf": "note", + "AuthType_u32": 0, + "NumLogin_u32": 0, + "LastLoginTime_dt": "2020-08-01T12:24:36.123", + "DenyAccess_bool": false, + "IsTrafficFilled_bool": false, + "IsExpiresFilled_bool": false, + "Expires_dt": "2020-08-01T12:24:36.123", + "Ex.Recv.BroadcastBytes_u64": 0, + "Ex.Recv.BroadcastCount_u64": 0, + "Ex.Recv.UnicastBytes_u64": 0, + "Ex.Recv.UnicastCount_u64": 0, + "Ex.Send.BroadcastBytes_u64": 0, + "Ex.Send.BroadcastCount_u64": 0, + "Ex.Send.UnicastBytes_u64": 0, + "Ex.Send.UnicastCount_u64": 0 + }, + { + "Name_str": "name", + "GroupName_str": "groupname", + "Realname_utf": "realname", + "Note_utf": "note", + "AuthType_u32": 0, + "NumLogin_u32": 0, + "LastLoginTime_dt": "2020-08-01T12:24:36.123", + "DenyAccess_bool": false, + "IsTrafficFilled_bool": false, + "IsExpiresFilled_bool": false, + "Expires_dt": "2020-08-01T12:24:36.123", + "Ex.Recv.BroadcastBytes_u64": 0, + "Ex.Recv.BroadcastCount_u64": 0, + "Ex.Recv.UnicastBytes_u64": 0, + "Ex.Recv.UnicastCount_u64": 0, + "Ex.Send.BroadcastBytes_u64": 0, + "Ex.Send.BroadcastCount_u64": 0, + "Ex.Send.UnicastBytes_u64": 0, + "Ex.Send.UnicastCount_u64": 0 + }, + { + "Name_str": "name", + "GroupName_str": "groupname", + "Realname_utf": "realname", + "Note_utf": "note", + "AuthType_u32": 0, + "NumLogin_u32": 0, + "LastLoginTime_dt": "2020-08-01T12:24:36.123", + "DenyAccess_bool": false, + "IsTrafficFilled_bool": false, + "IsExpiresFilled_bool": false, + "Expires_dt": "2020-08-01T12:24:36.123", + "Ex.Recv.BroadcastBytes_u64": 0, + "Ex.Recv.BroadcastCount_u64": 0, + "Ex.Recv.UnicastBytes_u64": 0, + "Ex.Recv.UnicastCount_u64": 0, + "Ex.Send.BroadcastBytes_u64": 0, + "Ex.Send.BroadcastCount_u64": 0, + "Ex.Send.UnicastBytes_u64": 0, + "Ex.Send.UnicastCount_u64": 0 + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`UserList` | `Array object` | User list +`Name_str` | `string` (ASCII) | User name +`GroupName_str` | `string` (ASCII) | Group name +`Realname_utf` | `string` (UTF8) | Real name +`Note_utf` | `string` (UTF8) | Note +`AuthType_u32` | `number` (enum) | Authentication method
Values:
`0`: Anonymous authentication
`1`: Password authentication
`2`: User certificate authentication
`3`: Root certificate which is issued by trusted Certificate Authority
`4`: Radius authentication
`5`: Windows NT authentication +`NumLogin_u32` | `number` (uint32) | Number of logins +`LastLoginTime_dt` | `Date` | Last login date and time +`DenyAccess_bool` | `boolean` | Access denied +`IsTrafficFilled_bool` | `boolean` | Flag of whether the traffic variable is set +`IsExpiresFilled_bool` | `boolean` | Flag of whether expiration date variable is set +`Expires_dt` | `Date` | Expiration date +`Ex.Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Ex.Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Ex.Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Ex.Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Ex.Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Ex.Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Ex.Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Ex.Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) + +*** + +## "CreateGroup" RPC API - Create Group +### Description +Create Group. Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "CreateGroup", + "params": { + "HubName_str": "hubname", + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "Recv.BroadcastBytes_u64": 0, + "Recv.BroadcastCount_u64": 0, + "Recv.UnicastBytes_u64": 0, + "Recv.UnicastCount_u64": 0, + "Send.BroadcastBytes_u64": 0, + "Send.BroadcastCount_u64": 0, + "Send.UnicastBytes_u64": 0, + "Send.UnicastCount_u64": 0, + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | The group name +`Realname_utf` | `string` (UTF8) | Optional real name (full name) of the group, allow using any Unicode characters +`Note_utf` | `string` (UTF8) | Optional, specify a description of the group +`Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) +`UsePolicy_bool` | `boolean` | The flag whether to use security policy +`policy:Access_bool` | `boolean` | Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`policy:NoBridge_bool` | `boolean` | Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. +`policy:NoRouting_bool` | `boolean` | Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckMac_bool` | `boolean` | Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:CheckIP_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MonitorPort_bool` | `boolean` | Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. +`policy:MaxConnection_u32` | `number` (uint32) | Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. +`policy:TimeOut_u32` | `number` (uint32) | Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:FixPassword_bool` | `boolean` | Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. +`policy:MultiLogins_u32` | `number` (uint32) | Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. +`policy:NoQoS_bool` | `boolean` | Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`policy:RAFilter_bool` | `boolean` | Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`policy:NoRoutingV6_bool` | `boolean` | Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckIPv6_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:NoSavePassword_bool` | `boolean` | Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:AutoDisconnect_u32` | `number` (uint32) | Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:NoIPv6DefaultRouterInRAWhenIPv6_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "SetGroup" RPC API - Set group settings +### Description +Set group settings. Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetGroup", + "params": { + "HubName_str": "hubname", + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "Recv.BroadcastBytes_u64": 0, + "Recv.BroadcastCount_u64": 0, + "Recv.UnicastBytes_u64": 0, + "Recv.UnicastCount_u64": 0, + "Send.BroadcastBytes_u64": 0, + "Send.BroadcastCount_u64": 0, + "Send.UnicastBytes_u64": 0, + "Send.UnicastCount_u64": 0, + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | The group name +`Realname_utf` | `string` (UTF8) | Optional real name (full name) of the group, allow using any Unicode characters +`Note_utf` | `string` (UTF8) | Optional, specify a description of the group +`Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) +`UsePolicy_bool` | `boolean` | The flag whether to use security policy +`policy:Access_bool` | `boolean` | Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`policy:NoBridge_bool` | `boolean` | Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. +`policy:NoRouting_bool` | `boolean` | Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckMac_bool` | `boolean` | Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:CheckIP_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MonitorPort_bool` | `boolean` | Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. +`policy:MaxConnection_u32` | `number` (uint32) | Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. +`policy:TimeOut_u32` | `number` (uint32) | Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:FixPassword_bool` | `boolean` | Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. +`policy:MultiLogins_u32` | `number` (uint32) | Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. +`policy:NoQoS_bool` | `boolean` | Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`policy:RAFilter_bool` | `boolean` | Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`policy:NoRoutingV6_bool` | `boolean` | Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckIPv6_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:NoSavePassword_bool` | `boolean` | Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:AutoDisconnect_u32` | `number` (uint32) | Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:NoIPv6DefaultRouterInRAWhenIPv6_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "GetGroup" RPC API - Get Group Setting (Sync mode) +### Description +Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetGroup", + "params": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "Recv.BroadcastBytes_u64": 0, + "Recv.BroadcastCount_u64": 0, + "Recv.UnicastBytes_u64": 0, + "Recv.UnicastCount_u64": 0, + "Send.BroadcastBytes_u64": 0, + "Send.BroadcastCount_u64": 0, + "Send.UnicastBytes_u64": 0, + "Send.UnicastCount_u64": 0, + "UsePolicy_bool": false, + "policy:Access_bool": false, + "policy:DHCPFilter_bool": false, + "policy:DHCPNoServer_bool": false, + "policy:DHCPForce_bool": false, + "policy:NoBridge_bool": false, + "policy:NoRouting_bool": false, + "policy:CheckMac_bool": false, + "policy:CheckIP_bool": false, + "policy:ArpDhcpOnly_bool": false, + "policy:PrivacyFilter_bool": false, + "policy:NoServer_bool": false, + "policy:NoBroadcastLimiter_bool": false, + "policy:MonitorPort_bool": false, + "policy:MaxConnection_u32": 0, + "policy:TimeOut_u32": 0, + "policy:MaxMac_u32": 0, + "policy:MaxIP_u32": 0, + "policy:MaxUpload_u32": 0, + "policy:MaxDownload_u32": 0, + "policy:FixPassword_bool": false, + "policy:MultiLogins_u32": 0, + "policy:NoQoS_bool": false, + "policy:RSandRAFilter_bool": false, + "policy:RAFilter_bool": false, + "policy:DHCPv6Filter_bool": false, + "policy:DHCPv6NoServer_bool": false, + "policy:NoRoutingV6_bool": false, + "policy:CheckIPv6_bool": false, + "policy:NoServerV6_bool": false, + "policy:MaxIPv6_u32": 0, + "policy:NoSavePassword_bool": false, + "policy:AutoDisconnect_u32": 0, + "policy:FilterIPv4_bool": false, + "policy:FilterIPv6_bool": false, + "policy:FilterNonIP_bool": false, + "policy:NoIPv6DefaultRouterInRA_bool": false, + "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false, + "policy:VLanId_u32": 0, + "policy:Ver3_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | The group name +`Realname_utf` | `string` (UTF8) | Optional real name (full name) of the group, allow using any Unicode characters +`Note_utf` | `string` (UTF8) | Optional, specify a description of the group +`Recv.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Recv) +`Recv.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Recv) +`Recv.UnicastBytes_u64` | `number` (uint64) | Unicast count (Recv) +`Recv.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Recv) +`Send.BroadcastBytes_u64` | `number` (uint64) | Number of broadcast packets (Send) +`Send.BroadcastCount_u64` | `number` (uint64) | Broadcast bytes (Send) +`Send.UnicastBytes_u64` | `number` (uint64) | Unicast bytes (Send) +`Send.UnicastCount_u64` | `number` (uint64) | Unicast bytes (Send) +`UsePolicy_bool` | `boolean` | The flag whether to use security policy +`policy:Access_bool` | `boolean` | Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. +`policy:DHCPFilter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPNoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. +`policy:DHCPForce_bool` | `boolean` | Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. +`policy:NoBridge_bool` | `boolean` | Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. +`policy:NoRouting_bool` | `boolean` | Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckMac_bool` | `boolean` | Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:CheckIP_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:ArpDhcpOnly_bool` | `boolean` | Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. +`policy:PrivacyFilter_bool` | `boolean` | Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. +`policy:NoServer_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. +`policy:NoBroadcastLimiter_bool` | `boolean` | Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. +`policy:MonitorPort_bool` | `boolean` | Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. +`policy:MaxConnection_u32` | `number` (uint32) | Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. +`policy:TimeOut_u32` | `number` (uint32) | Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. +`policy:MaxMac_u32` | `number` (uint32) | Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. +`policy:MaxIP_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. +`policy:MaxUpload_u32` | `number` (uint32) | Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. +`policy:MaxDownload_u32` | `number` (uint32) | Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. +`policy:FixPassword_bool` | `boolean` | Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. +`policy:MultiLogins_u32` | `number` (uint32) | Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. +`policy:NoQoS_bool` | `boolean` | Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. +`policy:RSandRAFilter_bool` | `boolean` | Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. +`policy:RAFilter_bool` | `boolean` | Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. +`policy:DHCPv6Filter_bool` | `boolean` | Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. +`policy:DHCPv6NoServer_bool` | `boolean` | Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. +`policy:NoRoutingV6_bool` | `boolean` | Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. +`policy:CheckIPv6_bool` | `boolean` | Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. +`policy:NoServerV6_bool` | `boolean` | Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. +`policy:MaxIPv6_u32` | `number` (uint32) | Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. +`policy:NoSavePassword_bool` | `boolean` | Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:AutoDisconnect_u32` | `number` (uint32) | Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. +`policy:FilterIPv4_bool` | `boolean` | Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. +`policy:FilterIPv6_bool` | `boolean` | Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. +`policy:FilterNonIP_bool` | `boolean` | Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. +`policy:NoIPv6DefaultRouterInRA_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:NoIPv6DefaultRouterInRAWhenIPv6_bool` | `boolean` | Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. +`policy:VLanId_u32` | `number` (uint32) | Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. +`policy:Ver3_bool` | `boolean` | Security policy: Whether version 3.0 (must be true) + +*** + +## "DeleteGroup" RPC API - Delete User from Group +### Description +Delete User from Group. Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteGroup", + "params": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | User or group name + +*** + +## "EnumGroup" RPC API - Get List of Groups +### Description +Get List of Groups. Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumGroup", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "GroupList": [ + { + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "NumUsers_u32": 0, + "DenyAccess_bool": false + }, + { + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "NumUsers_u32": 0, + "DenyAccess_bool": false + }, + { + "Name_str": "name", + "Realname_utf": "realname", + "Note_utf": "note", + "NumUsers_u32": 0, + "DenyAccess_bool": false + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`GroupList` | `Array object` | Group list +`Name_str` | `string` (ASCII) | User name +`Realname_utf` | `string` (UTF8) | Real name +`Note_utf` | `string` (UTF8) | Note +`NumUsers_u32` | `number` (uint32) | Number of users +`DenyAccess_bool` | `boolean` | Access denied + +*** + +## "EnumSession" RPC API - Get List of Connected VPN Sessions +### Description +Get List of Connected VPN Sessions. Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumSession", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "SessionList": [ + { + "Name_str": "name", + "RemoteSession_bool": false, + "RemoteHostname_str": "remotehostname", + "Username_str": "username", + "ClientIP_ip": "192.168.0.1", + "Hostname_str": "hostname", + "MaxNumTcp_u32": 0, + "CurrentNumTcp_u32": 0, + "PacketSize_u64": 0, + "PacketNum_u64": 0, + "LinkMode_bool": false, + "SecureNATMode_bool": false, + "BridgeMode_bool": false, + "Layer3Mode_bool": false, + "Client_BridgeMode_bool": false, + "Client_MonitorMode_bool": false, + "VLanId_u32": 0, + "UniqueId_bin": "SGVsbG8gV29ybGQ=", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "LastCommTime_dt": "2020-08-01T12:24:36.123" + }, + { + "Name_str": "name", + "RemoteSession_bool": false, + "RemoteHostname_str": "remotehostname", + "Username_str": "username", + "ClientIP_ip": "192.168.0.1", + "Hostname_str": "hostname", + "MaxNumTcp_u32": 0, + "CurrentNumTcp_u32": 0, + "PacketSize_u64": 0, + "PacketNum_u64": 0, + "LinkMode_bool": false, + "SecureNATMode_bool": false, + "BridgeMode_bool": false, + "Layer3Mode_bool": false, + "Client_BridgeMode_bool": false, + "Client_MonitorMode_bool": false, + "VLanId_u32": 0, + "UniqueId_bin": "SGVsbG8gV29ybGQ=", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "LastCommTime_dt": "2020-08-01T12:24:36.123" + }, + { + "Name_str": "name", + "RemoteSession_bool": false, + "RemoteHostname_str": "remotehostname", + "Username_str": "username", + "ClientIP_ip": "192.168.0.1", + "Hostname_str": "hostname", + "MaxNumTcp_u32": 0, + "CurrentNumTcp_u32": 0, + "PacketSize_u64": 0, + "PacketNum_u64": 0, + "LinkMode_bool": false, + "SecureNATMode_bool": false, + "BridgeMode_bool": false, + "Layer3Mode_bool": false, + "Client_BridgeMode_bool": false, + "Client_MonitorMode_bool": false, + "VLanId_u32": 0, + "UniqueId_bin": "SGVsbG8gV29ybGQ=", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "LastCommTime_dt": "2020-08-01T12:24:36.123" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`SessionList` | `Array object` | VPN sessions list +`Name_str` | `string` (ASCII) | Session name +`RemoteSession_bool` | `boolean` | Remote session +`RemoteHostname_str` | `string` (ASCII) | Remote server name +`Username_str` | `string` (ASCII) | User name +`ClientIP_ip` | `string` (IP address) | IP address +`Hostname_str` | `string` (ASCII) | Host name +`MaxNumTcp_u32` | `number` (uint32) | Maximum number of underlying TCP connections +`CurrentNumTcp_u32` | `number` (uint32) | Number of current underlying TCP connections +`PacketSize_u64` | `number` (uint64) | Packet size transmitted +`PacketNum_u64` | `number` (uint64) | Number of packets transmitted +`LinkMode_bool` | `boolean` | Is a Cascade VPN session +`SecureNATMode_bool` | `boolean` | Is a SecureNAT VPN session +`BridgeMode_bool` | `boolean` | Is the VPN session for Local Bridge +`Layer3Mode_bool` | `boolean` | Is a Layer-3 Switch VPN session +`Client_BridgeMode_bool` | `boolean` | Is in Bridge Mode +`Client_MonitorMode_bool` | `boolean` | Is in Monitor Mode +`VLanId_u32` | `number` (uint32) | VLAN ID +`UniqueId_bin` | `string` (Base64 binary) | Unique ID of the VPN Session +`CreatedTime_dt` | `Date` | Creation date and time +`LastCommTime_dt` | `Date` | Last communication date and time + +*** + +## "GetSessionStatus" RPC API - Get Session Status +### Description +Get Session Status. Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetSessionStatus", + "params": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name", + "Username_str": "username", + "RealUsername_str": "realusername", + "GroupName_str": "groupname", + "LinkMode_bool": false, + "Client_Ip_Address_ip": "192.168.0.1", + "SessionStatus_ClientHostName_str": "clienthostname", + "Active_bool": false, + "Connected_bool": false, + "SessionStatus_u32": 0, + "ServerName_str": "servername", + "ServerPort_u32": 0, + "ServerProductName_str": "serverproductname", + "ServerProductVer_u32": 0, + "ServerProductBuild_u32": 0, + "StartTime_dt": "2020-08-01T12:24:36.123", + "FirstConnectionEstablisiedTime_dt": "2020-08-01T12:24:36.123", + "CurrentConnectionEstablishTime_dt": "2020-08-01T12:24:36.123", + "NumConnectionsEatablished_u32": 0, + "HalfConnection_bool": false, + "QoS_bool": false, + "MaxTcpConnections_u32": 0, + "NumTcpConnections_u32": 0, + "NumTcpConnectionsUpload_u32": 0, + "NumTcpConnectionsDownload_u32": 0, + "UseEncrypt_bool": false, + "CipherName_str": "ciphername", + "UseCompress_bool": false, + "IsRUDPSession_bool": false, + "UnderlayProtocol_str": "underlayprotocol", + "IsUdpAccelerationEnabled_bool": false, + "IsUsingUdpAcceleration_bool": false, + "SessionName_str": "sessionname", + "ConnectionName_str": "connectionname", + "SessionKey_bin": "SGVsbG8gV29ybGQ=", + "TotalSendSize_u64": 0, + "TotalRecvSize_u64": 0, + "TotalSendSizeReal_u64": 0, + "TotalRecvSizeReal_u64": 0, + "IsBridgeMode_bool": false, + "IsMonitorMode_bool": false, + "VLanId_u32": 0, + "ClientProductName_str": "clientproductname", + "ClientProductVer_u32": 0, + "ClientProductBuild_u32": 0, + "ClientOsName_str": "clientosname", + "ClientOsVer_str": "clientosver", + "ClientOsProductId_str": "clientosproductid", + "ClientHostname_str": "clienthostname", + "UniqueId_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | VPN session name +`Username_str` | `string` (ASCII) | User name +`RealUsername_str` | `string` (ASCII) | Real user name which was used for the authentication +`GroupName_str` | `string` (ASCII) | Group name +`LinkMode_bool` | `boolean` | Is Cascade Session +`Client_Ip_Address_ip` | `string` (IP address) | Client IP address +`SessionStatus_ClientHostName_str` | `string` (ASCII) | Client host name +`Active_bool` | `boolean` | Operation flag +`Connected_bool` | `boolean` | Connected flag +`SessionStatus_u32` | `number` (enum) | State of the client session
Values:
`0`: Connecting
`1`: Negotiating
`2`: During user authentication
`3`: Connection complete
`4`: Wait to retry
`5`: Idle state +`ServerName_str` | `string` (ASCII) | Server name +`ServerPort_u32` | `number` (uint32) | Port number of the server +`ServerProductName_str` | `string` (ASCII) | Server product name +`ServerProductVer_u32` | `number` (uint32) | Server product version +`ServerProductBuild_u32` | `number` (uint32) | Server product build number +`StartTime_dt` | `Date` | Connection start time +`FirstConnectionEstablisiedTime_dt` | `Date` | Connection completion time of the first connection +`CurrentConnectionEstablishTime_dt` | `Date` | Connection completion time of this connection +`NumConnectionsEatablished_u32` | `number` (uint32) | Number of connections have been established so far +`HalfConnection_bool` | `boolean` | Half-connection +`QoS_bool` | `boolean` | VoIP / QoS +`MaxTcpConnections_u32` | `number` (uint32) | Maximum number of the underlying TCP connections +`NumTcpConnections_u32` | `number` (uint32) | Number of current underlying TCP connections +`NumTcpConnectionsUpload_u32` | `number` (uint32) | Number of inbound underlying connections +`NumTcpConnectionsDownload_u32` | `number` (uint32) | Number of outbound underlying connections +`UseEncrypt_bool` | `boolean` | Use of encryption +`CipherName_str` | `string` (ASCII) | Cipher algorithm name +`UseCompress_bool` | `boolean` | Use of compression +`IsRUDPSession_bool` | `boolean` | Is R-UDP session +`UnderlayProtocol_str` | `string` (ASCII) | Physical underlying communication protocol +`IsUdpAccelerationEnabled_bool` | `boolean` | The UDP acceleration is enabled +`IsUsingUdpAcceleration_bool` | `boolean` | Using the UDP acceleration function +`SessionName_str` | `string` (ASCII) | VPN session name +`ConnectionName_str` | `string` (ASCII) | Connection name +`SessionKey_bin` | `string` (Base64 binary) | Session key +`TotalSendSize_u64` | `number` (uint64) | Total transmitted data size +`TotalRecvSize_u64` | `number` (uint64) | Total received data size +`TotalSendSizeReal_u64` | `number` (uint64) | Total transmitted data size (no compression) +`TotalRecvSizeReal_u64` | `number` (uint64) | Total received data size (no compression) +`IsBridgeMode_bool` | `boolean` | Is Bridge Mode +`IsMonitorMode_bool` | `boolean` | Is Monitor mode +`VLanId_u32` | `number` (uint32) | VLAN ID +`ClientProductName_str` | `string` (ASCII) | Client product name +`ClientProductVer_u32` | `number` (uint32) | Client version +`ClientProductBuild_u32` | `number` (uint32) | Client build number +`ClientOsName_str` | `string` (ASCII) | Client OS name +`ClientOsVer_str` | `string` (ASCII) | Client OS version +`ClientOsProductId_str` | `string` (ASCII) | Client OS Product ID +`ClientHostname_str` | `string` (ASCII) | Client host name +`UniqueId_bin` | `string` (Base64 binary) | Unique ID + +*** + +## "DeleteSession" RPC API - Disconnect Session +### Description +Disconnect Session. Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteSession", + "params": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Name_str": "name" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Name_str` | `string` (ASCII) | Session name + +*** + +## "EnumMacTable" RPC API - Get the MAC Address Table Database +### Description +Get the MAC Address Table Database. Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumMacTable", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "MacTable": [ + { + "Key_u32": 0, + "SessionName_str": "sessionname", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "RemoteItem_bool": false, + "RemoteHostname_str": "remotehostname", + "VlanId_u32": 0 + }, + { + "Key_u32": 0, + "SessionName_str": "sessionname", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "RemoteItem_bool": false, + "RemoteHostname_str": "remotehostname", + "VlanId_u32": 0 + }, + { + "Key_u32": 0, + "SessionName_str": "sessionname", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "RemoteItem_bool": false, + "RemoteHostname_str": "remotehostname", + "VlanId_u32": 0 + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`MacTable` | `Array object` | MAC table +`Key_u32` | `number` (uint32) | Key ID +`SessionName_str` | `string` (ASCII) | Session name +`MacAddress_bin` | `string` (Base64 binary) | MAC address +`CreatedTime_dt` | `Date` | Creation date and time +`UpdatedTime_dt` | `Date` | Updating date +`RemoteItem_bool` | `boolean` | Remote items +`RemoteHostname_str` | `string` (ASCII) | Remote host name +`VlanId_u32` | `number` (uint32) | VLAN ID + +*** + +## "DeleteMacTable" RPC API - Delete MAC Address Table Entry +### Description +Delete MAC Address Table Entry. Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteMacTable", + "params": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Key_u32` | `number` (uint32) | Key ID + +*** + +## "EnumIpTable" RPC API - Get the IP Address Table Database +### Description +Get the IP Address Table Database. Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumIpTable", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "IpTable": [ + { + "Key_u32": 0, + "SessionName_str": "sessionname", + "IpAddress_ip": "192.168.0.1", + "DhcpAllocated_bool": false, + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "RemoteItem_bool": false, + "RemoteHostname_str": "remotehostname" + }, + { + "Key_u32": 0, + "SessionName_str": "sessionname", + "IpAddress_ip": "192.168.0.1", + "DhcpAllocated_bool": false, + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "RemoteItem_bool": false, + "RemoteHostname_str": "remotehostname" + }, + { + "Key_u32": 0, + "SessionName_str": "sessionname", + "IpAddress_ip": "192.168.0.1", + "DhcpAllocated_bool": false, + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "UpdatedTime_dt": "2020-08-01T12:24:36.123", + "RemoteItem_bool": false, + "RemoteHostname_str": "remotehostname" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`IpTable` | `Array object` | MAC table +`Key_u32` | `number` (uint32) | Key ID +`SessionName_str` | `string` (ASCII) | Session name +`IpAddress_ip` | `string` (IP address) | IP address +`DhcpAllocated_bool` | `boolean` | Assigned by the DHCP +`CreatedTime_dt` | `Date` | Creation date and time +`UpdatedTime_dt` | `Date` | Updating date +`RemoteItem_bool` | `boolean` | Remote items +`RemoteHostname_str` | `string` (ASCII) | Remote host name + +*** + +## "DeleteIpTable" RPC API - Delete IP Address Table Entry +### Description +Delete IP Address Table Entry. Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteIpTable", + "params": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Key_u32` | `number` (uint32) | Key ID + +*** + +## "SetKeep" RPC API - Set the Keep Alive Internet Connection Function +### Description +Set the Keep Alive Internet Connection Function. Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetKeep", + "params": { + "UseKeepConnect_bool": false, + "KeepConnectHost_str": "keepconnecthost", + "KeepConnectPort_u32": 0, + "KeepConnectProtocol_u32": 0, + "KeepConnectInterval_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "UseKeepConnect_bool": false, + "KeepConnectHost_str": "keepconnecthost", + "KeepConnectPort_u32": 0, + "KeepConnectProtocol_u32": 0, + "KeepConnectInterval_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`UseKeepConnect_bool` | `boolean` | The flag to enable keep-alive to the Internet +`KeepConnectHost_str` | `string` (ASCII) | Specify the host name or IP address of the destination +`KeepConnectPort_u32` | `number` (uint32) | Specify the port number of the destination +`KeepConnectProtocol_u32` | `number` (enum) | Protocol type
Values:
`0`: TCP
`1`: UDP +`KeepConnectInterval_u32` | `number` (uint32) | Interval Between Packets Sends (Seconds) + +*** + +## "GetKeep" RPC API - Get the Keep Alive Internet Connection Function +### Description +Get the Keep Alive Internet Connection Function. Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetKeep", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "UseKeepConnect_bool": false, + "KeepConnectHost_str": "keepconnecthost", + "KeepConnectPort_u32": 0, + "KeepConnectProtocol_u32": 0, + "KeepConnectInterval_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`UseKeepConnect_bool` | `boolean` | The flag to enable keep-alive to the Internet +`KeepConnectHost_str` | `string` (ASCII) | Specify the host name or IP address of the destination +`KeepConnectPort_u32` | `number` (uint32) | Specify the port number of the destination +`KeepConnectProtocol_u32` | `number` (enum) | Protocol type
Values:
`0`: TCP
`1`: UDP +`KeepConnectInterval_u32` | `number` (uint32) | Interval Between Packets Sends (Seconds) + +*** + +## "EnableSecureNAT" RPC API - Enable the Virtual NAT and DHCP Server Function (SecureNAT Function) +### Description +Enable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnableSecureNAT", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name + +*** + +## "DisableSecureNAT" RPC API - Disable the Virtual NAT and DHCP Server Function (SecureNAT Function) +### Description +Disable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DisableSecureNAT", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name + +*** + +## "SetSecureNATOption" RPC API - Change Settings of SecureNAT Function +### Description +Change Settings of SecureNAT Function. Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetSecureNATOption", + "params": { + "RpcHubName_str": "rpchubname", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "Ip_ip": "192.168.0.1", + "Mask_ip": "255.255.255.255", + "UseNat_bool": false, + "Mtu_u32": 0, + "NatTcpTimeout_u32": 0, + "NatUdpTimeout_u32": 0, + "UseDhcp_bool": false, + "DhcpLeaseIPStart_ip": "192.168.0.1", + "DhcpLeaseIPEnd_ip": "192.168.0.1", + "DhcpSubnetMask_ip": "255.255.255.255", + "DhcpExpireTimeSpan_u32": 0, + "DhcpGatewayAddress_ip": "192.168.0.1", + "DhcpDnsServerAddress_ip": "192.168.0.1", + "DhcpDnsServerAddress2_ip": "192.168.0.1", + "DhcpDomainName_str": "dhcpdomainname", + "SaveLog_bool": false, + "ApplyDhcpPushRoutes_bool": false, + "DhcpPushRoutes_str": "dhcppushroutes" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "RpcHubName_str": "rpchubname", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "Ip_ip": "192.168.0.1", + "Mask_ip": "255.255.255.255", + "UseNat_bool": false, + "Mtu_u32": 0, + "NatTcpTimeout_u32": 0, + "NatUdpTimeout_u32": 0, + "UseDhcp_bool": false, + "DhcpLeaseIPStart_ip": "192.168.0.1", + "DhcpLeaseIPEnd_ip": "192.168.0.1", + "DhcpSubnetMask_ip": "255.255.255.255", + "DhcpExpireTimeSpan_u32": 0, + "DhcpGatewayAddress_ip": "192.168.0.1", + "DhcpDnsServerAddress_ip": "192.168.0.1", + "DhcpDnsServerAddress2_ip": "192.168.0.1", + "DhcpDomainName_str": "dhcpdomainname", + "SaveLog_bool": false, + "ApplyDhcpPushRoutes_bool": false, + "DhcpPushRoutes_str": "dhcppushroutes" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`RpcHubName_str` | `string` (ASCII) | Target Virtual HUB name +`MacAddress_bin` | `string` (Base64 binary) | MAC address +`Ip_ip` | `string` (IP address) | IP address +`Mask_ip` | `string` (IP address) | Subnet mask +`UseNat_bool` | `boolean` | Use flag of the Virtual NAT function +`Mtu_u32` | `number` (uint32) | MTU value (Standard: 1500) +`NatTcpTimeout_u32` | `number` (uint32) | NAT TCP timeout in seconds +`NatUdpTimeout_u32` | `number` (uint32) | NAT UDP timeout in seconds +`UseDhcp_bool` | `boolean` | Using flag of DHCP function +`DhcpLeaseIPStart_ip` | `string` (IP address) | Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) +`DhcpLeaseIPEnd_ip` | `string` (IP address) | Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) +`DhcpSubnetMask_ip` | `string` (IP address) | Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) +`DhcpExpireTimeSpan_u32` | `number` (uint32) | Specify the expiration date in second units for leasing an IP address to a client. +`DhcpGatewayAddress_ip` | `string` (IP address) | Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway. +`DhcpDnsServerAddress_ip` | `string` (IP address) | Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. +`DhcpDnsServerAddress2_ip` | `string` (IP address) | Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. +`DhcpDomainName_str` | `string` (ASCII) | Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name. +`SaveLog_bool` | `boolean` | Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting. +`ApplyDhcpPushRoutes_bool` | `boolean` | The flag to enable the DhcpPushRoutes_str field. +`DhcpPushRoutes_str` | `string` (ASCII) | Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes. + +*** + +## "GetSecureNATOption" RPC API - Get Settings of SecureNAT Function +### Description +Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetSecureNATOption", + "params": { + "RpcHubName_str": "rpchubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "RpcHubName_str": "rpchubname", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "Ip_ip": "192.168.0.1", + "Mask_ip": "255.255.255.255", + "UseNat_bool": false, + "Mtu_u32": 0, + "NatTcpTimeout_u32": 0, + "NatUdpTimeout_u32": 0, + "UseDhcp_bool": false, + "DhcpLeaseIPStart_ip": "192.168.0.1", + "DhcpLeaseIPEnd_ip": "192.168.0.1", + "DhcpSubnetMask_ip": "255.255.255.255", + "DhcpExpireTimeSpan_u32": 0, + "DhcpGatewayAddress_ip": "192.168.0.1", + "DhcpDnsServerAddress_ip": "192.168.0.1", + "DhcpDnsServerAddress2_ip": "192.168.0.1", + "DhcpDomainName_str": "dhcpdomainname", + "SaveLog_bool": false, + "ApplyDhcpPushRoutes_bool": false, + "DhcpPushRoutes_str": "dhcppushroutes" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`RpcHubName_str` | `string` (ASCII) | Target Virtual HUB name +`MacAddress_bin` | `string` (Base64 binary) | MAC address +`Ip_ip` | `string` (IP address) | IP address +`Mask_ip` | `string` (IP address) | Subnet mask +`UseNat_bool` | `boolean` | Use flag of the Virtual NAT function +`Mtu_u32` | `number` (uint32) | MTU value (Standard: 1500) +`NatTcpTimeout_u32` | `number` (uint32) | NAT TCP timeout in seconds +`NatUdpTimeout_u32` | `number` (uint32) | NAT UDP timeout in seconds +`UseDhcp_bool` | `boolean` | Using flag of DHCP function +`DhcpLeaseIPStart_ip` | `string` (IP address) | Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) +`DhcpLeaseIPEnd_ip` | `string` (IP address) | Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) +`DhcpSubnetMask_ip` | `string` (IP address) | Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) +`DhcpExpireTimeSpan_u32` | `number` (uint32) | Specify the expiration date in second units for leasing an IP address to a client. +`DhcpGatewayAddress_ip` | `string` (IP address) | Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway. +`DhcpDnsServerAddress_ip` | `string` (IP address) | Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. +`DhcpDnsServerAddress2_ip` | `string` (IP address) | Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. +`DhcpDomainName_str` | `string` (ASCII) | Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name. +`SaveLog_bool` | `boolean` | Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting. +`ApplyDhcpPushRoutes_bool` | `boolean` | The flag to enable the DhcpPushRoutes_str field. +`DhcpPushRoutes_str` | `string` (ASCII) | Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes. + +*** + +## "EnumNAT" RPC API - Get Virtual NAT Function Session Table of SecureNAT Function +### Description +Get Virtual NAT Function Session Table of SecureNAT Function. Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumNAT", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "NatTable": [ + { + "Id_u32": 0, + "Protocol_u32": 0, + "SrcIp_ip": "192.168.0.1", + "SrcHost_str": "srchost", + "SrcPort_u32": 0, + "DestIp_ip": "192.168.0.1", + "DestHost_str": "desthost", + "DestPort_u32": 0, + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "LastCommTime_dt": "2020-08-01T12:24:36.123", + "SendSize_u64": 0, + "RecvSize_u64": 0, + "TcpStatus_u32": 0 + }, + { + "Id_u32": 0, + "Protocol_u32": 0, + "SrcIp_ip": "192.168.0.1", + "SrcHost_str": "srchost", + "SrcPort_u32": 0, + "DestIp_ip": "192.168.0.1", + "DestHost_str": "desthost", + "DestPort_u32": 0, + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "LastCommTime_dt": "2020-08-01T12:24:36.123", + "SendSize_u64": 0, + "RecvSize_u64": 0, + "TcpStatus_u32": 0 + }, + { + "Id_u32": 0, + "Protocol_u32": 0, + "SrcIp_ip": "192.168.0.1", + "SrcHost_str": "srchost", + "SrcPort_u32": 0, + "DestIp_ip": "192.168.0.1", + "DestHost_str": "desthost", + "DestPort_u32": 0, + "CreatedTime_dt": "2020-08-01T12:24:36.123", + "LastCommTime_dt": "2020-08-01T12:24:36.123", + "SendSize_u64": 0, + "RecvSize_u64": 0, + "TcpStatus_u32": 0 + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Virtual Hub Name +`NatTable` | `Array object` | NAT item +`Id_u32` | `number` (uint32) | ID +`Protocol_u32` | `number` (enum) | Protocol
Values:
`0`: TCP
`1`: UDP
`2`: DNS
`3`: ICMP +`SrcIp_ip` | `string` (IP address) | Source IP address +`SrcHost_str` | `string` (ASCII) | Source host name +`SrcPort_u32` | `number` (uint32) | Source port number +`DestIp_ip` | `string` (IP address) | Destination IP address +`DestHost_str` | `string` (ASCII) | Destination host name +`DestPort_u32` | `number` (uint32) | Destination port number +`CreatedTime_dt` | `Date` | Connection time +`LastCommTime_dt` | `Date` | Last communication time +`SendSize_u64` | `number` (uint64) | Transmission size +`RecvSize_u64` | `number` (uint64) | Receive size +`TcpStatus_u32` | `number` (enum) | TCP state
Values:
`0`: Connecting
`1`: Send the RST (Connection failure or disconnected)
`2`: Connection complete
`3`: Connection established
`4`: Wait for socket disconnection + +*** + +## "EnumDHCP" RPC API - Get Virtual DHCP Server Function Lease Table of SecureNAT Function +### Description +Get Virtual DHCP Server Function Lease Table of SecureNAT Function. Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumDHCP", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "DhcpTable": [ + { + "Id_u32": 0, + "LeasedTime_dt": "2020-08-01T12:24:36.123", + "ExpireTime_dt": "2020-08-01T12:24:36.123", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "IpAddress_ip": "192.168.0.1", + "Mask_u32": 0, + "Hostname_str": "hostname" + }, + { + "Id_u32": 0, + "LeasedTime_dt": "2020-08-01T12:24:36.123", + "ExpireTime_dt": "2020-08-01T12:24:36.123", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "IpAddress_ip": "192.168.0.1", + "Mask_u32": 0, + "Hostname_str": "hostname" + }, + { + "Id_u32": 0, + "LeasedTime_dt": "2020-08-01T12:24:36.123", + "ExpireTime_dt": "2020-08-01T12:24:36.123", + "MacAddress_bin": "SGVsbG8gV29ybGQ=", + "IpAddress_ip": "192.168.0.1", + "Mask_u32": 0, + "Hostname_str": "hostname" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Virtual Hub Name +`DhcpTable` | `Array object` | DHCP Item +`Id_u32` | `number` (uint32) | ID +`LeasedTime_dt` | `Date` | Lease time +`ExpireTime_dt` | `Date` | Expiration date +`MacAddress_bin` | `string` (Base64 binary) | MAC address +`IpAddress_ip` | `string` (IP address) | IP address +`Mask_u32` | `number` (uint32) | Subnet mask +`Hostname_str` | `string` (ASCII) | Host name + +*** + +## "GetSecureNATStatus" RPC API - Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function) +### Description +Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetSecureNATStatus", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "NumTcpSessions_u32": 0, + "NumUdpSessions_u32": 0, + "NumIcmpSessions_u32": 0, + "NumDnsSessions_u32": 0, + "NumDhcpClients_u32": 0, + "IsKernelMode_bool": false, + "IsRawIpMode_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Virtual Hub Name +`NumTcpSessions_u32` | `number` (uint32) | Number of TCP sessions +`NumUdpSessions_u32` | `number` (uint32) | Ntmber of UDP sessions +`NumIcmpSessions_u32` | `number` (uint32) | Nymber of ICMP sessions +`NumDnsSessions_u32` | `number` (uint32) | Number of DNS sessions +`NumDhcpClients_u32` | `number` (uint32) | Number of DHCP clients +`IsKernelMode_bool` | `boolean` | Whether the NAT is operating in the Kernel Mode +`IsRawIpMode_bool` | `boolean` | Whether the NAT is operating in the Raw IP Mode + +*** + +## "EnumEthernet" RPC API - Get List of Network Adapters Usable as Local Bridge +### Description +Get List of Network Adapters Usable as Local Bridge. Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumEthernet", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "EthList": [ + { + "DeviceName_str": "devicename", + "NetworkConnectionName_utf": "networkconnectionname" + }, + { + "DeviceName_str": "devicename", + "NetworkConnectionName_utf": "networkconnectionname" + }, + { + "DeviceName_str": "devicename", + "NetworkConnectionName_utf": "networkconnectionname" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`EthList` | `Array object` | Ethernet Network Adapters list +`DeviceName_str` | `string` (ASCII) | Device name +`NetworkConnectionName_utf` | `string` (UTF8) | Network connection name (description) + +*** + +## "AddLocalBridge" RPC API - Create Local Bridge Connection +### Description +Create Local Bridge Connection. Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "AddLocalBridge", + "params": { + "DeviceName_str": "devicename", + "HubNameLB_str": "hubnamelb" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "DeviceName_str": "devicename", + "HubNameLB_str": "hubnamelb", + "Online_bool": false, + "Active_bool": false, + "TapMode_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`DeviceName_str` | `string` (ASCII) | Physical Ethernet device name +`HubNameLB_str` | `string` (ASCII) | The Virtual Hub name +`Online_bool` | `boolean` | Online flag +`Active_bool` | `boolean` | Running flag +`TapMode_bool` | `boolean` | Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). + +*** + +## "DeleteLocalBridge" RPC API - Delete Local Bridge Connection +### Description +Delete Local Bridge Connection. Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteLocalBridge", + "params": { + "DeviceName_str": "devicename", + "HubNameLB_str": "hubnamelb" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "DeviceName_str": "devicename", + "HubNameLB_str": "hubnamelb", + "Online_bool": false, + "Active_bool": false, + "TapMode_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`DeviceName_str` | `string` (ASCII) | Physical Ethernet device name +`HubNameLB_str` | `string` (ASCII) | The Virtual Hub name +`Online_bool` | `boolean` | Online flag +`Active_bool` | `boolean` | Running flag +`TapMode_bool` | `boolean` | Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). + +*** + +## "EnumLocalBridge" RPC API - Get List of Local Bridge Connection +### Description +Get List of Local Bridge Connection. Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumLocalBridge", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "LocalBridgeList": [ + { + "DeviceName_str": "devicename", + "HubNameLB_str": "hubnamelb", + "Online_bool": false, + "Active_bool": false, + "TapMode_bool": false + }, + { + "DeviceName_str": "devicename", + "HubNameLB_str": "hubnamelb", + "Online_bool": false, + "Active_bool": false, + "TapMode_bool": false + }, + { + "DeviceName_str": "devicename", + "HubNameLB_str": "hubnamelb", + "Online_bool": false, + "Active_bool": false, + "TapMode_bool": false + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`LocalBridgeList` | `Array object` | Local Bridge list +`DeviceName_str` | `string` (ASCII) | Physical Ethernet device name +`HubNameLB_str` | `string` (ASCII) | The Virtual Hub name +`Online_bool` | `boolean` | Online flag +`Active_bool` | `boolean` | Running flag +`TapMode_bool` | `boolean` | Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). + +*** + +## "GetBridgeSupport" RPC API - Get whether the localbridge function is supported on the current system +### Description +Get whether the localbridge function is supported on the current system. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetBridgeSupport", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IsBridgeSupportedOs_bool": false, + "IsWinPcapNeeded_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IsBridgeSupportedOs_bool` | `boolean` | Whether the OS supports the Local Bridge function +`IsWinPcapNeeded_bool` | `boolean` | Whether WinPcap is necessary to install + +*** + +## "RebootServer" RPC API - Reboot VPN Server Service +### Description +Reboot VPN Server Service. Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "RebootServer", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IntValue_u32": 0, + "Int64Value_u64": 0, + "StrValue_str": "strvalue", + "UniStrValue_utf": "unistrvalue" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IntValue_u32` | `number` (uint32) | A 32-bit integer field +`Int64Value_u64` | `number` (uint64) | A 64-bit integer field +`StrValue_str` | `string` (ASCII) | An Ascii string field +`UniStrValue_utf` | `string` (UTF8) | An UTF-8 string field + +*** + +## "GetCaps" RPC API - Get List of Server Functions / Capability +### Description +Get List of Server Functions / Capability. Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetCaps", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "CapsList": [ + { + "CapsName_str": "capsname", + "CapsValue_u32": 0, + "CapsDescrption_utf": "capsdescrption" + }, + { + "CapsName_str": "capsname", + "CapsValue_u32": 0, + "CapsDescrption_utf": "capsdescrption" + }, + { + "CapsName_str": "capsname", + "CapsValue_u32": 0, + "CapsDescrption_utf": "capsdescrption" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`CapsList` | `Array object` | Caps list of the VPN Server +`CapsName_str` | `string` (ASCII) | Name +`CapsValue_u32` | `number` (uint32) | Value +`CapsDescrption_utf` | `string` (UTF8) | Descrption + +*** + +## "GetConfig" RPC API - Get the current configuration of the VPN Server +### Description +Get the current configuration of the VPN Server. Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetConfig", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "FileName_str": "filename", + "FileData_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`FileName_str` | `string` (ASCII) | File name (valid only for returning from the server) +`FileData_bin` | `string` (Base64 binary) | File data + +*** + +## "SetConfig" RPC API - Write Configuration File to VPN Server +### Description +Write Configuration File to VPN Server. Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetConfig", + "params": { + "FileData_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "FileName_str": "filename", + "FileData_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`FileName_str` | `string` (ASCII) | File name (valid only for returning from the server) +`FileData_bin` | `string` (Base64 binary) | File data + +*** + +## "GetDefaultHubAdminOptions" RPC API - Get Virtual Hub Administration Option default values +### Description +Get Virtual Hub Administration Option default values. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetDefaultHubAdminOptions", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AdminOptionList": [ + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Virtual HUB name +`AdminOptionList` | `Array object` | List data +`Name_str` | `string` (ASCII) | Name +`Value_u32` | `number` (uint32) | Data +`Descrption_utf` | `string` (UTF8) | Descrption + +*** + +## "GetHubAdminOptions" RPC API - Get List of Virtual Hub Administration Options +### Description +Get List of Virtual Hub Administration Options. Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetHubAdminOptions", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AdminOptionList": [ + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Virtual HUB name +`AdminOptionList` | `Array object` | List data +`Name_str` | `string` (ASCII) | Name +`Value_u32` | `number` (uint32) | Data +`Descrption_utf` | `string` (UTF8) | Descrption + +*** + +## "SetHubAdminOptions" RPC API - Set Values of Virtual Hub Administration Options +### Description +Set Values of Virtual Hub Administration Options. Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetHubAdminOptions", + "params": { + "HubName_str": "hubname", + "AdminOptionList": [ + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + } + ] + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AdminOptionList": [ + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Virtual HUB name +`AdminOptionList` | `Array object` | List data +`Name_str` | `string` (ASCII) | Name +`Value_u32` | `number` (uint32) | Data +`Descrption_utf` | `string` (UTF8) | Descrption + +*** + +## "GetHubExtOptions" RPC API - Get List of Virtual Hub Extended Options +### Description +Get List of Virtual Hub Extended Options. Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetHubExtOptions", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AdminOptionList": [ + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Virtual HUB name +`AdminOptionList` | `Array object` | List data +`Name_str` | `string` (ASCII) | Name +`Value_u32` | `number` (uint32) | Data +`Descrption_utf` | `string` (UTF8) | Descrption + +*** + +## "SetHubExtOptions" RPC API - Set a Value of Virtual Hub Extended Options +### Description +Set a Value of Virtual Hub Extended Options. Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetHubExtOptions", + "params": { + "HubName_str": "hubname", + "AdminOptionList": [ + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + } + ] + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "AdminOptionList": [ + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + }, + { + "Name_str": "name", + "Value_u32": 0, + "Descrption_utf": "descrption" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | Virtual HUB name +`AdminOptionList` | `Array object` | List data +`Name_str` | `string` (ASCII) | Name +`Value_u32` | `number` (uint32) | Data +`Descrption_utf` | `string` (UTF8) | Descrption + +*** + +## "AddL3Switch" RPC API - Define New Virtual Layer 3 Switch +### Description +Define New Virtual Layer 3 Switch. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "AddL3Switch", + "params": { + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | Layer-3 Switch name + +*** + +## "DelL3Switch" RPC API - Delete Virtual Layer 3 Switch +### Description +Delete Virtual Layer 3 Switch. Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DelL3Switch", + "params": { + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | Layer-3 Switch name + +*** + +## "EnumL3Switch" RPC API - Get List of Virtual Layer 3 Switches +### Description +Get List of Virtual Layer 3 Switches. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumL3Switch", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "L3SWList": [ + { + "Name_str": "name", + "NumInterfaces_u32": 0, + "NumTables_u32": 0, + "Active_bool": false, + "Online_bool": false + }, + { + "Name_str": "name", + "NumInterfaces_u32": 0, + "NumTables_u32": 0, + "Active_bool": false, + "Online_bool": false + }, + { + "Name_str": "name", + "NumInterfaces_u32": 0, + "NumTables_u32": 0, + "Active_bool": false, + "Online_bool": false + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`L3SWList` | `Array object` | Layer-3 switch list +`Name_str` | `string` (ASCII) | Name of the layer-3 switch +`NumInterfaces_u32` | `number` (uint32) | Number of layer-3 switch virtual interfaces +`NumTables_u32` | `number` (uint32) | Number of routing tables +`Active_bool` | `boolean` | Activated flag +`Online_bool` | `boolean` | Online flag + +*** + +## "StartL3Switch" RPC API - Start Virtual Layer 3 Switch Operation +### Description +Start Virtual Layer 3 Switch Operation. Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "StartL3Switch", + "params": { + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | Layer-3 Switch name + +*** + +## "StopL3Switch" RPC API - Stop Virtual Layer 3 Switch Operation +### Description +Stop Virtual Layer 3 Switch Operation. Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "StopL3Switch", + "params": { + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | Layer-3 Switch name + +*** + +## "AddL3If" RPC API - Add Virtual Interface to Virtual Layer 3 Switch +### Description +Add Virtual Interface to Virtual Layer 3 Switch. Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "AddL3If", + "params": { + "Name_str": "name", + "HubName_str": "hubname", + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name", + "HubName_str": "hubname", + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | L3 switch name +`HubName_str` | `string` (ASCII) | Virtual HUB name +`IpAddress_ip` | `string` (IP address) | IP address +`SubnetMask_ip` | `string` (IP address) | Subnet mask + +*** + +## "DelL3If" RPC API - Delete Virtual Interface of Virtual Layer 3 Switch +### Description +Delete Virtual Interface of Virtual Layer 3 Switch. Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DelL3If", + "params": { + "Name_str": "name", + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name", + "HubName_str": "hubname", + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | L3 switch name +`HubName_str` | `string` (ASCII) | Virtual HUB name +`IpAddress_ip` | `string` (IP address) | IP address +`SubnetMask_ip` | `string` (IP address) | Subnet mask + +*** + +## "EnumL3If" RPC API - Get List of Interfaces Registered on the Virtual Layer 3 Switch +### Description +Get List of Interfaces Registered on the Virtual Layer 3 Switch. Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumL3If", + "params": { + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name", + "L3IFList": [ + { + "Name_str": "name", + "HubName_str": "hubname", + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + }, + { + "Name_str": "name", + "HubName_str": "hubname", + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + }, + { + "Name_str": "name", + "HubName_str": "hubname", + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | Layer-3 switch name +`L3IFList` | `Array object` | Layer-3 interface list +`Name_str` | `string` (ASCII) | L3 switch name +`HubName_str` | `string` (ASCII) | Virtual HUB name +`IpAddress_ip` | `string` (IP address) | IP address +`SubnetMask_ip` | `string` (IP address) | Subnet mask + +*** + +## "AddL3Table" RPC API - Add Routing Table Entry for Virtual Layer 3 Switch +### Description +Add Routing Table Entry for Virtual Layer 3 Switch. Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "AddL3Table", + "params": { + "Name_str": "name", + "NetworkAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255", + "GatewayAddress_ip": "192.168.0.1", + "Metric_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name", + "NetworkAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255", + "GatewayAddress_ip": "192.168.0.1", + "Metric_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | L3 switch name +`NetworkAddress_ip` | `string` (IP address) | Network address +`SubnetMask_ip` | `string` (IP address) | Subnet mask +`GatewayAddress_ip` | `string` (IP address) | Gateway address +`Metric_u32` | `number` (uint32) | Metric + +*** + +## "DelL3Table" RPC API - Delete Routing Table Entry of Virtual Layer 3 Switch +### Description +Delete Routing Table Entry of Virtual Layer 3 Switch. Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DelL3Table", + "params": { + "Name_str": "name", + "NetworkAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255", + "GatewayAddress_ip": "192.168.0.1", + "Metric_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name", + "NetworkAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255", + "GatewayAddress_ip": "192.168.0.1", + "Metric_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | L3 switch name +`NetworkAddress_ip` | `string` (IP address) | Network address +`SubnetMask_ip` | `string` (IP address) | Subnet mask +`GatewayAddress_ip` | `string` (IP address) | Gateway address +`Metric_u32` | `number` (uint32) | Metric + +*** + +## "EnumL3Table" RPC API - Get List of Routing Tables of Virtual Layer 3 Switch +### Description +Get List of Routing Tables of Virtual Layer 3 Switch. Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumL3Table", + "params": { + "Name_str": "name" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Name_str": "name", + "L3Table": [ + { + "Name_str": "name", + "NetworkAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255", + "GatewayAddress_ip": "192.168.0.1", + "Metric_u32": 0 + }, + { + "Name_str": "name", + "NetworkAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255", + "GatewayAddress_ip": "192.168.0.1", + "Metric_u32": 0 + }, + { + "Name_str": "name", + "NetworkAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255", + "GatewayAddress_ip": "192.168.0.1", + "Metric_u32": 0 + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Name_str` | `string` (ASCII) | L3 switch name +`L3Table` | `Array object` | Routing table item list +`Name_str` | `string` (ASCII) | L3 switch name +`NetworkAddress_ip` | `string` (IP address) | Network address +`SubnetMask_ip` | `string` (IP address) | Subnet mask +`GatewayAddress_ip` | `string` (IP address) | Gateway address +`Metric_u32` | `number` (uint32) | Metric + +*** + +## "EnumCrl" RPC API - Get List of Certificates Revocation List +### Description +Get List of Certificates Revocation List. Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumCrl", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "CRLList": [ + { + "Key_u32": 0, + "CrlInfo_utf": "crlinfo" + }, + { + "Key_u32": 0, + "CrlInfo_utf": "crlinfo" + }, + { + "Key_u32": 0, + "CrlInfo_utf": "crlinfo" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`CRLList` | `Array object` | CRL list +`Key_u32` | `number` (uint32) | Key ID +`CrlInfo_utf` | `string` (UTF8) | The contents of the CRL item + +*** + +## "AddCrl" RPC API - Add a Revoked Certificate +### Description +Add a Revoked Certificate. Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "AddCrl", + "params": { + "HubName_str": "hubname", + "CommonName_utf": "commonname", + "Organization_utf": "organization", + "Unit_utf": "unit", + "Country_utf": "country", + "State_utf": "state", + "Local_utf": "local", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "DigestMD5_bin": "SGVsbG8gV29ybGQ=", + "DigestSHA1_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Key_u32": 0, + "CommonName_utf": "commonname", + "Organization_utf": "organization", + "Unit_utf": "unit", + "Country_utf": "country", + "State_utf": "state", + "Local_utf": "local", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "DigestMD5_bin": "SGVsbG8gV29ybGQ=", + "DigestSHA1_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Key_u32` | `number` (uint32) | Key ID +`CommonName_utf` | `string` (UTF8) | CN, optional +`Organization_utf` | `string` (UTF8) | O, optional +`Unit_utf` | `string` (UTF8) | OU, optional +`Country_utf` | `string` (UTF8) | C, optional +`State_utf` | `string` (UTF8) | ST, optional +`Local_utf` | `string` (UTF8) | L, optional +`Serial_bin` | `string` (Base64 binary) | Serial, optional +`DigestMD5_bin` | `string` (Base64 binary) | MD5 Digest, optional +`DigestSHA1_bin` | `string` (Base64 binary) | SHA1 Digest, optional + +*** + +## "DelCrl" RPC API - Delete a Revoked Certificate +### Description +Delete a Revoked Certificate. Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DelCrl", + "params": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Key_u32": 0, + "CommonName_utf": "commonname", + "Organization_utf": "organization", + "Unit_utf": "unit", + "Country_utf": "country", + "State_utf": "state", + "Local_utf": "local", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "DigestMD5_bin": "SGVsbG8gV29ybGQ=", + "DigestSHA1_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Key_u32` | `number` (uint32) | Key ID +`CommonName_utf` | `string` (UTF8) | CN, optional +`Organization_utf` | `string` (UTF8) | O, optional +`Unit_utf` | `string` (UTF8) | OU, optional +`Country_utf` | `string` (UTF8) | C, optional +`State_utf` | `string` (UTF8) | ST, optional +`Local_utf` | `string` (UTF8) | L, optional +`Serial_bin` | `string` (Base64 binary) | Serial, optional +`DigestMD5_bin` | `string` (Base64 binary) | MD5 Digest, optional +`DigestSHA1_bin` | `string` (Base64 binary) | SHA1 Digest, optional + +*** + +## "GetCrl" RPC API - Get a Revoked Certificate +### Description +Get a Revoked Certificate. Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetCrl", + "params": { + "HubName_str": "hubname", + "Key_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Key_u32": 0, + "CommonName_utf": "commonname", + "Organization_utf": "organization", + "Unit_utf": "unit", + "Country_utf": "country", + "State_utf": "state", + "Local_utf": "local", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "DigestMD5_bin": "SGVsbG8gV29ybGQ=", + "DigestSHA1_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Key_u32` | `number` (uint32) | Key ID +`CommonName_utf` | `string` (UTF8) | CN, optional +`Organization_utf` | `string` (UTF8) | O, optional +`Unit_utf` | `string` (UTF8) | OU, optional +`Country_utf` | `string` (UTF8) | C, optional +`State_utf` | `string` (UTF8) | ST, optional +`Local_utf` | `string` (UTF8) | L, optional +`Serial_bin` | `string` (Base64 binary) | Serial, optional +`DigestMD5_bin` | `string` (Base64 binary) | MD5 Digest, optional +`DigestSHA1_bin` | `string` (Base64 binary) | SHA1 Digest, optional + +*** + +## "SetCrl" RPC API - Change Existing CRL (Certificate Revocation List) Entry +### Description +Change Existing CRL (Certificate Revocation List) Entry. Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetCrl", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Key_u32": 0, + "CommonName_utf": "commonname", + "Organization_utf": "organization", + "Unit_utf": "unit", + "Country_utf": "country", + "State_utf": "state", + "Local_utf": "local", + "Serial_bin": "SGVsbG8gV29ybGQ=", + "DigestMD5_bin": "SGVsbG8gV29ybGQ=", + "DigestSHA1_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Key_u32` | `number` (uint32) | Key ID +`CommonName_utf` | `string` (UTF8) | CN, optional +`Organization_utf` | `string` (UTF8) | O, optional +`Unit_utf` | `string` (UTF8) | OU, optional +`Country_utf` | `string` (UTF8) | C, optional +`State_utf` | `string` (UTF8) | ST, optional +`Local_utf` | `string` (UTF8) | L, optional +`Serial_bin` | `string` (Base64 binary) | Serial, optional +`DigestMD5_bin` | `string` (Base64 binary) | MD5 Digest, optional +`DigestSHA1_bin` | `string` (Base64 binary) | SHA1 Digest, optional + +*** + +## "SetAcList" RPC API - Add Rule to Source IP Address Limit List +### Description +Add Rule to Source IP Address Limit List. Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetAcList", + "params": { + "HubName_str": "hubname", + "ACList": [ + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + }, + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + }, + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + } + ] + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "ACList": [ + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + }, + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + }, + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`ACList` | `Array object` | Source IP Address Limit List +`Id_u32` | `number` (uint32) | ID +`Priority_u32` | `number` (uint32) | Priority +`Deny_bool` | `boolean` | Deny access +`Masked_bool` | `boolean` | Set true if you want to specify the SubnetMask_ip item. +`IpAddress_ip` | `string` (IP address) | IP address +`SubnetMask_ip` | `string` (IP address) | Subnet mask, valid only if Masked_bool == true + +*** + +## "GetAcList" RPC API - Get List of Rule Items of Source IP Address Limit List +### Description +Get List of Rule Items of Source IP Address Limit List. Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetAcList", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "ACList": [ + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + }, + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + }, + { + "Id_u32": 0, + "Priority_u32": 0, + "Deny_bool": false, + "Masked_bool": false, + "IpAddress_ip": "192.168.0.1", + "SubnetMask_ip": "255.255.255.255" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`ACList` | `Array object` | Source IP Address Limit List +`Id_u32` | `number` (uint32) | ID +`Priority_u32` | `number` (uint32) | Priority +`Deny_bool` | `boolean` | Deny access +`Masked_bool` | `boolean` | Set true if you want to specify the SubnetMask_ip item. +`IpAddress_ip` | `string` (IP address) | IP address +`SubnetMask_ip` | `string` (IP address) | Subnet mask, valid only if Masked_bool == true + +*** + +## "EnumLogFile" RPC API - Get List of Log Files +### Description +Get List of Log Files. Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumLogFile", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "LogFiles": [ + { + "ServerName_str": "servername", + "FilePath_str": "filepath", + "FileSize_u32": 0, + "UpdatedTime_dt": "2020-08-01T12:24:36.123" + }, + { + "ServerName_str": "servername", + "FilePath_str": "filepath", + "FileSize_u32": 0, + "UpdatedTime_dt": "2020-08-01T12:24:36.123" + }, + { + "ServerName_str": "servername", + "FilePath_str": "filepath", + "FileSize_u32": 0, + "UpdatedTime_dt": "2020-08-01T12:24:36.123" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`LogFiles` | `Array object` | Log file list +`ServerName_str` | `string` (ASCII) | Server name +`FilePath_str` | `string` (ASCII) | File path +`FileSize_u32` | `number` (uint32) | File size +`UpdatedTime_dt` | `Date` | Last write date + +*** + +## "ReadLogFile" RPC API - Download a part of Log File +### Description +Download a part of Log File. Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "ReadLogFile", + "params": { + "FilePath_str": "filepath" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ServerName_str": "servername", + "FilePath_str": "filepath", + "Offset_u32": 0, + "Buffer_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ServerName_str` | `string` (ASCII) | Server name +`FilePath_str` | `string` (ASCII) | File Path +`Offset_u32` | `number` (uint32) | Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field. +`Buffer_bin` | `string` (Base64 binary) | Received buffer + +*** + +## "SetSysLog" RPC API - Set syslog Send Function +### Description +Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetSysLog", + "params": { + "SaveType_u32": 0, + "Hostname_str": "hostname", + "Port_u32": 0 + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "SaveType_u32": 0, + "Hostname_str": "hostname", + "Port_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`SaveType_u32` | `number` (enum) | The behavior of the syslog function
Values:
`0`: Do not use syslog
`1`: Only server log
`2`: Server and Virtual HUB security log
`3`: Server, Virtual HUB security, and packet log +`Hostname_str` | `string` (ASCII) | Specify the host name or IP address of the syslog server +`Port_u32` | `number` (uint32) | Specify the port number of the syslog server + +*** + +## "GetSysLog" RPC API - Get syslog Send Function +### Description +Get syslog Send Function. This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetSysLog", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "SaveType_u32": 0, + "Hostname_str": "hostname", + "Port_u32": 0 + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`SaveType_u32` | `number` (enum) | The behavior of the syslog function
Values:
`0`: Do not use syslog
`1`: Only server log
`2`: Server and Virtual HUB security log
`3`: Server, Virtual HUB security, and packet log +`Hostname_str` | `string` (ASCII) | Specify the host name or IP address of the syslog server +`Port_u32` | `number` (uint32) | Specify the port number of the syslog server + +*** + +## "SetHubMsg" RPC API - Set Today's Message of Virtual Hub +### Description +Set Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetHubMsg", + "params": { + "HubName_str": "hubname", + "Msg_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Msg_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Msg_bin` | `string` (Base64 binary) | Message (Unicode strings acceptable) + +*** + +## "GetHubMsg" RPC API - Get Today's Message of Virtual Hub +### Description +Get Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetHubMsg", + "params": { + "HubName_str": "hubname" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Msg_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Msg_bin` | `string` (Base64 binary) | Message (Unicode strings acceptable) + +*** + +## "Crash" RPC API - Raise a vital error on the VPN Server / Bridge to terminate the process forcefully +### Description +Raise a vital error on the VPN Server / Bridge to terminate the process forcefully. This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "Crash", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IntValue_u32": 0, + "Int64Value_u64": 0, + "StrValue_str": "strvalue", + "UniStrValue_utf": "unistrvalue" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IntValue_u32` | `number` (uint32) | A 32-bit integer field +`Int64Value_u64` | `number` (uint64) | A 64-bit integer field +`StrValue_str` | `string` (ASCII) | An Ascii string field +`UniStrValue_utf` | `string` (UTF8) | An UTF-8 string field + +*** + +## "GetAdminMsg" RPC API - Get the message for administrators +### Description +Get the message for administrators. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetAdminMsg", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "HubName_str": "hubname", + "Msg_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`HubName_str` | `string` (ASCII) | The Virtual Hub name +`Msg_bin` | `string` (Base64 binary) | Message (Unicode strings acceptable) + +*** + +## "Flush" RPC API - Save All Volatile Data of VPN Server / Bridge to the Configuration File +### Description +Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "Flush", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IntValue_u32": 0, + "Int64Value_u64": 0, + "StrValue_str": "strvalue", + "UniStrValue_utf": "unistrvalue" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IntValue_u32` | `number` (uint32) | A 32-bit integer field +`Int64Value_u64` | `number` (uint64) | A 64-bit integer field +`StrValue_str` | `string` (ASCII) | An Ascii string field +`UniStrValue_utf` | `string` (UTF8) | An UTF-8 string field + +*** + +## "SetIPsecServices" RPC API - Enable or Disable IPsec VPN Server Function +### Description +Enable or Disable IPsec VPN Server Function. Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetIPsecServices", + "params": { + "L2TP_Raw_bool": false, + "L2TP_IPsec_bool": false, + "EtherIP_IPsec_bool": false, + "IPsec_Secret_str": "ipsec_secret", + "L2TP_DefaultHub_str": "l2tp_defaulthub" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "L2TP_Raw_bool": false, + "L2TP_IPsec_bool": false, + "EtherIP_IPsec_bool": false, + "IPsec_Secret_str": "ipsec_secret", + "L2TP_DefaultHub_str": "l2tp_defaulthub" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`L2TP_Raw_bool` | `boolean` | Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. +`L2TP_IPsec_bool` | `boolean` | Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option. +`EtherIP_IPsec_bool` | `boolean` | Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging. +`IPsec_Secret_str` | `string` (ASCII) | Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters. +`L2TP_DefaultHub_str` | `string` (ASCII) | Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. + +*** + +## "GetIPsecServices" RPC API - Get the Current IPsec VPN Server Settings +### Description +Get the Current IPsec VPN Server Settings. Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetIPsecServices", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "L2TP_Raw_bool": false, + "L2TP_IPsec_bool": false, + "EtherIP_IPsec_bool": false, + "IPsec_Secret_str": "ipsec_secret", + "L2TP_DefaultHub_str": "l2tp_defaulthub" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`L2TP_Raw_bool` | `boolean` | Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. +`L2TP_IPsec_bool` | `boolean` | Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option. +`EtherIP_IPsec_bool` | `boolean` | Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging. +`IPsec_Secret_str` | `string` (ASCII) | Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters. +`L2TP_DefaultHub_str` | `string` (ASCII) | Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. + +*** + +## "AddEtherIpId" RPC API - Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices +### Description +Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices. Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "AddEtherIpId", + "params": { + "Id_str": "id", + "HubName_str": "hubname", + "UserName_str": "username", + "Password_str": "password" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Id_str": "id", + "HubName_str": "hubname", + "UserName_str": "username", + "Password_str": "password" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Id_str` | `string` (ASCII) | Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. +`HubName_str` | `string` (ASCII) | Specify the name of the Virtual Hub to connect. +`UserName_str` | `string` (ASCII) | Specify the username to login to the destination Virtual Hub. +`Password_str` | `string` (ASCII) | Specify the password to login to the destination Virtual Hub. + +*** + +## "GetEtherIpId" RPC API - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions +### Description +Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetEtherIpId", + "params": { + "Id_str": "id" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Id_str": "id", + "HubName_str": "hubname", + "UserName_str": "username", + "Password_str": "password" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Id_str` | `string` (ASCII) | Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. +`HubName_str` | `string` (ASCII) | Specify the name of the Virtual Hub to connect. +`UserName_str` | `string` (ASCII) | Specify the username to login to the destination Virtual Hub. +`Password_str` | `string` (ASCII) | Specify the password to login to the destination Virtual Hub. + +*** + +## "DeleteEtherIpId" RPC API - Delete an EtherIP / L2TPv3 over IPsec Client Setting +### Description +Delete an EtherIP / L2TPv3 over IPsec Client Setting. This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "DeleteEtherIpId", + "params": { + "Id_str": "id" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Id_str": "id", + "HubName_str": "hubname", + "UserName_str": "username", + "Password_str": "password" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Id_str` | `string` (ASCII) | Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. +`HubName_str` | `string` (ASCII) | Specify the name of the Virtual Hub to connect. +`UserName_str` | `string` (ASCII) | Specify the username to login to the destination Virtual Hub. +`Password_str` | `string` (ASCII) | Specify the password to login to the destination Virtual Hub. + +*** + +## "EnumEtherIpId" RPC API - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions +### Description +Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "EnumEtherIpId", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Settings": [ + { + "Id_str": "id", + "HubName_str": "hubname", + "UserName_str": "username", + "Password_str": "password" + }, + { + "Id_str": "id", + "HubName_str": "hubname", + "UserName_str": "username", + "Password_str": "password" + }, + { + "Id_str": "id", + "HubName_str": "hubname", + "UserName_str": "username", + "Password_str": "password" + } + ] + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Settings` | `Array object` | Setting list +`Id_str` | `string` (ASCII) | Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. +`HubName_str` | `string` (ASCII) | Specify the name of the Virtual Hub to connect. +`UserName_str` | `string` (ASCII) | Specify the username to login to the destination Virtual Hub. +`Password_str` | `string` (ASCII) | Specify the password to login to the destination Virtual Hub. + +*** + +## "SetOpenVpnSstpConfig" RPC API - Set Settings for OpenVPN Clone Server Function +### Description +Set Settings for OpenVPN Clone Server Function. The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetOpenVpnSstpConfig", + "params": { + "EnableOpenVPN_bool": false, + "OpenVPNPortList_str": "openvpnportlist", + "EnableSSTP_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "EnableOpenVPN_bool": false, + "OpenVPNPortList_str": "openvpnportlist", + "EnableSSTP_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`EnableOpenVPN_bool` | `boolean` | Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. +`OpenVPNPortList_str` | `string` (ASCII) | Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. +`EnableSSTP_bool` | `boolean` | pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. + +*** + +## "GetOpenVpnSstpConfig" RPC API - Get the Current Settings of OpenVPN Clone Server Function +### Description +Get the Current Settings of OpenVPN Clone Server Function. Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetOpenVpnSstpConfig", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "EnableOpenVPN_bool": false, + "OpenVPNPortList_str": "openvpnportlist", + "EnableSSTP_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`EnableOpenVPN_bool` | `boolean` | Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. +`OpenVPNPortList_str` | `string` (ASCII) | Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. +`EnableSSTP_bool` | `boolean` | pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. + +*** + +## "GetDDnsClientStatus" RPC API - Show the Current Status of Dynamic DNS Function +### Description +Show the Current Status of Dynamic DNS Function. Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetDDnsClientStatus", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "Err_IPv4_u32": 0, + "ErrStr_IPv4_utf": "errstr_ipv4", + "Err_IPv6_u32": 0, + "ErrStr_IPv6_utf": "errstr_ipv6", + "CurrentHostName_str": "currenthostname", + "CurrentFqdn_str": "currentfqdn", + "DnsSuffix_str": "dnssuffix", + "CurrentIPv4_str": "currentipv4", + "CurrentIPv6_str": "currentipv6" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`Err_IPv4_u32` | `number` (uint32) | Last error code (IPv4) +`ErrStr_IPv4_utf` | `string` (UTF8) | Last error string (IPv4) +`Err_IPv6_u32` | `number` (uint32) | Last error code (IPv6) +`ErrStr_IPv6_utf` | `string` (UTF8) | Last error string (IPv6) +`CurrentHostName_str` | `string` (ASCII) | Current DDNS host name +`CurrentFqdn_str` | `string` (ASCII) | Current FQDN of the DDNS hostname +`DnsSuffix_str` | `string` (ASCII) | DDNS suffix +`CurrentIPv4_str` | `string` (ASCII) | Current IPv4 address of the VPN Server +`CurrentIPv6_str` | `string` (ASCII) | Current IPv6 address of the VPN Server + +*** + +## "ChangeDDnsClientHostname" RPC API - Set the Dynamic DNS Hostname +### Description +Set the Dynamic DNS Hostname. You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "ChangeDDnsClientHostname", + "params": { + "StrValue_str": "strvalue" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IntValue_u32": 0, + "Int64Value_u64": 0, + "StrValue_str": "strvalue", + "UniStrValue_utf": "unistrvalue" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IntValue_u32` | `number` (uint32) | A 32-bit integer field +`Int64Value_u64` | `number` (uint64) | A 64-bit integer field +`StrValue_str` | `string` (ASCII) | An Ascii string field +`UniStrValue_utf` | `string` (UTF8) | An UTF-8 string field + +*** + +## "RegenerateServerCert" RPC API - Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server +### Description +Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server. You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "RegenerateServerCert", + "params": { + "StrValue_str": "strvalue" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IntValue_u32": 0, + "Int64Value_u64": 0, + "StrValue_str": "strvalue", + "UniStrValue_utf": "unistrvalue" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IntValue_u32` | `number` (uint32) | A 32-bit integer field +`Int64Value_u64` | `number` (uint64) | A 64-bit integer field +`StrValue_str` | `string` (ASCII) | An Ascii string field +`UniStrValue_utf` | `string` (UTF8) | An UTF-8 string field + +*** + +## "MakeOpenVpnConfigFile" RPC API - Generate a Sample Setting File for OpenVPN Client +### Description +Generate a Sample Setting File for OpenVPN Client. Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "MakeOpenVpnConfigFile", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ServerName_str": "servername", + "FilePath_str": "filepath", + "Offset_u32": 0, + "Buffer_bin": "SGVsbG8gV29ybGQ=" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ServerName_str` | `string` (ASCII) | Server name +`FilePath_str` | `string` (ASCII) | File Path +`Offset_u32` | `number` (uint32) | Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field. +`Buffer_bin` | `string` (Base64 binary) | Received buffer + +*** + +## "SetSpecialListener" RPC API - Enable / Disable the VPN over ICMP / VPN over DNS Server Function +### Description +Enable / Disable the VPN over ICMP / VPN over DNS Server Function. You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetSpecialListener", + "params": { + "VpnOverIcmpListener_bool": false, + "VpnOverDnsListener_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "VpnOverIcmpListener_bool": false, + "VpnOverDnsListener_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`VpnOverIcmpListener_bool` | `boolean` | The flag to activate the VPN over ICMP server function +`VpnOverDnsListener_bool` | `boolean` | The flag to activate the VPN over DNS function + +*** + +## "GetSpecialListener" RPC API - Get Current Setting of the VPN over ICMP / VPN over DNS Function +### Description +Get Current Setting of the VPN over ICMP / VPN over DNS Function. Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetSpecialListener", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "VpnOverIcmpListener_bool": false, + "VpnOverDnsListener_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`VpnOverIcmpListener_bool` | `boolean` | The flag to activate the VPN over ICMP server function +`VpnOverDnsListener_bool` | `boolean` | The flag to activate the VPN over DNS function + +*** + +## "GetAzureStatus" RPC API - Show the current status of VPN Azure function +### Description +Show the current status of VPN Azure function. Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetAzureStatus", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IsEnabled_bool": false, + "IsConnected_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IsEnabled_bool` | `boolean` | Whether VPN Azure Function is Enabled +`IsConnected_bool` | `boolean` | Whether connection to VPN Azure Cloud Server is established + +*** + +## "SetAzureStatus" RPC API - Enable / Disable VPN Azure Function +### Description +Enable / Disable VPN Azure Function. Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetAzureStatus", + "params": { + "IsEnabled_bool": false + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "IsEnabled_bool": false, + "IsConnected_bool": false + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`IsEnabled_bool` | `boolean` | Whether VPN Azure Function is Enabled +`IsConnected_bool` | `boolean` | Whether connection to VPN Azure Cloud Server is established + +*** + +## "GetDDnsInternetSettng" RPC API - Get the Proxy Settings for Connecting to the DDNS server +### Description +Get the Proxy Settings for Connecting to the DDNS server. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "GetDDnsInternetSettng", + "params": {} +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ProxyType_u32": 0, + "ProxyHostName_str": "proxyhostname", + "ProxyPort_u32": 0, + "ProxyUsername_str": "proxyusername", + "ProxyPassword_str": "proxypassword" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ProxyType_u32` | `number` (enum) | Type of proxy server
Values:
`0`: Direct TCP connection
`1`: Connection via HTTP proxy server
`2`: Connection via SOCKS proxy server +`ProxyHostName_str` | `string` (ASCII) | Proxy server host name +`ProxyPort_u32` | `number` (uint32) | Proxy server port number +`ProxyUsername_str` | `string` (ASCII) | Proxy server user name +`ProxyPassword_str` | `string` (ASCII) | Proxy server password + +*** + +## "SetDDnsInternetSettng" RPC API - Set the Proxy Settings for Connecting to the DDNS server +### Description +Set the Proxy Settings for Connecting to the DDNS server. + +### Input JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "method": "SetDDnsInternetSettng", + "params": { + "ProxyType_u32": 0, + "ProxyHostName_str": "proxyhostname", + "ProxyPort_u32": 0, + "ProxyUsername_str": "proxyusername", + "ProxyPassword_str": "proxypassword" + } +} +``` + +### Output JSON-RPC Format +```json +{ + "jsonrpc": "2.0", + "id": "rpc_call_id", + "result": { + "ProxyType_u32": 0, + "ProxyHostName_str": "proxyhostname", + "ProxyPort_u32": 0, + "ProxyUsername_str": "proxyusername", + "ProxyPassword_str": "proxypassword" + } +} +``` + +### Parameters + +Name | Type | Description +--- | --- | --- +`ProxyType_u32` | `number` (enum) | Type of proxy server
Values:
`0`: Direct TCP connection
`1`: Connection via HTTP proxy server
`2`: Connection via SOCKS proxy server +`ProxyHostName_str` | `string` (ASCII) | Proxy server host name +`ProxyPort_u32` | `number` (uint32) | Proxy server port number +`ProxyUsername_str` | `string` (ASCII) | Proxy server user name +`ProxyPassword_str` | `string` (ASCII) | Proxy server password + +*** +Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen. +Copyright (c) 2014-2019 [SoftEther VPN Project](https://www.softether.org/) under the Apache License 2.0. + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/JsonRpc.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/JsonRpc.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/JsonRpc.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/JsonRpc.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,282 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// JsonRpc.cs - JSON-RPC Client Utility Functions +// +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + +using System; +using System.IO; +using System.Net.Security; +using System.Net.Http; +using System.Collections.Generic; +using System.Text; +using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace SoftEther.JsonRpc +{ + /// + /// Internal utility class + /// + static class ClientUtil + { + public const int DefaultMaxDepth = 8; + + public static string NonNull(this string s) { if (s == null) return ""; else return s; } + public static bool IsEmpty(this string str) + { + if (str == null || str.Trim().Length == 0) + return true; + else + return false; + } + public static bool IsFilled(this string str) => !IsEmpty(str); + + public static string ObjectToJson(this object obj, bool include_null = false, bool escape_html = false, int? max_depth = ClientUtil.DefaultMaxDepth, bool compact = false, bool reference_handling = false) => ClientUtil.Serialize(obj, include_null, escape_html, max_depth, compact, reference_handling); + public static T JsonToObject(this string str, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) => ClientUtil.Deserialize(str, include_null, max_depth); + public static object JsonToObject(this string str, Type type, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) => ClientUtil.Deserialize(str, type, include_null, max_depth); + + public static string Serialize(object obj, bool include_null = false, bool escape_html = false, int? max_depth = ClientUtil.DefaultMaxDepth, bool compact = false, bool reference_handling = false) + { + JsonSerializerSettings setting = new JsonSerializerSettings() + { + MaxDepth = max_depth, + NullValueHandling = include_null ? NullValueHandling.Include : NullValueHandling.Ignore, + ReferenceLoopHandling = ReferenceLoopHandling.Error, + PreserveReferencesHandling = reference_handling ? PreserveReferencesHandling.All : PreserveReferencesHandling.None, + StringEscapeHandling = escape_html ? StringEscapeHandling.EscapeHtml : StringEscapeHandling.Default, + }; + return JsonConvert.SerializeObject(obj, compact ? Formatting.None : Formatting.Indented, setting); + } + + public static T Deserialize(string str, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) + => (T)Deserialize(str, typeof(T), include_null, max_depth); + + public static object Deserialize(string str, Type type, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) + { + JsonSerializerSettings setting = new JsonSerializerSettings() + { + MaxDepth = max_depth, + NullValueHandling = include_null ? NullValueHandling.Include : NullValueHandling.Ignore, + ObjectCreationHandling = ObjectCreationHandling.Replace, + ReferenceLoopHandling = ReferenceLoopHandling.Error, + }; + return JsonConvert.DeserializeObject(str, type, setting); + } + + public static void Print(this object o) + { + string str = o.ObjectToJson(); + + if (o is string) str = (string)o; + + Console.WriteLine(str); + } + } + + /// + /// JSON-RPC exception class + /// + class JsonRpcException : Exception + { + public JsonRpcError RpcError { get; } + public JsonRpcException(JsonRpcError err) + : base($"Code={err.Code}, Message={err.Message.NonNull()}" + + (err == null || err.Data == null ? "" : $", Data={err.Data.ObjectToJson(compact: true)}")) + { + this.RpcError = err; + } + } + + /// + /// JSON-RPC request class. See https://www.jsonrpc.org/specification + /// + class JsonRpcRequest + { + [JsonProperty("jsonrpc", Order = 1)] + public string Version { get; set; } = "2.0"; + + [JsonProperty("id", Order = 2)] + public string Id { get; set; } = null; + + [JsonProperty("method", Order = 3)] + public string Method { get; set; } = ""; + + [JsonProperty("params", Order = 4)] + public object Params { get; set; } = null; + + public JsonRpcRequest() { } + + public JsonRpcRequest(string method, object param, string id) + { + this.Method = method; + this.Params = param; + this.Id = id; + } + } + + /// + /// JSON-RPC response class with generics + /// + /// + class JsonRpcResponse + { + [JsonProperty("jsonrpc", Order = 1)] + public virtual string Version { get; set; } = "2.0"; + + [JsonProperty("id", NullValueHandling = NullValueHandling.Include, Order = 2)] + public virtual string Id { get; set; } = null; + + [JsonProperty("result", Order = 3)] + public virtual TResult Result { get; set; } = default(TResult); + + [JsonProperty("error", Order = 4)] + public virtual JsonRpcError Error { get; set; } = null; + + [JsonIgnore] + public virtual bool IsError => this.Error != null; + + [JsonIgnore] + public virtual bool IsOk => !IsError; + + public virtual void ThrowIfError() + { + if (this.IsError) throw new JsonRpcException(this.Error); + } + + public override string ToString() + { + return this.ObjectToJson(compact: true); + } + } + + /// + /// JSON-RPC error class. See https://www.jsonrpc.org/specification + /// + class JsonRpcError + { + public JsonRpcError() { } + public JsonRpcError(int code, string message, object data = null) + { + this.Code = code; + this.Message = message.NonNull(); + if (this.Message.IsEmpty()) this.Message = $"JSON-RPC Error {code}"; + this.Data = data; + } + + [JsonProperty("code")] + public int Code { get; set; } = 0; + + [JsonProperty("message")] + public string Message { get; set; } = null; + + [JsonProperty("data")] + public object Data { get; set; } = null; + } + + /// + /// JSON-RPC client. See https://www.jsonrpc.org/specification + /// + class JsonRpcClient + { + HttpClientHandler client_handler; + HttpClient client; + public const int DefaultTimeoutMsecs = 60 * 1000; + public int TimeoutMsecs { get => (int)client.Timeout.TotalMilliseconds; set => client.Timeout = new TimeSpan(0, 0, 0, 0, value); } + public Dictionary HttpHeaders { get; } = new Dictionary(); + + string base_url; + + /// + /// JSON-RPC client class constructor + /// + /// The URL + /// The SSL certificate validation callback + public JsonRpcClient(string url, Func cert_check_proc = null) + { + if (cert_check_proc == null) cert_check_proc = (message, cert, chain, errors) => true; + client_handler = new HttpClientHandler(); + + this.client_handler.AllowAutoRedirect = true; + this.client_handler.MaxAutomaticRedirections = 10; + + client_handler.ServerCertificateCustomValidationCallback = cert_check_proc; + + client = new HttpClient(client_handler, true); + //Console.WriteLine("new HttpClient(client_handler, true);"); + + this.base_url = url; + + this.TimeoutMsecs = DefaultTimeoutMsecs; + } + + /// + /// Call a single RPC call (without error check). You can wait for the response with Task or await statement. + /// + /// The name of RPC method + /// The parameters + public async Task CallInternalAsync(string method_name, object param) + { + string id = DateTime.Now.Ticks.ToString(); + + JsonRpcRequest req = new JsonRpcRequest(method_name, param, id); + + string req_string = req.ObjectToJson(); + + //Console.WriteLine($"req: {req_string}"); + + HttpContent content = new StringContent(req_string, Encoding.UTF8, "application/json"); + + foreach (string key in this.HttpHeaders.Keys) + { + string value = this.HttpHeaders[key]; + + content.Headers.Add(key, value); + } + + HttpResponseMessage response = await this.client.PostAsync(base_url, content); + + Stream responseStream = await response.Content.ReadAsStreamAsync(); + + if (!response.IsSuccessStatusCode) + { + using (StreamReader streamReader = new StreamReader(responseStream)) + { + throw new Exception($"Error: {response.StatusCode}: {await streamReader.ReadToEndAsync()}"); + } + } + + string ret_string; + + using (StreamReader streamReader = new StreamReader(responseStream)) + { + ret_string = await streamReader.ReadToEndAsync(); + } + + //Console.WriteLine($"ret: {ret_string}"); + + return ret_string; + } + + /// + /// Call a single RPC call (with error check). You can wait for the response with Promise or await statement. In the case of error, it will be thrown. + /// + /// The name of RPC method + /// The parameters + public async Task CallAsync(string method_name, object param) + { + string ret_string = await CallInternalAsync(method_name, param); + + JsonRpcResponse ret = ret_string.JsonToObject>(); + + ret.ThrowIfError(); + + return ret.Result; + } + } +} + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/VPNServerRpc.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/VPNServerRpc.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/VPNServerRpc.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/VPNServerRpc.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,1399 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// VPNServerRpc.cs - SoftEther VPN Server's JSON-RPC Stubs +// +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + +using System.Threading.Tasks; +using SoftEther.JsonRpc; + +namespace SoftEther.VPNServerRpc +{ + /// + /// VPN Server RPC Stubs + /// + public class VpnServerRpc + { + JsonRpcClient rpc_client; + + /// + /// Constructor of the VpnServerRpc class + /// + /// The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + /// The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + /// Specify the administration password. This value is valid only if vpnserver_hostname is sepcified. + /// The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. + public VpnServerRpc(string vpnserver_host, int vpnserver_port, string admin_password, string hub_name = null) + { + rpc_client = new JsonRpcClient($"https://{vpnserver_host}:{vpnserver_port}/api/", null); + + rpc_client.HttpHeaders.Add("X-VPNADMIN-HUBNAME", string.IsNullOrEmpty(hub_name) ? "" : hub_name); + rpc_client.HttpHeaders.Add("X-VPNADMIN-PASSWORD", admin_password); + } + + /// + /// Call a RPC procedure + /// + public async Task CallAsync(string method_name, T request) + { + T response = await rpc_client.CallAsync(method_name, request); + + return response; + } + + /// + /// Test RPC function (Async mode). Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. + /// + public async Task TestAsync(VpnRpcTest t) => await CallAsync("Test", t); + + /// + /// Test RPC function (Sync mode). Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. + /// + public VpnRpcTest Test(VpnRpcTest t) => TestAsync(t).Result; + + /// + /// Get server information (Async mode). This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. + /// + public async Task GetServerInfoAsync() => await CallAsync("GetServerInfo", new VpnRpcServerInfo()); + + /// + /// Get server information (Sync mode). This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. + /// + public VpnRpcServerInfo GetServerInfo() => GetServerInfoAsync().Result; + + /// + /// Get Current Server Status (Async mode). This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. + /// + public async Task GetServerStatusAsync() => await CallAsync("GetServerStatus", new VpnRpcServerStatus()); + + /// + /// Get Current Server Status (Sync mode). This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. + /// + public VpnRpcServerStatus GetServerStatus() => GetServerStatusAsync().Result; + + /// + /// Create New TCP Listener (Async mode). This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. + /// + public async Task CreateListenerAsync(VpnRpcListener t) => await CallAsync("CreateListener", t); + + /// + /// Create New TCP Listener (Sync mode). This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. + /// + public VpnRpcListener CreateListener(VpnRpcListener t) => CreateListenerAsync(t).Result; + + /// + /// Get List of TCP Listeners (Async mode). This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. + /// + public async Task EnumListenerAsync() => await CallAsync("EnumListener", new VpnRpcListenerList()); + + /// + /// Get List of TCP Listeners (Async mode). This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcListenerList EnumListener() => EnumListenerAsync().Result; + + /// + /// Delete TCP Listener (Async mode). This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task DeleteListenerAsync(VpnRpcListener t) => await CallAsync("DeleteListener", t); + + /// + /// Delete TCP Listener (Async mode). This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcListener DeleteListener(VpnRpcListener t) => DeleteListenerAsync(t).Result; + + /// + /// Enable / Disable TCP Listener (Async mode). This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task EnableListenerAsync(VpnRpcListener t) => await CallAsync("EnableListener", t); + + /// + /// Enable / Disable TCP Listener (Async mode). This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcListener EnableListener(VpnRpcListener t) => EnableListenerAsync(t).Result; + + /// + /// Set VPN Server Administrator Password (Async mode). This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. + /// + public async Task SetServerPasswordAsync(VpnRpcSetPassword t) => await CallAsync("SetServerPassword", t); + + /// + /// Set VPN Server Administrator Password (Async mode). This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcSetPassword SetServerPassword(VpnRpcSetPassword t) => SetServerPasswordAsync(t).Result; + + /// + /// Set the VPN Server clustering configuration (Async mode). Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. + /// + public async Task SetFarmSettingAsync(VpnRpcFarm t) => await CallAsync("SetFarmSetting", t); + + /// + /// Set the VPN Server clustering configuration (Async mode). Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. + /// + public VpnRpcFarm SetFarmSetting(VpnRpcFarm t) => SetFarmSettingAsync(t).Result; + + /// + /// Get Clustering Configuration of Current VPN Server (Async mode). You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. + /// + public async Task GetFarmSettingAsync() => await CallAsync("GetFarmSetting", new VpnRpcFarm()); + + /// + /// Get Clustering Configuration of Current VPN Server (Async mode). You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcFarm GetFarmSetting() => GetFarmSettingAsync().Result; + + /// + /// Get Cluster Member Information (Async mode). When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. + /// + public async Task GetFarmInfoAsync(VpnRpcFarmInfo t) => await CallAsync("GetFarmInfo", t); + + /// + /// Get Cluster Member Information (Async mode). When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcFarmInfo GetFarmInfo(VpnRpcFarmInfo t) => GetFarmInfoAsync(t).Result; + + /// + /// Get List of Cluster Members (Async mode). Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. + /// + public async Task EnumFarmMemberAsync() => await CallAsync("EnumFarmMember", new VpnRpcEnumFarm()); + + /// + /// Get List of Cluster Members (Async mode). Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcEnumFarm EnumFarmMember() => EnumFarmMemberAsync().Result; + + /// + /// Get Connection Status to Cluster Controller (Async mode). Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. + /// + public async Task GetFarmConnectionStatusAsync() => await CallAsync("GetFarmConnectionStatus", new VpnRpcFarmConnectionStatus()); + + /// + /// Get Connection Status to Cluster Controller (Sync mode). Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcFarmConnectionStatus GetFarmConnectionStatus() => GetFarmConnectionStatusAsync().Result; + + /// + /// Set SSL Certificate and Private Key of VPN Server (Async mode). You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. + /// + public async Task SetServerCertAsync(VpnRpcKeyPair t) => await CallAsync("SetServerCert", t); + + /// + /// Set SSL Certificate and Private Key of VPN Server (Sync mode). You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcKeyPair SetServerCert(VpnRpcKeyPair t) => SetServerCertAsync(t).Result; + + /// + /// Get SSL Certificate and Private Key of VPN Server (Async mode). Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. + /// + public async Task GetServerCertAsync() => await CallAsync("GetServerCert", new VpnRpcKeyPair()); + + /// + /// Get SSL Certificate and Private Key of VPN Server (Async mode). Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcKeyPair GetServerCert() => GetServerCertAsync().Result; + + /// + /// Get the Encrypted Algorithm Used for VPN Communication (Async mode). Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. + /// + public async Task GetServerCipherAsync() => await CallAsync("GetServerCipher", new VpnRpcStr()); + + /// + /// Get the Encrypted Algorithm Used for VPN Communication (Async mode). Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. + /// + public VpnRpcStr GetServerCipher() => GetServerCipherAsync().Result; + + /// + /// Set the Encrypted Algorithm Used for VPN Communication (Async mode). Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. + /// + public async Task SetServerCipherAsync(VpnRpcStr t) => await CallAsync("SetServerCipher", t); + + /// + /// Set the Encrypted Algorithm Used for VPN Communication (Async mode). Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcStr SetServerCipher(VpnRpcStr t) => SetServerCipherAsync(t).Result; + + /// + /// Create New Virtual Hub (Async mode). Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + /// + public async Task CreateHubAsync(VpnRpcCreateHub input_param) => await CallAsync("CreateHub", input_param); + + /// + /// Create New Virtual Hub (Async mode). Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + /// + public VpnRpcCreateHub CreateHub(VpnRpcCreateHub input_param) => CreateHubAsync(input_param).Result; + + /// + /// Set the Virtual Hub configuration (Async mode). You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. + /// + public async Task SetHubAsync(VpnRpcCreateHub input_param) => await CallAsync("SetHub", input_param); + + /// + /// Set the Virtual Hub configuration (Async mode). You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. + /// + public VpnRpcCreateHub SetHub(VpnRpcCreateHub input_param) => SetHubAsync(input_param).Result; + + /// + /// Get the Virtual Hub configuration (Async mode). You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. + /// + public async Task GetHubAsync(VpnRpcCreateHub input_param) => await CallAsync("GetHub", input_param); + + /// + /// Get the Virtual Hub configuration (Async mode). You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. + /// + public VpnRpcCreateHub GetHub(VpnRpcCreateHub input_param) => GetHubAsync(input_param).Result; + + /// + /// Get List of Virtual Hubs (Async mode). Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. + /// + public async Task EnumHubAsync() => await CallAsync("EnumHub", new VpnRpcEnumHub()); + + /// + /// Get List of Virtual Hubs (Async mode). Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. + /// + public VpnRpcEnumHub EnumHub() => EnumHubAsync().Result; + + /// + /// Delete Virtual Hub (Async mode). Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + /// + public async Task DeleteHubAsync(VpnRpcDeleteHub input_param) => await CallAsync("DeleteHub", input_param); + + /// + /// Delete Virtual Hub (Async mode). Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + /// + public VpnRpcDeleteHub DeleteHub(VpnRpcDeleteHub input_param) => DeleteHubAsync(input_param).Result; + + /// + /// Get Setting of RADIUS Server Used for User Authentication (Async mode). Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetHubRadiusAsync(VpnRpcRadius input_param) => await CallAsync("GetHubRadius", input_param); + + /// + /// Get Setting of RADIUS Server Used for User Authentication (Async mode). Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcRadius GetHubRadius(VpnRpcRadius input_param) => GetHubRadiusAsync(input_param).Result; + + /// + /// Set RADIUS Server to use for User Authentication (Async mode). To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetHubRadiusAsync(VpnRpcRadius input_param) => await CallAsync("SetHubRadius", input_param); + + /// + /// Set RADIUS Server to use for User Authentication (Async mode). To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcRadius SetHubRadius(VpnRpcRadius input_param) => SetHubRadiusAsync(input_param).Result; + + /// + /// Get List of TCP Connections Connecting to the VPN Server (Async mode). Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. + /// + public async Task EnumConnectionAsync() => await CallAsync("EnumConnection", new VpnRpcEnumConnection()); + + /// + /// Get List of TCP Connections Connecting to the VPN Server (Async mode). Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcEnumConnection EnumConnection() => EnumConnectionAsync().Result; + + /// + /// Disconnect TCP Connections Connecting to the VPN Server (Async mode). Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. + /// + public async Task DisconnectConnectionAsync(VpnRpcDisconnectConnection input_param) => await CallAsync("DisconnectConnection", input_param); + + /// + /// Disconnect TCP Connections Connecting to the VPN Server (Async mode). Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcDisconnectConnection DisconnectConnection(VpnRpcDisconnectConnection input_param) => DisconnectConnectionAsync(input_param).Result; + + /// + /// Get Information of TCP Connections Connecting to the VPN Server (Async mode). Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. + /// + public async Task GetConnectionInfoAsync(VpnRpcConnectionInfo input_param) => await CallAsync("GetConnectionInfo", input_param); + + /// + /// Get Information of TCP Connections Connecting to the VPN Server (Async mode). Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcConnectionInfo GetConnectionInfo(VpnRpcConnectionInfo input_param) => GetConnectionInfoAsync(input_param).Result; + + /// + /// Switch Virtual Hub to Online or Offline (Async mode). Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetHubOnlineAsync(VpnRpcSetHubOnline input_param) => await CallAsync("SetHubOnline", input_param); + + /// + /// Switch Virtual Hub to Online or Offline (Async mode). Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcSetHubOnline SetHubOnline(VpnRpcSetHubOnline input_param) => SetHubOnlineAsync(input_param).Result; + + /// + /// Get Current Status of Virtual Hub (Async mode). Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. + /// + public async Task GetHubStatusAsync(VpnRpcHubStatus input_param) => await CallAsync("GetHubStatus", input_param); + + /// + /// Get Current Status of Virtual Hub (Async mode). Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. + /// + public VpnRpcHubStatus GetHubStatus(VpnRpcHubStatus input_param) => GetHubStatusAsync(input_param).Result; + + /// + /// Set the logging configuration of the Virtual Hub (Async mode). Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. + /// + public async Task SetHubLogAsync(VpnRpcHubLog input_param) => await CallAsync("SetHubLog", input_param); + + /// + /// Set the logging configuration of the Virtual Hub (Async mode). Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. + /// + public VpnRpcHubLog SetHubLog(VpnRpcHubLog input_param) => SetHubLogAsync(input_param).Result; + + /// + /// Get the logging configuration of the Virtual Hub (Async mode). Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. + /// + public async Task GetHubLogAsync(VpnRpcHubLog input_param) => await CallAsync("GetHubLog", input_param); + + /// + /// Get the logging configuration of the Virtual Hub (Async mode). Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. + /// + public VpnRpcHubLog GetHubLog(VpnRpcHubLog input_param) => GetHubLogAsync(input_param).Result; + + /// + /// Add Trusted CA Certificate (Async mode). Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task AddCaAsync(VpnRpcHubAddCA input_param) => await CallAsync("AddCa", input_param); + + /// + /// Add Trusted CA Certificate (Async mode). Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcHubAddCA AddCa(VpnRpcHubAddCA input_param) => AddCaAsync(input_param).Result; + + /// + /// Get List of Trusted CA Certificates (Async mode). Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task EnumCaAsync(VpnRpcHubEnumCA input_param) => await CallAsync("EnumCa", input_param); + + /// + /// Get List of Trusted CA Certificates (Async mode). Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcHubEnumCA EnumCa(VpnRpcHubEnumCA input_param) => EnumCaAsync(input_param).Result; + + /// + /// Get Trusted CA Certificate (Async mode). Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task GetCaAsync(VpnRpcHubGetCA input_param) => await CallAsync("GetCa", input_param); + + /// + /// Get Trusted CA Certificate (Async mode). Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcHubGetCA GetCa(VpnRpcHubGetCA input_param) => GetCaAsync(input_param).Result; + + /// + /// Delete Trusted CA Certificate (Async mode). Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task DeleteCaAsync(VpnRpcHubDeleteCA input_param) => await CallAsync("DeleteCa", input_param); + + /// + /// Delete Trusted CA Certificate (Async mode). Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcHubDeleteCA DeleteCa(VpnRpcHubDeleteCA input_param) => DeleteCaAsync(input_param).Result; + + /// + /// Create New Cascade Connection (Async mode). Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task CreateLinkAsync(VpnRpcCreateLink input_param) => await CallAsync("CreateLink", input_param); + + /// + /// Create New Cascade Connection (Async mode). Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCreateLink CreateLink(VpnRpcCreateLink input_param) => CreateLinkAsync(input_param).Result; + + /// + /// Get the Cascade Connection Setting (Async mode). Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetLinkAsync(VpnRpcCreateLink input_param) => await CallAsync("GetLink", input_param); + + /// + /// Get the Cascade Connection Setting (Async mode). Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCreateLink GetLink(VpnRpcCreateLink input_param) => GetLinkAsync(input_param).Result; + + /// + /// Change Existing Cascade Connection (Async mode). Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. + /// + public async Task SetLinkAsync(VpnRpcCreateLink input_param) => await CallAsync("SetLink", input_param); + + /// + /// Change Existing Cascade Connection (Async mode). Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. + /// + public VpnRpcCreateLink SetLink(VpnRpcCreateLink input_param) => SetLinkAsync(input_param).Result; + + /// + /// Get List of Cascade Connections (Async mode). Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumLinkAsync(VpnRpcEnumLink input_param) => await CallAsync("EnumLink", input_param); + + /// + /// Get List of Cascade Connections (Async mode). Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumLink EnumLink(VpnRpcEnumLink input_param) => EnumLinkAsync(input_param).Result; + + /// + /// Switch Cascade Connection to Online Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetLinkOnlineAsync(VpnRpcLink input_param) => await CallAsync("SetLinkOnline", input_param); + + /// + /// Switch Cascade Connection to Online Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcLink SetLinkOnline(VpnRpcLink input_param) => SetLinkOnlineAsync(input_param).Result; + + /// + /// Switch Cascade Connection to Offline Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetLinkOfflineAsync(VpnRpcLink input_param) => await CallAsync("SetLinkOffline", input_param); + + /// + /// Switch Cascade Connection to Offline Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcLink SetLinkOffline(VpnRpcLink input_param) => SetLinkOfflineAsync(input_param).Result; + + /// + /// Delete Cascade Connection Setting (Async mode). Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task DeleteLinkAsync(VpnRpcLink input_param) => await CallAsync("DeleteLink", input_param); + + /// + /// Delete Cascade Connection Setting (Async mode). Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcLink DeleteLink(VpnRpcLink input_param) => DeleteLinkAsync(input_param).Result; + + /// + /// Change Name of Cascade Connection (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task RenameLinkAsync(VpnRpcRenameLink input_param) => await CallAsync("RenameLink", input_param); + + /// + /// Change Name of Cascade Connection (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcRenameLink RenameLink(VpnRpcRenameLink input_param) => RenameLinkAsync(input_param).Result; + + /// + /// Get Current Cascade Connection Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetLinkStatusAsync(VpnRpcLinkStatus input_param) => await CallAsync("GetLinkStatus", input_param); + + /// + /// Get Current Cascade Connection Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcLinkStatus GetLinkStatus(VpnRpcLinkStatus input_param) => GetLinkStatusAsync(input_param).Result; + + /// + /// Add Access List Rule (Async mode). Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task AddAccessAsync(VpnRpcAddAccess input_param) => await CallAsync("AddAccess", input_param); + + /// + /// Add Access List Rule (Async mode). Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcAddAccess AddAccess(VpnRpcAddAccess input_param) => AddAccessAsync(input_param).Result; + + /// + /// Delete Rule from Access List (Async mode). Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task DeleteAccessAsync(VpnRpcDeleteAccess input_param) => await CallAsync("DeleteAccess", input_param); + + /// + /// Delete Rule from Access List (Async mode). Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcDeleteAccess DeleteAccess(VpnRpcDeleteAccess input_param) => DeleteAccessAsync(input_param).Result; + + /// + /// Get Access List Rule List (Async mode). Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task EnumAccessAsync(VpnRpcEnumAccessList input_param) => await CallAsync("EnumAccess", input_param); + + /// + /// Get Access List Rule List (Async mode). Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcEnumAccessList EnumAccess(VpnRpcEnumAccessList input_param) => EnumAccessAsync(input_param).Result; + + /// + /// Replace all access lists on a single bulk API call (Async mode). This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. + /// + public async Task SetAccessListAsync(VpnRpcEnumAccessList input_param) => await CallAsync("SetAccessList", input_param); + + /// + /// Replace all access lists on a single bulk API call (Async mode). This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. + /// + public VpnRpcEnumAccessList SetAccessList(VpnRpcEnumAccessList input_param) => SetAccessListAsync(input_param).Result; + + /// + /// Create a user (Async mode). Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task CreateUserAsync(VpnRpcSetUser input_param) => await CallAsync("CreateUser", input_param); + + /// + /// Create a user (Async mode). Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetUser CreateUser(VpnRpcSetUser input_param) => CreateUserAsync(input_param).Result; + + /// + /// Change User Settings (Async mode). Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task SetUserAsync(VpnRpcSetUser input_param) => await CallAsync("SetUser", input_param); + + /// + /// Change User Settings (Async mode). Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetUser SetUser(VpnRpcSetUser input_param) => SetUserAsync(input_param).Result; + + /// + /// Get User Settings (Async mode). Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task GetUserAsync(VpnRpcSetUser input_param) => await CallAsync("GetUser", input_param); + + /// + /// Get User Settings (Async mode). Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetUser GetUser(VpnRpcSetUser input_param) => GetUserAsync(input_param).Result; + + /// + /// Delete a user (Async mode). Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task DeleteUserAsync(VpnRpcDeleteUser input_param) => await CallAsync("DeleteUser", input_param); + + /// + /// Delete a user (Sync mode). Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcDeleteUser DeleteUser(VpnRpcDeleteUser input_param) => DeleteUserAsync(input_param).Result; + + /// + /// Get List of Users (Async mode). Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task EnumUserAsync(VpnRpcEnumUser input_param) => await CallAsync("EnumUser", input_param); + + /// + /// Get List of Users (Async mode). Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcEnumUser EnumUser(VpnRpcEnumUser input_param) => EnumUserAsync(input_param).Result; + + /// + /// Create Group (Async mode). Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task CreateGroupAsync(VpnRpcSetGroup input_param) => await CallAsync("CreateGroup", input_param); + + /// + /// Create Group (Async mode). Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetGroup CreateGroup(VpnRpcSetGroup input_param) => CreateGroupAsync(input_param).Result; + + /// + /// Set group settings (Async mode). Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task SetGroupAsync(VpnRpcSetGroup input_param) => await CallAsync("SetGroup", input_param); + + /// + /// Set group settings (Async mode). Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetGroup SetGroup(VpnRpcSetGroup input_param) => SetGroupAsync(input_param).Result; + + /// + /// Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task GetGroupAsync(VpnRpcSetGroup input_param) => await CallAsync("GetGroup", input_param); + + /// + /// Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetGroup GetGroup(VpnRpcSetGroup input_param) => GetGroupAsync(input_param).Result; + + /// + /// Delete User from Group (Async mode). Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task DeleteGroupAsync(VpnRpcDeleteUser input_param) => await CallAsync("DeleteGroup", input_param); + + /// + /// Delete User from Group (Async mode). Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcDeleteUser DeleteGroup(VpnRpcDeleteUser input_param) => DeleteGroupAsync(input_param).Result; + + /// + /// Get List of Groups (Async mode). Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task EnumGroupAsync(VpnRpcEnumGroup input_param) => await CallAsync("EnumGroup", input_param); + + /// + /// Get List of Groups (Async mode). Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcEnumGroup EnumGroup(VpnRpcEnumGroup input_param) => EnumGroupAsync(input_param).Result; + + /// + /// Get List of Connected VPN Sessions (Async mode). Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. + /// + public async Task EnumSessionAsync(VpnRpcEnumSession input_param) => await CallAsync("EnumSession", input_param); + + /// + /// Get List of Connected VPN Sessions (Async mode). Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. + /// + public VpnRpcEnumSession EnumSession(VpnRpcEnumSession input_param) => EnumSessionAsync(input_param).Result; + + /// + /// Get Session Status (Async mode). Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. + /// + public async Task GetSessionStatusAsync(VpnRpcSessionStatus input_param) => await CallAsync("GetSessionStatus", input_param); + + /// + /// Get Session Status (Async mode). Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. + /// + public VpnRpcSessionStatus GetSessionStatus(VpnRpcSessionStatus input_param) => GetSessionStatusAsync(input_param).Result; + + /// + /// Disconnect Session (Async mode). Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. + /// + public async Task DeleteSessionAsync(VpnRpcDeleteSession input_param) => await CallAsync("DeleteSession", input_param); + + /// + /// Disconnect Session (Async mode). Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. + /// + public VpnRpcDeleteSession DeleteSession(VpnRpcDeleteSession input_param) => DeleteSessionAsync(input_param).Result; + + /// + /// Get the MAC Address Table Database (Async mode). Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. + /// + public async Task EnumMacTableAsync(VpnRpcEnumMacTable input_param) => await CallAsync("EnumMacTable", input_param); + + /// + /// Get the MAC Address Table Database (Async mode). Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. + /// + public VpnRpcEnumMacTable EnumMacTable(VpnRpcEnumMacTable input_param) => EnumMacTableAsync(input_param).Result; + + /// + /// Delete MAC Address Table Entry (Async mode). Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. + /// + public async Task DeleteMacTableAsync(VpnRpcDeleteTable input_param) => await CallAsync("DeleteMacTable", input_param); + + /// + /// Delete MAC Address Table Entry (Async mode). Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. + /// + public VpnRpcDeleteTable DeleteMacTable(VpnRpcDeleteTable input_param) => DeleteMacTableAsync(input_param).Result; + + /// + /// Get the IP Address Table Database (Async mode). Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. + /// + public async Task EnumIpTableAsync(VpnRpcEnumIpTable input_param) => await CallAsync("EnumIpTable", input_param); + + /// + /// Get the IP Address Table Database (Async mode). Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. + /// + public VpnRpcEnumIpTable EnumIpTable(VpnRpcEnumIpTable input_param) => EnumIpTableAsync(input_param).Result; + + /// + /// Delete IP Address Table Entry (Async mode). Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. + /// + public async Task DeleteIpTableAsync(VpnRpcDeleteTable input_param) => await CallAsync("DeleteIpTable", input_param); + + /// + /// Delete IP Address Table Entry (Async mode). Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. + /// + public VpnRpcDeleteTable DeleteIpTable(VpnRpcDeleteTable input_param) => DeleteIpTableAsync(input_param).Result; + + /// + /// Set the Keep Alive Internet Connection Function (Async mode). Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. + /// + public async Task SetKeepAsync(VpnRpcKeep input_param) => await CallAsync("SetKeep", input_param); + + /// + /// Set the Keep Alive Internet Connection Function (Async mode). Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. + /// + public VpnRpcKeep SetKeep(VpnRpcKeep input_param) => SetKeepAsync(input_param).Result; + + /// + /// Get the Keep Alive Internet Connection Function (Async mode). Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. + /// + public async Task GetKeepAsync(VpnRpcKeep input_param) => await CallAsync("GetKeep", input_param); + + /// + /// Get the Keep Alive Internet Connection Function (Async mode). Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. + /// + public VpnRpcKeep GetKeep(VpnRpcKeep input_param) => GetKeepAsync(input_param).Result; + + /// + /// Enable the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnableSecureNATAsync(VpnRpcHub input_param) => await CallAsync("EnableSecureNAT", input_param); + + /// + /// Enable the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcHub EnableSecureNAT(VpnRpcHub input_param) => EnableSecureNATAsync(input_param).Result; + + /// + /// Disable the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task DisableSecureNATAsync(VpnRpcHub input_param) => await CallAsync("DisableSecureNAT", input_param); + + /// + /// Disable the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcHub DisableSecureNAT(VpnRpcHub input_param) => DisableSecureNATAsync(input_param).Result; + + /// + /// Change Settings of SecureNAT Function (Async mode). Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetSecureNATOptionAsync(VpnVhOption input_param) => await CallAsync("SetSecureNATOption", input_param); + + /// + /// Change Settings of SecureNAT Function (Async mode). Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnVhOption SetSecureNATOption(VpnVhOption input_param) => SetSecureNATOptionAsync(input_param).Result; + + /// + /// Get Settings of SecureNAT Function (Async mode). This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. + /// + public async Task GetSecureNATOptionAsync(VpnVhOption input_param) => await CallAsync("GetSecureNATOption", input_param); + + /// + /// Get Settings of SecureNAT Function (Async mode). This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. + /// + public VpnVhOption GetSecureNATOption(VpnVhOption input_param) => GetSecureNATOptionAsync(input_param).Result; + + /// + /// Get Virtual NAT Function Session Table of SecureNAT Function (Async mode). Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumNATAsync(VpnRpcEnumNat input_param) => await CallAsync("EnumNAT", input_param); + + /// + /// Get Virtual NAT Function Session Table of SecureNAT Function (Async mode). Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumNat EnumNAT(VpnRpcEnumNat input_param) => EnumNATAsync(input_param).Result; + + /// + /// Get Virtual DHCP Server Function Lease Table of SecureNAT Function (Async mode). Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumDHCPAsync(VpnRpcEnumDhcp input_param) => await CallAsync("EnumDHCP", input_param); + + /// + /// Get Virtual DHCP Server Function Lease Table of SecureNAT Function (Async mode). Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumDhcp EnumDHCP(VpnRpcEnumDhcp input_param) => EnumDHCPAsync(input_param).Result; + + /// + /// Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetSecureNATStatusAsync(VpnRpcNatStatus input_param) => await CallAsync("GetSecureNATStatus", input_param); + + /// + /// Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcNatStatus GetSecureNATStatus(VpnRpcNatStatus input_param) => GetSecureNATStatusAsync(input_param).Result; + + /// + /// Get List of Network Adapters Usable as Local Bridge (Async mode). Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task EnumEthernetAsync() => await CallAsync("EnumEthernet", new VpnRpcEnumEth()); + + /// + /// Get List of Network Adapters Usable as Local Bridge (Async mode). Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcEnumEth EnumEthernet() => EnumEthernetAsync().Result; + + /// + /// Create Local Bridge Connection (Async mode). Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. + /// + public async Task AddLocalBridgeAsync(VpnRpcLocalBridge input_param) => await CallAsync("AddLocalBridge", input_param); + + /// + /// Create Local Bridge Connection (Async mode). Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcLocalBridge AddLocalBridge(VpnRpcLocalBridge input_param) => AddLocalBridgeAsync(input_param).Result; + + /// + /// Delete Local Bridge Connection (Async mode). Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task DeleteLocalBridgeAsync(VpnRpcLocalBridge input_param) => await CallAsync("DeleteLocalBridge", input_param); + + /// + /// Delete Local Bridge Connection (Async mode). Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcLocalBridge DeleteLocalBridge(VpnRpcLocalBridge input_param) => DeleteLocalBridgeAsync(input_param).Result; + + /// + /// Get List of Local Bridge Connection (Async mode). Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. + /// + public async Task EnumLocalBridgeAsync() => await CallAsync("EnumLocalBridge", new VpnRpcEnumLocalBridge()); + + /// + /// Get List of Local Bridge Connection (Async mode). Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. + /// + public VpnRpcEnumLocalBridge EnumLocalBridge() => EnumLocalBridgeAsync().Result; + + /// + /// Get whether the localbridge function is supported on the current system (Async mode). + /// + public async Task GetBridgeSupportAsync() => await CallAsync("GetBridgeSupport", new VpnRpcBridgeSupport()); + + /// + /// Get whether the localbridge function is supported on the current system (Async mode). + /// + public VpnRpcBridgeSupport GetBridgeSupport() => GetBridgeSupportAsync().Result; + + /// + /// Reboot VPN Server Service (Async mode). Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. + /// + public async Task RebootServerAsync(VpnRpcTest input_param) => await CallAsync("RebootServer", input_param); + + /// + /// Reboot VPN Server Service (Async mode). Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcTest RebootServer(VpnRpcTest input_param) => RebootServerAsync(input_param).Result; + + /// + /// Get List of Server Functions / Capability (Async mode). Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. + /// + public async Task GetCapsAsync() => await CallAsync("GetCaps", new VpnCapslist()); + + /// + /// Get List of Server Functions / Capability (Async mode). Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. + /// + public VpnCapslist GetCaps() => GetCapsAsync().Result; + + /// + /// Get the current configuration of the VPN Server (Async mode). Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task GetConfigAsync() => await CallAsync("GetConfig", new VpnRpcConfig()); + + /// + /// Get the current configuration of the VPN Server (Async mode). Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcConfig GetConfig() => GetConfigAsync().Result; + + /// + /// Write Configuration File to VPN Server (Async mode). Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. + /// + public async Task SetConfigAsync(VpnRpcConfig input_param) => await CallAsync("SetConfig", input_param); + + /// + /// Write Configuration File to VPN Server (Async mode). Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcConfig SetConfig(VpnRpcConfig input_param) => SetConfigAsync(input_param).Result; + + /// + /// Get Virtual Hub Administration Option default values (Async mode). + /// + public async Task GetDefaultHubAdminOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("GetDefaultHubAdminOptions", input_param); + + /// + /// Get Virtual Hub Administration Option default values (Async mode). + /// + public VpnRpcAdminOption GetDefaultHubAdminOptions(VpnRpcAdminOption input_param) => GetDefaultHubAdminOptionsAsync(input_param).Result; + + /// + /// Get List of Virtual Hub Administration Options (Async mode). Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public async Task GetHubAdminOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("GetHubAdminOptions", input_param); + + /// + /// Get List of Virtual Hub Administration Options (Async mode). Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public VpnRpcAdminOption GetHubAdminOptions(VpnRpcAdminOption input_param) => GetHubAdminOptionsAsync(input_param).Result; + + /// + /// Set Values of Virtual Hub Administration Options (Async mode). Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public async Task SetHubAdminOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("SetHubAdminOptions", input_param); + + /// + /// Set Values of Virtual Hub Administration Options (Async mode). Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public VpnRpcAdminOption SetHubAdminOptions(VpnRpcAdminOption input_param) => SetHubAdminOptionsAsync(input_param).Result; + + /// + /// Get List of Virtual Hub Extended Options (Async mode). Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public async Task GetHubExtOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("GetHubExtOptions", input_param); + + /// + /// Get List of Virtual Hub Extended Options (Async mode). Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public VpnRpcAdminOption GetHubExtOptions(VpnRpcAdminOption input_param) => GetHubExtOptionsAsync(input_param).Result; + + /// + /// Set a Value of Virtual Hub Extended Options (Async mode). Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public async Task SetHubExtOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("SetHubExtOptions", input_param); + + /// + /// Set a Value of Virtual Hub Extended Options (Async mode). Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public VpnRpcAdminOption SetHubExtOptions(VpnRpcAdminOption input_param) => SetHubExtOptionsAsync(input_param).Result; + + /// + /// Define New Virtual Layer 3 Switch (Async mode). Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public async Task AddL3SwitchAsync(VpnRpcL3Sw input_param) => await CallAsync("AddL3Switch", input_param); + + /// + /// Define New Virtual Layer 3 Switch (Async mode). Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public VpnRpcL3Sw AddL3Switch(VpnRpcL3Sw input_param) => AddL3SwitchAsync(input_param).Result; + + /// + /// Delete Virtual Layer 3 Switch (Async mode). Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public async Task DelL3SwitchAsync(VpnRpcL3Sw input_param) => await CallAsync("DelL3Switch", input_param); + + /// + /// Delete Virtual Layer 3 Switch (Async mode). Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public VpnRpcL3Sw DelL3Switch(VpnRpcL3Sw input_param) => DelL3SwitchAsync(input_param).Result; + + /// + /// Get List of Virtual Layer 3 Switches (Async mode). Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public async Task EnumL3SwitchAsync() => await CallAsync("EnumL3Switch", new VpnRpcEnumL3Sw()); + + /// + /// Get List of Virtual Layer 3 Switches (Async mode). Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public VpnRpcEnumL3Sw EnumL3Switch() => EnumL3SwitchAsync().Result; + + /// + /// Start Virtual Layer 3 Switch Operation (Async mode). Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public async Task StartL3SwitchAsync(VpnRpcL3Sw input_param) => await CallAsync("StartL3Switch", input_param); + + /// + /// Start Virtual Layer 3 Switch Operation (Async mode). Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public VpnRpcL3Sw StartL3Switch(VpnRpcL3Sw input_param) => StartL3SwitchAsync(input_param).Result; + + /// + /// Stop Virtual Layer 3 Switch Operation (Async mode). Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task StopL3SwitchAsync(VpnRpcL3Sw input_param) => await CallAsync("StopL3Switch", input_param); + + /// + /// Stop Virtual Layer 3 Switch Operation (Async mode). Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcL3Sw StopL3Switch(VpnRpcL3Sw input_param) => StopL3SwitchAsync(input_param).Result; + + /// + /// Add Virtual Interface to Virtual Layer 3 Switch (Async mode). Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public async Task AddL3IfAsync(VpnRpcL3If input_param) => await CallAsync("AddL3If", input_param); + + /// + /// Add Virtual Interface to Virtual Layer 3 Switch (Async mode). Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public VpnRpcL3If AddL3If(VpnRpcL3If input_param) => AddL3IfAsync(input_param).Result; + + /// + /// Delete Virtual Interface of Virtual Layer 3 Switch (Async mode). Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public async Task DelL3IfAsync(VpnRpcL3If input_param) => await CallAsync("DelL3If", input_param); + + /// + /// Delete Virtual Interface of Virtual Layer 3 Switch (Async mode). Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public VpnRpcL3If DelL3If(VpnRpcL3If input_param) => DelL3IfAsync(input_param).Result; + + /// + /// Get List of Interfaces Registered on the Virtual Layer 3 Switch (Async mode). Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public async Task EnumL3IfAsync(VpnRpcEnumL3If input_param) => await CallAsync("EnumL3If", input_param); + + /// + /// Get List of Interfaces Registered on the Virtual Layer 3 Switch (Async mode). Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public VpnRpcEnumL3If EnumL3If(VpnRpcEnumL3If input_param) => EnumL3IfAsync(input_param).Result; + + /// + /// Add Routing Table Entry for Virtual Layer 3 Switch (Async mode). Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public async Task AddL3TableAsync(VpnRpcL3Table input_param) => await CallAsync("AddL3Table", input_param); + + /// + /// Add Routing Table Entry for Virtual Layer 3 Switch (Async mode). Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public VpnRpcL3Table AddL3Table(VpnRpcL3Table input_param) => AddL3TableAsync(input_param).Result; + + /// + /// Delete Routing Table Entry of Virtual Layer 3 Switch (Async mode). Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public async Task DelL3TableAsync(VpnRpcL3Table input_param) => await CallAsync("DelL3Table", input_param); + + /// + /// Delete Routing Table Entry of Virtual Layer 3 Switch (Async mode). Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public VpnRpcL3Table DelL3Table(VpnRpcL3Table input_param) => DelL3TableAsync(input_param).Result; + + /// + /// Get List of Routing Tables of Virtual Layer 3 Switch (Async mode). Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public async Task EnumL3TableAsync(VpnRpcEnumL3Table input_param) => await CallAsync("EnumL3Table", input_param); + + /// + /// Get List of Routing Tables of Virtual Layer 3 Switch (Async mode). Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public VpnRpcEnumL3Table EnumL3Table(VpnRpcEnumL3Table input_param) => EnumL3TableAsync(input_param).Result; + + /// + /// Get List of Certificates Revocation List (Async mode). Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumCrlAsync(VpnRpcEnumCrl input_param) => await CallAsync("EnumCrl", input_param); + + /// + /// Get List of Certificates Revocation List (Async mode). Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumCrl EnumCrl(VpnRpcEnumCrl input_param) => EnumCrlAsync(input_param).Result; + + /// + /// Add a Revoked Certificate (Async mode). Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task AddCrlAsync(VpnRpcCrl input_param) => await CallAsync("AddCrl", input_param); + + /// + /// Add a Revoked Certificate (Async mode). Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCrl AddCrl(VpnRpcCrl input_param) => AddCrlAsync(input_param).Result; + + /// + /// Delete a Revoked Certificate (Async mode). Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task DelCrlAsync(VpnRpcCrl input_param) => await CallAsync("DelCrl", input_param); + + /// + /// Delete a Revoked Certificate (Async mode). Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCrl DelCrl(VpnRpcCrl input_param) => DelCrlAsync(input_param).Result; + + /// + /// Get a Revoked Certificate (Async mode). Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetCrlAsync(VpnRpcCrl input_param) => await CallAsync("GetCrl", input_param); + + /// + /// Get a Revoked Certificate (Async mode). Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCrl GetCrl(VpnRpcCrl input_param) => GetCrlAsync(input_param).Result; + + /// + /// Change Existing CRL (Certificate Revocation List) Entry (Async mode). Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetCrlAsync(VpnRpcCrl input_param) => await CallAsync("SetCrl", input_param); + + /// + /// Change Existing CRL (Certificate Revocation List) Entry (Async mode). Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCrl SetCrl(VpnRpcCrl input_param) => SetCrlAsync(input_param).Result; + + /// + /// Add Rule to Source IP Address Limit List (Async mode). Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetAcListAsync(VpnRpcAcList input_param) => await CallAsync("SetAcList", input_param); + + /// + /// Add Rule to Source IP Address Limit List (Async mode). Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcAcList SetAcList(VpnRpcAcList input_param) => SetAcListAsync(input_param).Result; + + /// + /// Get List of Rule Items of Source IP Address Limit List (Async mode). Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetAcListAsync(VpnRpcAcList input_param) => await CallAsync("GetAcList", input_param); + + /// + /// Get List of Rule Items of Source IP Address Limit List (Async mode). Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcAcList GetAcList(VpnRpcAcList input_param) => GetAcListAsync(input_param).Result; + + /// + /// Get List of Log Files (Async mode). Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + /// + public async Task EnumLogFileAsync() => await CallAsync("EnumLogFile", new VpnRpcEnumLogFile()); + + /// + /// Get List of Log Files (Async mode). Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + /// + public VpnRpcEnumLogFile EnumLogFile() => EnumLogFileAsync().Result; + + /// + /// Download a part of Log File (Async mode). Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + /// + public async Task ReadLogFileAsync(VpnRpcReadLogFile input_param) => await CallAsync("ReadLogFile", input_param); + + /// + /// Download a part of Log File (Async mode). Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + /// + public VpnRpcReadLogFile ReadLogFile(VpnRpcReadLogFile input_param) => ReadLogFileAsync(input_param).Result; + + /// + /// Set syslog Send Function (Async mode). Use this to set the usage of syslog send function and which syslog server to use. + /// + public async Task SetSysLogAsync(VpnSyslogSetting input_param) => await CallAsync("SetSysLog", input_param); + + /// + /// Set syslog Send Function (Async mode). Use this to set the usage of syslog send function and which syslog server to use. + /// + public VpnSyslogSetting SetSysLog(VpnSyslogSetting input_param) => SetSysLogAsync(input_param).Result; + + /// + /// Get syslog Send Function (Async mode). This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. + /// + public async Task GetSysLogAsync(VpnSyslogSetting input_param) => await CallAsync("GetSysLog", input_param); + + /// + /// Get syslog Send Function (Async mode). This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. + /// + public VpnSyslogSetting GetSysLog(VpnSyslogSetting input_param) => GetSysLogAsync(input_param).Result; + + /// + /// Set Today's Message of Virtual Hub (Async mode). The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + /// + public async Task SetHubMsgAsync(VpnRpcMsg input_param) => await CallAsync("SetHubMsg", input_param); + + /// + /// Set Today's Message of Virtual Hub (Async mode). The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + /// + public VpnRpcMsg SetHubMsg(VpnRpcMsg input_param) => SetHubMsgAsync(input_param).Result; + + /// + /// Get Today's Message of Virtual Hub (Async mode). The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + /// + public async Task GetHubMsgAsync(VpnRpcMsg input_param) => await CallAsync("GetHubMsg", input_param); + + /// + /// Get Today's Message of Virtual Hub (Async mode). The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + /// + public VpnRpcMsg GetHubMsg(VpnRpcMsg input_param) => GetHubMsgAsync(input_param).Result; + + /// + /// Raise a vital error on the VPN Server / Bridge to terminate the process forcefully (Async mode). This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + /// + public async Task CrashAsync(VpnRpcTest input_param) => await CallAsync("Crash", input_param); + + /// + /// Raise a vital error on the VPN Server / Bridge to terminate the process forcefully (Async mode). This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + /// + public VpnRpcTest Crash(VpnRpcTest input_param) => CrashAsync(input_param).Result; + + /// + /// Get the message for administrators (Async mode). + /// + public async Task GetAdminMsgAsync() => await CallAsync("GetAdminMsg", new VpnRpcMsg()); + + /// + /// Get message for administrators (Sync mode) + /// + public VpnRpcMsg GetAdminMsg() => GetAdminMsgAsync().Result; + + /// + /// Save All Volatile Data of VPN Server / Bridge to the Configuration File (Async mode). The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + /// + public async Task FlushAsync(VpnRpcTest input_param) => await CallAsync("Flush", input_param); + + /// + /// Save All Volatile Data of VPN Server / Bridge to the Configuration File (Sync mode). The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + /// + public VpnRpcTest Flush(VpnRpcTest input_param) => FlushAsync(input_param).Result; + + /// + /// Enable or Disable IPsec VPN Server Function (Async mode). Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetIPsecServicesAsync(VpnIPsecServices input_param) => await CallAsync("SetIPsecServices", input_param); + + /// + /// Enable or Disable IPsec VPN Server Function (Async mode). Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnIPsecServices SetIPsecServices(VpnIPsecServices input_param) => SetIPsecServicesAsync(input_param).Result; + + /// + /// Get the Current IPsec VPN Server Settings (Async mode). Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetIPsecServicesAsync() => await CallAsync("GetIPsecServices", new VpnIPsecServices()); + + /// + /// Get the Current IPsec VPN Server Settings (Async mode). Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnIPsecServices GetIPsecServices() => GetIPsecServicesAsync().Result; + + /// + /// Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices (Async mode). Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task AddEtherIpIdAsync(VpnEtherIpId input_param) => await CallAsync("AddEtherIpId", input_param); + + /// + /// Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices (Async mode). Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnEtherIpId AddEtherIpId(VpnEtherIpId input_param) => AddEtherIpIdAsync(input_param).Result; + + /// + /// Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions (Async mode). This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetEtherIpIdAsync(VpnEtherIpId input_param) => await CallAsync("GetEtherIpId", input_param); + + /// + /// Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions (Async mode). This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnEtherIpId GetEtherIpId(VpnEtherIpId input_param) => GetEtherIpIdAsync(input_param).Result; + + /// + /// Delete an EtherIP / L2TPv3 over IPsec Client Setting (Async mode). This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task DeleteEtherIpIdAsync(VpnEtherIpId input_param) => await CallAsync("DeleteEtherIpId", input_param); + + /// + /// Delete an EtherIP / L2TPv3 over IPsec Client Setting (Async mode). This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnEtherIpId DeleteEtherIpId(VpnEtherIpId input_param) => DeleteEtherIpIdAsync(input_param).Result; + + /// + /// Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions (Async mode). This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumEtherIpIdAsync() => await CallAsync("EnumEtherIpId", new VpnRpcEnumEtherIpId()); + + /// + /// Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions (Async mode). This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumEtherIpId EnumEtherIpId() => EnumEtherIpIdAsync().Result; + + /// + /// Set Settings for OpenVPN Clone Server Function (Async mode). The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetOpenVpnSstpConfigAsync(VpnOpenVpnSstpConfig input_param) => await CallAsync("SetOpenVpnSstpConfig", input_param); + + /// + /// Set Settings for OpenVPN Clone Server Function (Async mode). The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnOpenVpnSstpConfig SetOpenVpnSstpConfig(VpnOpenVpnSstpConfig input_param) => SetOpenVpnSstpConfigAsync(input_param).Result; + + /// + /// Get the Current Settings of OpenVPN Clone Server Function (Async mode). Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetOpenVpnSstpConfigAsync() => await CallAsync("GetOpenVpnSstpConfig", new VpnOpenVpnSstpConfig()); + + /// + /// Get the Current Settings of OpenVPN Clone Server Function (Async mode). Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnOpenVpnSstpConfig GetOpenVpnSstpConfig() => GetOpenVpnSstpConfigAsync().Result; + + /// + /// Show the Current Status of Dynamic DNS Function (Async mode). Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public async Task GetDDnsClientStatusAsync() => await CallAsync("GetDDnsClientStatus", new VpnDDnsClientStatus()); + + /// + /// Show the Current Status of Dynamic DNS Function (Async mode). Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public VpnDDnsClientStatus GetDDnsClientStatus() => GetDDnsClientStatusAsync().Result; + + /// + /// Set the Dynamic DNS Hostname (Async mode). You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public async Task ChangeDDnsClientHostnameAsync(VpnRpcTest input_param) => await CallAsync("ChangeDDnsClientHostname", input_param); + + /// + /// Set the Dynamic DNS Hostname (Async mode). You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcTest ChangeDDnsClientHostname(VpnRpcTest input_param) => ChangeDDnsClientHostnameAsync(input_param).Result; + + /// + /// Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server (Async mode). You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task RegenerateServerCertAsync(VpnRpcTest input_param) => await CallAsync("RegenerateServerCert", input_param); + + /// + /// Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server (Async mode). You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcTest RegenerateServerCert(VpnRpcTest input_param) => RegenerateServerCertAsync(input_param).Result; + + /// + /// Generate a Sample Setting File for OpenVPN Client (Async mode). Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task MakeOpenVpnConfigFileAsync() => await CallAsync("MakeOpenVpnConfigFile", new VpnRpcReadLogFile()); + + /// + /// Generate a Sample Setting File for OpenVPN Client (Async mode). Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcReadLogFile MakeOpenVpnConfigFile() => MakeOpenVpnConfigFileAsync().Result; + + /// + /// Enable / Disable the VPN over ICMP / VPN over DNS Server Function (Async mode). You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public async Task SetSpecialListenerAsync(VpnRpcSpecialListener input_param) => await CallAsync("SetSpecialListener", input_param); + + /// + /// Enable / Disable the VPN over ICMP / VPN over DNS Server Function (Async mode). You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcSpecialListener SetSpecialListener(VpnRpcSpecialListener input_param) => SetSpecialListenerAsync(input_param).Result; + + /// + /// Get Current Setting of the VPN over ICMP / VPN over DNS Function (Async mode). Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public async Task GetSpecialListenerAsync() => await CallAsync("GetSpecialListener", new VpnRpcSpecialListener()); + + /// + /// Get Current Setting of the VPN over ICMP / VPN over DNS Function (Async mode). Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcSpecialListener GetSpecialListener() => GetSpecialListenerAsync().Result; + + /// + /// Show the current status of VPN Azure function (Async mode). Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetAzureStatusAsync() => await CallAsync("GetAzureStatus", new VpnRpcAzureStatus()); + + /// + /// Show the current status of VPN Azure function (Async mode). Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcAzureStatus GetAzureStatus() => GetAzureStatusAsync().Result; + + /// + /// Enable / Disable VPN Azure Function (Async mode). Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetAzureStatusAsync(VpnRpcAzureStatus input_param) => await CallAsync("SetAzureStatus", input_param); + + /// + /// Enable / Disable VPN Azure Function (Async mode). Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcAzureStatus SetAzureStatus(VpnRpcAzureStatus input_param) => SetAzureStatusAsync(input_param).Result; + + /// + /// Get the Proxy Settings for Connecting to the DDNS server (Async mode). + /// + public async Task GetDDnsInternetSettngAsync() => await CallAsync("GetDDnsInternetSettng", new VpnInternetSetting()); + + /// + /// Get the Proxy Settings for Connecting to the DDNS server (Async mode). + /// + public VpnInternetSetting GetDDnsInternetSettng() => GetDDnsInternetSettngAsync().Result; + + /// + /// Set the Proxy Settings for Connecting to the DDNS server (Async mode). + /// + public async Task SetDDnsInternetSettngAsync(VpnInternetSetting input_param) => await CallAsync("SetDDnsInternetSettng", input_param); + + /// + /// Set the Proxy Settings for Connecting to the DDNS server (Sync mode). + /// + public VpnInternetSetting SetDDnsInternetSettng(VpnInternetSetting input_param) => SetDDnsInternetSettngAsync(input_param).Result; + + /// + /// Set the VPN Gate Server Configuration (Async mode). This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. + /// + public async Task SetVgsConfigAsync(VpnVgsConfig input_param) => await CallAsync("SetVgsConfig", input_param); + + /// + /// Set the VPN Gate Server Configuration (Sync mode). This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. + /// + public VpnVgsConfig SetVgsConfig(VpnVgsConfig input_param) => SetVgsConfigAsync(input_param).Result; + + /// + /// Get the VPN Gate Server Configuration (Async mode). This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. + /// + public async Task GetVgsConfigAsync() => await CallAsync("GetVgsConfig", new VpnVgsConfig()); + + /// + /// Get the VPN Gate Server Configuration (Sync mode). This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. + /// + public VpnVgsConfig GetVgsConfig() => GetVgsConfigAsync().Result; + + + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/VPNServerRpcTypes.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/VPNServerRpcTypes.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/VPNServerRpcTypes.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/VPNServerRpcTypes.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,5381 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// VPNServerRpcTypes.cs - Data Type Definition for SoftEther VPN Server JSON-RPC Stubs +// +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + +using System; +using Newtonsoft.Json; + +namespace SoftEther.VPNServerRpc +{ + /// + /// IP Protocol Numbers + /// + public enum VpnIpProtocolNumber + { + /// + /// ICMP for IPv4 + /// + ICMPv4 = 1, + + /// + /// TCP + /// + TCP = 6, + + /// + /// UDP + /// + UDP = 17, + + /// + /// ICMP for IPv6 + /// + ICMPv6 = 58, + } + + /// + /// The body of the Access list + /// + public class VpnAccess + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Specify a description (note) for this rule + /// + public string Note_utf; + + /// + /// Enabled flag (true: enabled, false: disabled) + /// + public bool Active_bool; + + /// + /// Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. + /// + public uint Priority_u32; + + /// + /// The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. + /// + public bool Discard_bool; + + /// + /// The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. + /// + public bool IsIPv6_bool; + + /// + /// Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. + /// + public string SrcIpAddress_ip; + + /// + /// Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. + /// + public string SrcSubnetMask_ip; + + /// + /// Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. + /// + public string DestIpAddress_ip; + + /// + /// Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. + /// + public string DestSubnetMask_ip; + + /// + /// Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. + /// + public byte[] SrcIpAddress6_bin; + + /// + /// Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. + /// + public byte[] SrcSubnetMask6_bin; + + /// + /// Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. + /// + public byte[] DestIpAddress6_bin; + + /// + /// Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. + /// + public byte[] DestSubnetMask6_bin; + + /// + /// The IP protocol number + /// + public VpnIpProtocolNumber Protocol_u32; + + /// + /// The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. + /// + public uint SrcPortStart_u32; + + /// + /// The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. + /// + public uint SrcPortEnd_u32; + + /// + /// The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. + /// + public uint DestPortStart_u32; + + /// + /// The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. + /// + public uint DestPortEnd_u32; + + /// + /// Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. + /// + public string SrcUsername_str; + + /// + /// Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. + /// + public string DestUsername_str; + + /// + /// Specify true if you want to check the source MAC address. + /// + public bool CheckSrcMac_bool; + + /// + /// Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. + /// + public byte[] SrcMacAddress_bin; + + /// + /// Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. + /// + public byte[] SrcMacMask_bin; + + /// + /// Specify true if you want to check the destination MAC address. + /// + public bool CheckDstMac_bool; + + /// + /// Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. + /// + public byte[] DstMacAddress_bin; + + /// + /// Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. + /// + public byte[] DstMacMask_bin; + + /// + /// Specify true if you want to check the state of the TCP connection. + /// + public bool CheckTcpState_bool; + + /// + /// Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. + /// + public bool Established_bool; + + /// + /// Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. + /// + public uint Delay_u32; + + /// + /// Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. + /// + public uint Jitter_u32; + + /// + /// Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. + /// + public uint Loss_u32; + + /// + /// The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. + /// + public string RedirectUrl_str; + } + + /// + /// Add an item to Access List + /// + public class VpnRpcAddAccess + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Access list (Must be a single item) + /// + public VpnAccess[] AccessListSingle; + } + + /// + /// Add CA to HUB + /// + public class VpnRpcHubAddCA + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The body of the X.509 certificate + /// + public byte[] Cert_bin; + } + + /// + /// CRL entry + /// + public class VpnRpcCrl + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Key ID + /// + public uint Key_u32; + + /// + /// CN, optional + /// + public string CommonName_utf; + + /// + /// O, optional + /// + public string Organization_utf; + + /// + /// OU, optional + /// + public string Unit_utf; + + /// + /// C, optional + /// + public string Country_utf; + + /// + /// ST, optional + /// + public string State_utf; + + /// + /// L, optional + /// + public string Local_utf; + + /// + /// Serial, optional + /// + public byte[] Serial_bin; + + /// + /// MD5 Digest, optional + /// + public byte[] DigestMD5_bin; + + /// + /// SHA1 Digest, optional + /// + public byte[] DigestSHA1_bin; + } + + /// + /// EtherIP key list entry + /// + public class VpnEtherIpId + { + /// + /// Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. + /// + public string Id_str; + + /// + /// Specify the name of the Virtual Hub to connect. + /// + public string HubName_str; + + /// + /// Specify the username to login to the destination Virtual Hub. + /// + public string UserName_str; + + /// + /// Specify the password to login to the destination Virtual Hub. + /// + public string Password_str; + } + + /// + /// Layer-3 virtual interface + /// + public class VpnRpcL3If + { + /// + /// L3 switch name + /// + public string Name_str; + + /// + /// Virtual HUB name + /// + public string HubName_str; + + /// + /// IP address + /// + public string IpAddress_ip; + + /// + /// Subnet mask + /// + public string SubnetMask_ip; + } + + /// + /// Layer-3 switch + /// + public class VpnRpcL3Sw + { + /// + /// Layer-3 Switch name + /// + public string Name_str; + } + + /// + /// Routing table + /// + public class VpnRpcL3Table + { + /// + /// L3 switch name + /// + public string Name_str; + + /// + /// Network address + /// + public string NetworkAddress_ip; + + /// + /// Subnet mask + /// + public string SubnetMask_ip; + + /// + /// Gateway address + /// + public string GatewayAddress_ip; + + /// + /// Metric + /// + public uint Metric_u32; + } + + /// + /// Generic parameter to contain u32, u64, ascii_string and unicode string + /// + public class VpnRpcTest + { + /// + /// A 32-bit integer field + /// + public uint IntValue_u32; + + /// + /// A 64-bit integer field + /// + public ulong Int64Value_u64; + + /// + /// An Ascii string field + /// + public string StrValue_str; + + /// + /// An UTF-8 string field + /// + public string UniStrValue_utf; + } + + /// + /// Local Bridge list item + /// + public class VpnRpcLocalBridge + { + /// + /// Physical Ethernet device name + /// + public string DeviceName_str; + + /// + /// The Virtual Hub name + /// + public string HubNameLB_str; + + /// + /// Online flag + /// + public bool Online_bool; + + /// + /// Running flag + /// + public bool Active_bool; + + /// + /// Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). + /// + public bool TapMode_bool; + } + + /// + /// Create, configure, and get the group + /// + public class VpnRpcSetGroup + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The group name + /// + public string Name_str; + + /// + /// Optional real name (full name) of the group, allow using any Unicode characters + /// + public string Realname_utf; + + /// + /// Optional, specify a description of the group + /// + public string Note_utf; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + + /// + /// The flag whether to use security policy + /// + public bool UsePolicy_bool; + + // ---- Start of Security policy --- + /// + /// Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. + /// + [JsonProperty("policy:Access_bool")] + public bool SecPol_Access_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPFilter_bool")] + public bool SecPol_DHCPFilter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPNoServer_bool")] + public bool SecPol_DHCPNoServer_bool; + + /// + /// Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. + /// + [JsonProperty("policy:DHCPForce_bool")] + public bool SecPol_DHCPForce_bool; + + /// + /// Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. + /// + [JsonProperty("policy:NoBridge_bool")] + public bool SecPol_NoBridge_bool; + + /// + /// Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. + /// + [JsonProperty("policy:NoRouting_bool")] + public bool SecPol_NoRouting_bool; + + /// + /// Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckMac_bool")] + public bool SecPol_CheckMac_bool; + + /// + /// Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckIP_bool")] + public bool SecPol_CheckIP_bool; + + /// + /// Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. + /// + [JsonProperty("policy:ArpDhcpOnly_bool")] + public bool SecPol_ArpDhcpOnly_bool; + + /// + /// Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. + /// + [JsonProperty("policy:PrivacyFilter_bool")] + public bool SecPol_PrivacyFilter_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. + /// + [JsonProperty("policy:NoServer_bool")] + public bool SecPol_NoServer_bool; + + /// + /// Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. + /// + [JsonProperty("policy:NoBroadcastLimiter_bool")] + public bool SecPol_NoBroadcastLimiter_bool; + + /// + /// Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. + /// + [JsonProperty("policy:MonitorPort_bool")] + public bool SecPol_MonitorPort_bool; + + /// + /// Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. + /// + [JsonProperty("policy:MaxConnection_u32")] + public uint SecPol_MaxConnection_u32; + + /// + /// Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. + /// + [JsonProperty("policy:TimeOut_u32")] + public uint SecPol_TimeOut_u32; + + /// + /// Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. + /// + [JsonProperty("policy:MaxMac_u32")] + public uint SecPol_MaxMac_u32; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIP_u32")] + public uint SecPol_MaxIP_u32; + + /// + /// Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. + /// + [JsonProperty("policy:MaxUpload_u32")] + public uint SecPol_MaxUpload_u32; + + /// + /// Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. + /// + [JsonProperty("policy:MaxDownload_u32")] + public uint SecPol_MaxDownload_u32; + + /// + /// Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. + /// + [JsonProperty("policy:FixPassword_bool")] + public bool SecPol_FixPassword_bool; + + /// + /// Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. + /// + [JsonProperty("policy:MultiLogins_u32")] + public uint SecPol_MultiLogins_u32; + + /// + /// Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. + /// + [JsonProperty("policy:NoQoS_bool")] + public bool SecPol_NoQoS_bool; + + /// + /// Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. + /// + [JsonProperty("policy:RSandRAFilter_bool")] + public bool SecPol_RSandRAFilter_bool; + + /// + /// Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. + /// + [JsonProperty("policy:RAFilter_bool")] + public bool SecPol_RAFilter_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPv6Filter_bool")] + public bool SecPol_DHCPv6Filter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPv6NoServer_bool")] + public bool SecPol_DHCPv6NoServer_bool; + + /// + /// Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. + /// + [JsonProperty("policy:NoRoutingV6_bool")] + public bool SecPol_NoRoutingV6_bool; + + /// + /// Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckIPv6_bool")] + public bool SecPol_CheckIPv6_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. + /// + [JsonProperty("policy:NoServerV6_bool")] + public bool SecPol_NoServerV6_bool; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIPv6_u32")] + public uint SecPol_MaxIPv6_u32; + + /// + /// Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. + /// + [JsonProperty("policy:NoSavePassword_bool")] + public bool SecPol_NoSavePassword_bool; + + /// + /// Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. + /// + [JsonProperty("policy:AutoDisconnect_u32")] + public uint SecPol_AutoDisconnect_u32; + + /// + /// Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv4_bool")] + public bool SecPol_FilterIPv4_bool; + + /// + /// Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv6_bool")] + public bool SecPol_FilterIPv6_bool; + + /// + /// Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. + /// + [JsonProperty("policy:FilterNonIP_bool")] + public bool SecPol_FilterNonIP_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRA_bool")] + public bool SecPol_NoIPv6DefaultRouterInRA_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRAWhenIPv6_bool")] + public bool SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool; + + /// + /// Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. + /// + [JsonProperty("policy:VLanId_u32")] + public uint SecPol_VLanId_u32; + + /// + /// Security policy: Whether version 3.0 (must be true) + /// + [JsonProperty("policy:Ver3_bool")] + public bool SecPol_Ver3_bool = true; + // ---- End of Security policy --- + } + + /// + /// Hub types + /// + public enum VpnRpcHubType + { + /// + /// Stand-alone HUB + /// + Standalone = 0, + + /// + /// Static HUB + /// + FarmStatic = 1, + + /// + /// Dynamic HUB + /// + FarmDynamic = 2, + } + + /// + /// Create a HUB + /// + public class VpnRpcCreateHub + { + /// + /// Specify the name of the Virtual Hub to create / update. + /// + public string HubName_str; + + /// + /// Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. + /// + public string AdminPasswordPlainText_str; + + /// + /// Online flag + /// + public bool Online_bool; + + /// + /// Maximum number of VPN sessions + /// + public uint MaxSession_u32; + + /// + /// No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. + /// + public bool NoEnum_bool; + + /// + /// Type of the Virtual Hub (Valid only for Clustered VPN Servers) + /// + public VpnRpcHubType HubType_u32; + } + + public enum VpnRpcClientAuthType + { + /// + /// Anonymous authentication + /// + Anonymous = 0, + + /// + /// SHA-0 hashed password authentication + /// + SHA0_Hashed_Password = 1, + + /// + /// Plain password authentication + /// + PlainPassword = 2, + + /// + /// Certificate authentication + /// + Cert = 3, + } + + /// + /// Create and set of link + /// + public class VpnRpcCreateLink + { + /// + /// The Virtual Hub name + /// + public string HubName_Ex_str; + + /// + /// Online flag + /// + public bool Online_bool; + + /// + /// The flag to enable validation for the server certificate + /// + public bool CheckServerCert_bool; + + /// + /// The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. + /// + public byte[] ServerCert_bin; + + // ---- Start of Client Option Parameters --- + /// + /// Client Option Parameters: Specify the name of the Cascade Connection + /// + [JsonProperty("AccountName_utf")] + public string ClientOption_AccountName_utf; + + /// + /// Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. + /// + [JsonProperty("Hostname_str")] + public string ClientOption_Hostname_str; + + /// + /// Client Option Parameters: Specify the port number of the destination VPN Server. + /// + [JsonProperty("Port_u32")] + public uint ClientOption_Port_u32; + + /// + /// Client Option Parameters: The type of the proxy server + /// + [JsonProperty("ProxyType_u32")] + public VpnRpcProxyType ClientOption_ProxyType_u32; + + /// + /// Client Option Parameters: The hostname or IP address of the proxy server name + /// + [JsonProperty("ProxyName_str")] + public string ClientOption_ProxyName_str; + + /// + /// Client Option Parameters: The port number of the proxy server + /// + [JsonProperty("ProxyPort_u32")] + public uint ClientOption_ProxyPort_u32; + + /// + /// Client Option Parameters: The username to connect to the proxy server + /// + [JsonProperty("ProxyUsername_str")] + public string ClientOption_ProxyUsername_str; + + /// + /// Client Option Parameters: The password to connect to the proxy server + /// + [JsonProperty("ProxyPassword_str")] + public string ClientOption_ProxyPassword_str; + + /// + /// Client Option Parameters: The Virtual Hub on the destination VPN Server + /// + [JsonProperty("HubName_str")] + public string ClientOption_HubName_str; + + /// + /// Client Option Parameters: Number of TCP Connections to Use in VPN Communication + /// + [JsonProperty("MaxConnection_u32")] + public uint ClientOption_MaxConnection_u32; + + /// + /// Client Option Parameters: The flag to enable the encryption on the communication + /// + [JsonProperty("UseEncrypt_bool")] + public bool ClientOption_UseEncrypt_bool; + + /// + /// Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection + /// + [JsonProperty("UseCompress_bool")] + public bool ClientOption_UseCompress_bool; + + /// + /// Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. + /// + [JsonProperty("HalfConnection_bool")] + public bool ClientOption_HalfConnection_bool; + + /// + /// Client Option Parameters: Connection attempt interval when additional connection will be established + /// + [JsonProperty("AdditionalConnectionInterval_u32")] + public uint ClientOption_AdditionalConnectionInterval_u32; + + /// + /// Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) + /// + [JsonProperty("ConnectionDisconnectSpan_u32")] + public uint ClientOption_ConnectionDisconnectSpan_u32; + + /// + /// Client Option Parameters: Disable QoS Control Function if the value is true + /// + [JsonProperty("DisableQoS_bool")] + public bool ClientOption_DisableQoS_bool; + + /// + /// Client Option Parameters: Do not use TLS 1.x of the value is true + /// + [JsonProperty("NoTls1_bool")] + public bool ClientOption_NoTls1_bool; + + /// + /// Client Option Parameters: Do not use UDP acceleration mode if the value is true + /// + [JsonProperty("NoUdpAcceleration_bool")] + public bool ClientOption_NoUdpAcceleration_bool; + // ---- End of Client Option --- + + // ---- Start of Client Auth Parameters --- + /// + /// Authentication type + /// + [JsonProperty("AuthType_u32")] + public VpnRpcClientAuthType ClientAuth_AuthType_u32; + + /// + /// User name + /// + [JsonProperty("Username_str")] + public string ClientAuth_Username_str; + + /// + /// SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). + /// + [JsonProperty("HashedPassword_bin")] + public byte[] ClientAuth_HashedPassword_bin; + + /// + /// Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). + /// + [JsonProperty("PlainPassword_str")] + public string ClientAuth_PlainPassword_str; + + /// + /// Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). + /// + [JsonProperty("ClientX_bin")] + public byte[] ClientAuth_ClientX_bin; + + /// + /// Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). + /// + [JsonProperty("ClientK_bin")] + public byte[] ClientAuth_ClientK_bin; + + /// + /// Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPFilter_bool")] + public bool SecPol_DHCPFilter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPNoServer_bool")] + public bool SecPol_DHCPNoServer_bool; + + /// + /// Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. + /// + [JsonProperty("policy:DHCPForce_bool")] + public bool SecPol_DHCPForce_bool; + + /// + /// Security policy: Prohibit the duplicate MAC address + /// + /// Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + public bool SecPol_CheckMac_bool; + + /// + /// Security policy: Prohibit a duplicate IP address (IPv4) + /// + /// Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + public bool SecPol_CheckIP_bool; + + /// + /// Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. + /// + [JsonProperty("policy:ArpDhcpOnly_bool")] + public bool SecPol_ArpDhcpOnly_bool; + + /// + /// Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. + /// + [JsonProperty("policy:PrivacyFilter_bool")] + public bool SecPol_PrivacyFilter_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. + /// + [JsonProperty("policy:NoServer_bool")] + public bool SecPol_NoServer_bool; + + /// + /// Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. + /// + [JsonProperty("policy:NoBroadcastLimiter_bool")] + public bool SecPol_NoBroadcastLimiter_bool; + + /// + /// Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. + /// + [JsonProperty("policy:MaxMac_u32")] + public uint SecPol_MaxMac_u32; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIP_u32")] + public uint SecPol_MaxIP_u32; + + /// + /// Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. + /// + [JsonProperty("policy:MaxUpload_u32")] + public uint SecPol_MaxUpload_u32; + + /// + /// Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. + /// + [JsonProperty("policy:MaxDownload_u32")] + public uint SecPol_MaxDownload_u32; + + /// + /// Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. + /// + [JsonProperty("policy:RSandRAFilter_bool")] + public bool SecPol_RSandRAFilter_bool; + + /// + /// Security policy: Filter the router advertisement packet (IPv6) + /// + /// Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. + public bool SecPol_RAFilter_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPv6Filter_bool")] + public bool SecPol_DHCPv6Filter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPv6NoServer_bool")] + public bool SecPol_DHCPv6NoServer_bool; + + /// + /// Security policy: Prohibit the duplicate IP address (IPv6) + /// + /// Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + public bool SecPol_CheckIPv6_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. + /// + [JsonProperty("policy:NoServerV6_bool")] + public bool SecPol_NoServerV6_bool; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIPv6_u32")] + public uint SecPol_MaxIPv6_u32; + + /// + /// Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv4_bool")] + public bool SecPol_FilterIPv4_bool; + + /// + /// Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv6_bool")] + public bool SecPol_FilterIPv6_bool; + + /// + /// Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. + /// + [JsonProperty("policy:FilterNonIP_bool")] + public bool SecPol_FilterNonIP_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRA_bool")] + public bool SecPol_NoIPv6DefaultRouterInRA_bool; + + /// + /// Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. + /// + [JsonProperty("policy:VLanId_u32")] + public uint SecPol_VLanId_u32; + + /// + /// Security policy: Whether version 3.0 (must be true) + /// + [JsonProperty("policy:Ver3_bool")] + public bool SecPol_Ver3_bool = true; + // ---- End of Security policy --- + } + + /// + /// Listener + /// + public class VpnRpcListener + { + /// + /// Port number (Range: 1 - 65535) + /// + public uint Port_u32; + + /// + /// Active state + /// + public bool Enable_bool; + } + + /// + /// User authentication type (server side) + /// + public enum VpnRpcUserAuthType + { + /// + /// Anonymous authentication + /// + Anonymous = 0, + + /// + /// Password authentication + /// + Password = 1, + + /// + /// User certificate authentication + /// + UserCert = 2, + + /// + /// Root certificate which is issued by trusted Certificate Authority + /// + RootCert = 3, + + /// + /// Radius authentication + /// + Radius = 4, + + /// + /// Windows NT authentication + /// + NTDomain = 5, + } + + /// + /// Create, configure, and get the user + /// + public class VpnRpcSetUser + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Specify the user name of the user + /// + public string Name_str; + + /// + /// Assigned group name for the user + /// + public string GroupName_str; + + /// + /// Optional real name (full name) of the user, allow using any Unicode characters + /// + public string Realname_utf; + + /// + /// Optional User Description + /// + public string Note_utf; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Last modified date and time + /// + public DateTime UpdatedTime_dt; + + /// + /// Expiration date and time + /// + public DateTime ExpireTime_dt; + + /// + /// Authentication method of the user + /// + public VpnRpcUserAuthType AuthType_u32; + + /// + /// User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. + /// + public string Auth_Password_str; + + /// + /// User certificate, valid only if AuthType_u32 == UserCert(2). + /// + [JsonProperty("UserX_bin")] + public byte[] Auth_UserCert_CertData; + + /// + /// Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). + /// + [JsonProperty("Serial_bin")] + public byte[] Auth_RootCert_Serial; + + /// + /// Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). + /// + [JsonProperty("CommonName_utf")] + public string Auth_RootCert_CommonName; + + /// + /// Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). + /// + [JsonProperty("RadiusUsername_utf")] + public string Auth_Radius_RadiusUsername; + + /// + /// Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). + /// + [JsonProperty("NtUsername_utf")] + public string Auth_NT_NTUsername; + + /// + /// Number of total logins of the user + /// + public uint NumLogin_u32; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + + /// + /// The flag whether to use security policy + /// + public bool UsePolicy_bool; + + // ---- Start of Security policy --- + /// + /// Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. + /// + [JsonProperty("policy:Access_bool")] + public bool SecPol_Access_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPFilter_bool")] + public bool SecPol_DHCPFilter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPNoServer_bool")] + public bool SecPol_DHCPNoServer_bool; + + /// + /// Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. + /// + [JsonProperty("policy:DHCPForce_bool")] + public bool SecPol_DHCPForce_bool; + + /// + /// Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. + /// + [JsonProperty("policy:NoBridge_bool")] + public bool SecPol_NoBridge_bool; + + /// + /// Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. + /// + [JsonProperty("policy:NoRouting_bool")] + public bool SecPol_NoRouting_bool; + + /// + /// Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckMac_bool")] + public bool SecPol_CheckMac_bool; + + /// + /// Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckIP_bool")] + public bool SecPol_CheckIP_bool; + + /// + /// Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. + /// + [JsonProperty("policy:ArpDhcpOnly_bool")] + public bool SecPol_ArpDhcpOnly_bool; + + /// + /// Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. + /// + [JsonProperty("policy:PrivacyFilter_bool")] + public bool SecPol_PrivacyFilter_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. + /// + [JsonProperty("policy:NoServer_bool")] + public bool SecPol_NoServer_bool; + + /// + /// Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. + /// + [JsonProperty("policy:NoBroadcastLimiter_bool")] + public bool SecPol_NoBroadcastLimiter_bool; + + /// + /// Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. + /// + [JsonProperty("policy:MonitorPort_bool")] + public bool SecPol_MonitorPort_bool; + + /// + /// Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. + /// + [JsonProperty("policy:MaxConnection_u32")] + public uint SecPol_MaxConnection_u32; + + /// + /// Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. + /// + [JsonProperty("policy:TimeOut_u32")] + public uint SecPol_TimeOut_u32; + + /// + /// Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. + /// + [JsonProperty("policy:MaxMac_u32")] + public uint SecPol_MaxMac_u32; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIP_u32")] + public uint SecPol_MaxIP_u32; + + /// + /// Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. + /// + [JsonProperty("policy:MaxUpload_u32")] + public uint SecPol_MaxUpload_u32; + + /// + /// Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. + /// + [JsonProperty("policy:MaxDownload_u32")] + public uint SecPol_MaxDownload_u32; + + /// + /// Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. + /// + [JsonProperty("policy:FixPassword_bool")] + public bool SecPol_FixPassword_bool; + + /// + /// Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. + /// + [JsonProperty("policy:MultiLogins_u32")] + public uint SecPol_MultiLogins_u32; + + /// + /// Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. + /// + [JsonProperty("policy:NoQoS_bool")] + public bool SecPol_NoQoS_bool; + + /// + /// Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. + /// + [JsonProperty("policy:RSandRAFilter_bool")] + public bool SecPol_RSandRAFilter_bool; + + /// + /// Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. + /// + [JsonProperty("policy:RAFilter_bool")] + public bool SecPol_RAFilter_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPv6Filter_bool")] + public bool SecPol_DHCPv6Filter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPv6NoServer_bool")] + public bool SecPol_DHCPv6NoServer_bool; + + /// + /// Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. + /// + [JsonProperty("policy:NoRoutingV6_bool")] + public bool SecPol_NoRoutingV6_bool; + + /// + /// Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckIPv6_bool")] + public bool SecPol_CheckIPv6_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. + /// + [JsonProperty("policy:NoServerV6_bool")] + public bool SecPol_NoServerV6_bool; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIPv6_u32")] + public uint SecPol_MaxIPv6_u32; + + /// + /// Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. + /// + [JsonProperty("policy:NoSavePassword_bool")] + public bool SecPol_NoSavePassword_bool; + + /// + /// Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. + /// + [JsonProperty("policy:AutoDisconnect_u32")] + public uint SecPol_AutoDisconnect_u32; + + /// + /// Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv4_bool")] + public bool SecPol_FilterIPv4_bool; + + /// + /// Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv6_bool")] + public bool SecPol_FilterIPv6_bool; + + /// + /// Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. + /// + [JsonProperty("policy:FilterNonIP_bool")] + public bool SecPol_FilterNonIP_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRA_bool")] + public bool SecPol_NoIPv6DefaultRouterInRA_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRAWhenIPv6_bool")] + public bool SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool; + + /// + /// Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. + /// + [JsonProperty("policy:VLanId_u32")] + public uint SecPol_VLanId_u32; + + /// + /// Security policy: Whether version 3.0 (must be true) + /// + [JsonProperty("policy:Ver3_bool")] + public bool SecPol_Ver3_bool = true; + // ---- End of Security policy --- + } + + /// + /// Delete the access list + /// + public class VpnRpcDeleteAccess + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// ID + /// + public uint Id_u32; + } + + /// + /// Delete the CA of HUB + /// + public class VpnRpcHubDeleteCA + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Certificate key id to be deleted + /// + public uint Key_u32; + } + + /// + /// Deleting a user or group + /// + public class VpnRpcDeleteUser + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// User or group name + /// + public string Name_str; + } + + /// + /// Delete the HUB + /// + public class VpnRpcDeleteHub + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + } + + /// + /// Delete the table + /// + public class VpnRpcDeleteTable + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Key ID + /// + public uint Key_u32; + } + + /// + /// Specify the Link + /// + public class VpnRpcLink + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The name of the cascade connection + /// + public string AccountName_utf; + } + + /// + /// Disconnect the session + /// + public class VpnRpcDeleteSession + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Session name + /// + public string Name_str; + } + + /// + /// Specify the HUB + /// + public class VpnRpcHub + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + } + + /// + /// Disconnect a connection + /// + public class VpnRpcDisconnectConnection + { + /// + /// Connection name + /// + public string Name_str; + } + + /// + /// Enumeration of the access list + /// + public class VpnRpcEnumAccessList + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Access list + /// + public VpnAccess[] AccessList; + } + + /// + /// CA enumeration items of HUB + /// + public class VpnRpcHubEnumCAItem + { + /// + /// The key id of the item + /// + public uint Key_u32; + + /// + /// Subject + /// + public string SubjectName_utf; + + /// + /// Issuer + /// + public string IssuerName_utf; + + /// + /// Expiration date + /// + public DateTime Expires_dt; + } + + /// + /// CA enumeration of HUB + /// + public class VpnRpcHubEnumCA + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The list of CA + /// + public VpnRpcHubEnumCAItem[] CAList; + } + + /// + /// Type of connection + /// + public enum VpnRpcConnectionType + { + /// + /// VPN Client + /// + Client = 0, + + /// + /// During initialization + /// + Init = 1, + + /// + /// Login connection + /// + Login = 2, + + /// + /// Additional connection + /// + Additional = 3, + + /// + /// RPC for server farm + /// + FarmRpc = 4, + + /// + /// RPC for Management + /// + AdminRpc = 5, + + /// + /// HUB enumeration + /// + EnumHub = 6, + + /// + /// Password change + /// + Password = 7, + + /// + /// SSTP + /// + SSTP = 8, + + /// + /// OpenVPN + /// + OpenVPN = 9, + } + + /// + /// Connection enumeration items + /// + public class VpnRpcEnumConnectionItem + { + /// + /// Connection name + /// + public string Name_str; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Port number + /// + public uint Port_u32; + + /// + /// Connected time + /// + public DateTime ConnectedTime_dt; + + /// + /// Connection type + /// + public VpnRpcConnectionType Type_u32; + } + + /// + /// Connection enumeration + /// + public class VpnRpcEnumConnection + { + /// + /// Number of connections + /// + public uint NumConnection_u32; + + /// + /// Connection list + /// + public VpnRpcEnumConnectionItem[] ConnectionList; + } + + /// + /// Enum CRL Item + /// + public class VpnRpcEnumCrlItem + { + /// + /// Key ID + /// + public uint Key_u32; + + /// + /// The contents of the CRL item + /// + public string CrlInfo_utf; + } + + /// + /// Enum CRL + /// + public class VpnRpcEnumCrl + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// CRL list + /// + public VpnRpcEnumCrlItem[] CRLList; + } + + /// + /// RPC_ENUM_DHCP_ITEM + /// + public class VpnRpcEnumDhcpItem + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Lease time + /// + public DateTime LeasedTime_dt; + + /// + /// Expiration date + /// + public DateTime ExpireTime_dt; + + /// + /// MAC address + /// + public byte[] MacAddress_bin; + + /// + /// IP address + /// + public string IpAddress_ip; + + /// + /// Subnet mask + /// + public uint Mask_u32; + + /// + /// Host name + /// + public string Hostname_str; + } + + /// + /// RPC_ENUM_DHCP + /// + public class VpnRpcEnumDhcp + { + /// + /// Virtual Hub Name + /// + public string HubName_str; + + /// + /// DHCP Item + /// + public VpnRpcEnumDhcpItem[] DhcpTable; + } + + /// + /// EtherIP setting list + /// + public class VpnRpcEnumEtherIpId + { + /// + /// Setting list + /// + public VpnEtherIpId[] Settings; + } + + /// + /// Ethernet Network Adapters list item + /// + public class VpnRpcEnumEthItem + { + /// + /// Device name + /// + public string DeviceName_str; + + /// + /// Network connection name (description) + /// + public string NetworkConnectionName_utf; + } + + /// + /// Ethernet Network Adapters list + /// + public class VpnRpcEnumEth + { + /// + /// Ethernet Network Adapters list + /// + public VpnRpcEnumEthItem[] EthList; + } + + /// + /// Server farm members enumeration items + /// + public class VpnRpcEnumFarmItem + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Controller + /// + public bool Controller_bool; + + /// + /// Connection time + /// + public DateTime ConnectedTime_dt; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// Point + /// + public uint Point_u32; + + /// + /// Number of sessions + /// + public uint NumSessions_u32; + + /// + /// Number of TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Number of HUBs + /// + public uint NumHubs_u32; + + /// + /// Number of assigned client licenses + /// + public uint AssignedClientLicense_u32; + + /// + /// Number of assigned bridge licenses + /// + public uint AssignedBridgeLicense_u32; + } + + /// + /// Server farm member enumeration + /// + public class VpnRpcEnumFarm + { + /// + /// Number of Cluster Members + /// + public uint NumFarm_u32; + + /// + /// Cluster Members list + /// + public VpnRpcEnumFarmItem[] FarmMemberList; + } + + /// + /// Enumeration items in the group + /// + public class VpnRpcEnumGroupItem + { + /// + /// User name + /// + public string Name_str; + + /// + /// Real name + /// + public string Realname_utf; + + /// + /// Note + /// + public string Note_utf; + + /// + /// Number of users + /// + public uint NumUsers_u32; + + /// + /// Access denied + /// + public bool DenyAccess_bool; + } + + /// + /// Group enumeration + /// + public class VpnRpcEnumGroup + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Group list + /// + public VpnRpcEnumGroupItem[] GroupList; + } + + /// + /// Enumeration items of HUB + /// + public class VpnRpcEnumHubItem + { + /// + /// The name of the Virtual Hub + /// + public string HubName_str; + + /// + /// Online state + /// + public bool Online_bool; + + /// + /// Type of HUB (Valid only for Clustered VPN Servers) + /// + public VpnRpcHubType HubType_u32; + + /// + /// Number of users + /// + public uint NumUsers_u32; + + /// + /// Number of registered groups + /// + public uint NumGroups_u32; + + /// + /// Number of registered sessions + /// + public uint NumSessions_u32; + + /// + /// Number of current MAC table entries + /// + public uint NumMacTables_u32; + + /// + /// Number of current IP table entries + /// + public uint NumIpTables_u32; + + /// + /// Last communication date and time + /// + public DateTime LastCommTime_dt; + + /// + /// Last login date and time + /// + public DateTime LastLoginTime_dt; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Number of accumulated logins + /// + public uint NumLogin_u32; + + /// + /// Whether the traffic information is provided + /// + public bool IsTrafficFilled_bool; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Ex.Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Ex.Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Ex.Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Ex.Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Ex.Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Ex.Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Ex.Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Ex.Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + } + + /// + /// Enumeration of HUB + /// + public class VpnRpcEnumHub + { + /// + /// Number of Virtual Hubs + /// + public uint NumHub_u32; + + /// + /// Virtual Hubs + /// + public VpnRpcEnumHubItem[] HubList; + } + + /// + /// Enumeration items of IP table + /// + public class VpnRpcEnumIpTableItem + { + /// + /// Key ID + /// + public uint Key_u32; + + /// + /// Session name + /// + public string SessionName_str; + + /// + /// IP address + /// + public string IpAddress_ip; + + /// + /// Assigned by the DHCP + /// + public bool DhcpAllocated_bool; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Updating date + /// + public DateTime UpdatedTime_dt; + + /// + /// Remote items + /// + public bool RemoteItem_bool; + + /// + /// Remote host name + /// + public string RemoteHostname_str; + } + + /// + /// Enumeration of IP table + /// + public class VpnRpcEnumIpTable + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// MAC table + /// + public VpnRpcEnumIpTableItem[] IpTable; + } + + /// + /// Layer-3 interface enumeration + /// + public class VpnRpcEnumL3If + { + /// + /// Layer-3 switch name + /// + public string Name_str; + + /// + /// Layer-3 interface list + /// + public VpnRpcL3If[] L3IFList; + } + + /// + /// Layer-3 switch enumeration item + /// + public class VpnRpcEnumL3SwItem + { + /// + /// Name of the layer-3 switch + /// + public string Name_str; + + /// + /// Number of layer-3 switch virtual interfaces + /// + public uint NumInterfaces_u32; + + /// + /// Number of routing tables + /// + public uint NumTables_u32; + + /// + /// Activated flag + /// + public bool Active_bool; + + /// + /// Online flag + /// + public bool Online_bool; + } + + /// + /// Layer-3 switch enumeration + /// + public class VpnRpcEnumL3Sw + { + /// + /// Layer-3 switch list + /// + public VpnRpcEnumL3SwItem[] L3SWList; + } + + /// + /// Routing table enumeration + /// + public class VpnRpcEnumL3Table + { + /// + /// L3 switch name + /// + public string Name_str; + + /// + /// Routing table item list + /// + public VpnRpcL3Table[] L3Table; + } + + /// + /// Cascade Connection Enumeration + /// + public class VpnRpcEnumLinkItem + { + /// + /// The name of cascade connection + /// + public string AccountName_utf; + + /// + /// Online flag + /// + public bool Online_bool; + + /// + /// The flag indicates whether the cascade connection is established + /// + public bool Connected_bool; + + /// + /// The error last occurred if the cascade connection is in the fail state + /// + public uint LastError_u32; + + /// + /// Connection completion time + /// + public DateTime ConnectedTime_dt; + + /// + /// Host name of the destination VPN server + /// + public string Hostname_str; + + /// + /// The Virtual Hub name + /// + public string TargetHubName_str; + } + + /// + /// Enumeration of the link + /// + public class VpnRpcEnumLink + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Number of cascade connections + /// + public uint NumLink_u32; + + /// + /// The list of cascade connections + /// + public VpnRpcEnumLinkItem[] LinkList; + } + + /// + /// List of listeners item + /// + public class VpnRpcListenerListItem + { + /// + /// TCP port number (range: 1 - 65535) + /// + public uint Ports_u32; + + /// + /// Active state + /// + public bool Enables_bool; + + /// + /// The flag to indicate if the error occurred on the listener port + /// + public bool Errors_bool; + } + + /// + /// List of listeners + /// + public class VpnRpcListenerList + { + /// + /// List of listener items + /// + public VpnRpcListenerListItem[] ListenerList; + } + + /// + /// Local Bridge enumeration + /// + public class VpnRpcEnumLocalBridge + { + /// + /// Local Bridge list + /// + public VpnRpcLocalBridge[] LocalBridgeList; + } + + /// + /// Log file enumeration + /// + public class VpnRpcEnumLogFileItem + { + /// + /// Server name + /// + public string ServerName_str; + + /// + /// File path + /// + public string FilePath_str; + + /// + /// File size + /// + public uint FileSize_u32; + + /// + /// Last write date + /// + public DateTime UpdatedTime_dt; + } + + /// + /// Log file enumeration + /// + public class VpnRpcEnumLogFile + { + /// + /// Log file list + /// + public VpnRpcEnumLogFileItem[] LogFiles; + } + + /// + /// Enumeration items of the MAC table + /// + public class VpnRpcEnumMacTableItem + { + /// + /// Key ID + /// + public uint Key_u32; + + /// + /// Session name + /// + public string SessionName_str; + + /// + /// MAC address + /// + public byte[] MacAddress_bin; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Updating date + /// + public DateTime UpdatedTime_dt; + + /// + /// Remote items + /// + public bool RemoteItem_bool; + + /// + /// Remote host name + /// + public string RemoteHostname_str; + + /// + /// VLAN ID + /// + public uint VlanId_u32; + } + + /// + /// Enumeration of the MAC table + /// + public class VpnRpcEnumMacTable + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// MAC table + /// + public VpnRpcEnumMacTableItem[] MacTable; + } + + /// + /// NAT Entry Protocol Number + /// + public enum VpnRpcNatProtocol + { + /// + /// TCP + /// + TCP = 0, + + /// + /// UDP + /// + UDP = 1, + + /// + /// DNS + /// + DNS = 2, + + /// + /// ICMP + /// + ICMP = 3, + } + + /// + /// State of NAT session (TCP) + /// + public enum VpnRpcNatTcpState + { + /// + /// Connecting + /// + Connecting = 0, + + /// + /// Send the RST (Connection failure or disconnected) + /// + SendReset = 1, + + /// + /// Connection complete + /// + Connected = 2, + + /// + /// Connection established + /// + Established = 3, + + /// + /// Wait for socket disconnection + /// + WaitDisconnect = 4, + } + + /// + /// VpnRpcEnumNat List Item + /// + public class VpnRpcEnumNatItem + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Protocol + /// + public VpnRpcNatProtocol Protocol_u32; + + /// + /// Source IP address + /// + public string SrcIp_ip; + + /// + /// Source host name + /// + public string SrcHost_str; + + /// + /// Source port number + /// + public uint SrcPort_u32; + + /// + /// Destination IP address + /// + public string DestIp_ip; + + /// + /// Destination host name + /// + public string DestHost_str; + + /// + /// Destination port number + /// + public uint DestPort_u32; + + /// + /// Connection time + /// + public DateTime CreatedTime_dt; + + /// + /// Last communication time + /// + public DateTime LastCommTime_dt; + + /// + /// Transmission size + /// + public ulong SendSize_u64; + + /// + /// Receive size + /// + public ulong RecvSize_u64; + + /// + /// TCP state + /// + public VpnRpcNatTcpState TcpStatus_u32; + } + + /// + /// RPC_ENUM_NAT + /// + public class VpnRpcEnumNat + { + /// + /// Virtual Hub Name + /// + public string HubName_str; + + /// + /// NAT item + /// + public VpnRpcEnumNatItem[] NatTable; + } + + /// + /// Enumeration item of VPN session + /// + public class VpnRpcEnumSessionItem + { + /// + /// Session name + /// + public string Name_str; + + /// + /// Remote session + /// + public bool RemoteSession_bool; + + /// + /// Remote server name + /// + public string RemoteHostname_str; + + /// + /// User name + /// + public string Username_str; + + /// + /// IP address + /// + public string ClientIP_ip; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// Maximum number of underlying TCP connections + /// + public uint MaxNumTcp_u32; + + /// + /// Number of current underlying TCP connections + /// + public uint CurrentNumTcp_u32; + + /// + /// Packet size transmitted + /// + public ulong PacketSize_u64; + + /// + /// Number of packets transmitted + /// + public ulong PacketNum_u64; + + /// + /// Is a Cascade VPN session + /// + public bool LinkMode_bool; + + /// + /// Is a SecureNAT VPN session + /// + public bool SecureNATMode_bool; + + /// + /// Is the VPN session for Local Bridge + /// + public bool BridgeMode_bool; + + /// + /// Is a Layer-3 Switch VPN session + /// + public bool Layer3Mode_bool; + + /// + /// Is in Bridge Mode + /// + public bool Client_BridgeMode_bool; + + /// + /// Is in Monitor Mode + /// + public bool Client_MonitorMode_bool; + + /// + /// VLAN ID + /// + public uint VLanId_u32; + + /// + /// Unique ID of the VPN Session + /// + public byte[] UniqueId_bin; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Last communication date and time + /// + public DateTime LastCommTime_dt; + } + + /// + /// Enumerate VPN sessions + /// + public class VpnRpcEnumSession + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// VPN sessions list + /// + public VpnRpcEnumSessionItem[] SessionList; + } + + /// + /// Enumeration item of user + /// + public class VpnRpcEnumUserItem + { + /// + /// User name + /// + public string Name_str; + + /// + /// Group name + /// + public string GroupName_str; + + /// + /// Real name + /// + public string Realname_utf; + + /// + /// Note + /// + public string Note_utf; + + /// + /// Authentication method + /// + public VpnRpcUserAuthType AuthType_u32; + + /// + /// Number of logins + /// + public uint NumLogin_u32; + + /// + /// Last login date and time + /// + public DateTime LastLoginTime_dt; + + /// + /// Access denied + /// + public bool DenyAccess_bool; + + /// + /// Flag of whether the traffic variable is set + /// + public bool IsTrafficFilled_bool; + + /// + /// Flag of whether expiration date variable is set + /// + public bool IsExpiresFilled_bool; + + /// + /// Expiration date + /// + public DateTime Expires_dt; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Ex.Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Ex.Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Ex.Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Ex.Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Ex.Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Ex.Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Ex.Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Ex.Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + } + + /// + /// Enumeration of user + /// + public class VpnRpcEnumUser + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// User list + /// + public VpnRpcEnumUserItem[] UserList; + } + + /// + /// Source IP Address Limit List Item + /// + public class VpnAc + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Priority + /// + public uint Priority_u32; + + /// + /// Deny access + /// + public bool Deny_bool; + + /// + /// Set true if you want to specify the SubnetMask_ip item. + /// + public bool Masked_bool; + + /// + /// IP address + /// + public string IpAddress_ip; + + /// + /// Subnet mask, valid only if Masked_bool == true + /// + public string SubnetMask_ip; + } + + /// + /// Source IP Address Limit List + /// + public class VpnRpcAcList + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Source IP Address Limit List + /// + public VpnAc[] ACList; + } + + /// + /// Message + /// + public class VpnRpcMsg + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Message (Unicode strings acceptable) + /// + public byte[] Msg_bin; + } + + /// + /// Get / Set the Azure state + /// + public class VpnRpcAzureStatus + { + /// + /// Whether VPN Azure Function is Enabled + /// + public bool IsEnabled_bool; + + /// + /// Whether connection to VPN Azure Cloud Server is established + /// + public bool IsConnected_bool; + } + + /// + /// Local Bridge support information + /// + public class VpnRpcBridgeSupport + { + /// + /// Whether the OS supports the Local Bridge function + /// + public bool IsBridgeSupportedOs_bool; + + /// + /// Whether WinPcap is necessary to install + /// + public bool IsWinPcapNeeded_bool; + } + + /// + /// Get the CA of HUB + /// + public class VpnRpcHubGetCA + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The key id of the certificate + /// + public uint Key_u32; + + /// + /// The body of the X.509 certificate + /// + public byte[] Cert_bin; + } + + /// + /// Caps item of the VPN Server + /// + public class VpnCaps + { + /// + /// Name + /// + public string CapsName_str; + + /// + /// Value + /// + public uint CapsValue_u32; + + /// + /// Descrption + /// + public string CapsDescrption_utf; + } + + /// + /// Caps list of the VPN Server + /// + public class VpnCapslist + { + /// + /// Caps list of the VPN Server + /// + public VpnCaps[] CapsList; + } + + /// + /// Config operation + /// + public class VpnRpcConfig + { + /// + /// File name (valid only for returning from the server) + /// + public string FileName_str; + + /// + /// File data + /// + public byte[] FileData_bin; + } + + /// + /// Connection information + /// + public class VpnRpcConnectionInfo + { + /// + /// Connection name + /// + public string Name_str; + + /// + /// Type + /// + public VpnRpcConnectionType Type_u32; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Port number + /// + public uint Port_u32; + + /// + /// Connected time + /// + public DateTime ConnectedTime_dt; + + /// + /// Server string + /// + public string ServerStr_str; + + /// + /// Server version + /// + public uint ServerVer_u32; + + /// + /// Server build number + /// + public uint ServerBuild_u32; + + /// + /// Client string + /// + public string ClientStr_str; + + /// + /// Client version + /// + public uint ClientVer_u32; + + /// + /// Client build number + /// + public uint ClientBuild_u32; + } + + /// + /// Proxy type + /// + public enum VpnRpcProxyType + { + /// + /// Direct TCP connection + /// + Direct = 0, + + /// + /// Connection via HTTP proxy server + /// + HTTP = 1, + + /// + /// Connection via SOCKS proxy server + /// + SOCKS = 2, + } + + /// + /// The current status of the DDNS + /// + public class VpnDDnsClientStatus + { + /// + /// Last error code (IPv4) + /// + public uint Err_IPv4_u32; + + /// + /// Last error string (IPv4) + /// + public string ErrStr_IPv4_utf; + + /// + /// Last error code (IPv6) + /// + public uint Err_IPv6_u32; + + /// + /// Last error string (IPv6) + /// + public string ErrStr_IPv6_utf; + + /// + /// Current DDNS host name + /// + public string CurrentHostName_str; + + /// + /// Current FQDN of the DDNS hostname + /// + public string CurrentFqdn_str; + + /// + /// DDNS suffix + /// + public string DnsSuffix_str; + + /// + /// Current IPv4 address of the VPN Server + /// + public string CurrentIPv4_str; + + /// + /// Current IPv6 address of the VPN Server + /// + public string CurrentIPv6_str; + } + + /// + /// Internet connection settings + /// + public class VpnInternetSetting + { + /// + /// Type of proxy server + /// + public VpnRpcProxyType ProxyType_u32; + + /// + /// Proxy server host name + /// + public string ProxyHostName_str; + + /// + /// Proxy server port number + /// + public uint ProxyPort_u32; + + /// + /// Proxy server user name + /// + public string ProxyUsername_str; + + /// + /// Proxy server password + /// + public string ProxyPassword_str; + } + + /// + /// Administration options + /// + public class VpnAdminOption + { + /// + /// Name + /// + public string Name_str; + + /// + /// Data + /// + public uint Value_u32; + + /// + /// Descrption + /// + public string Descrption_utf; + } + + /// + /// Administration options list + /// + public class VpnRpcAdminOption + { + /// + /// Virtual HUB name + /// + public string HubName_str; + + /// + /// List data + /// + public VpnAdminOption[] AdminOptionList; + } + + /// + /// Connection state to the controller + /// + public class VpnRpcFarmConnectionStatus + { + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Port number + /// + public uint Port_u32; + + /// + /// Online state + /// + public bool Online_bool; + + /// + /// Last error code + /// + public uint LastError_u32; + + /// + /// Connection start time + /// + public DateTime StartedTime_dt; + + /// + /// First connection time + /// + public DateTime FirstConnectedTime_dt; + + /// + /// Connection time of this time + /// + public DateTime CurrentConnectedTime_dt; + + /// + /// Number of retries + /// + public uint NumTry_u32; + + /// + /// Number of connection count + /// + public uint NumConnected_u32; + + /// + /// Connection failure count + /// + public uint NumFailed_u32; + } + + /// + /// HUB item of each farm member + /// + public class VpnRpcFarmHub + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Dynamic HUB + /// + public bool DynamicHub_bool; + } + + + /// + /// Server farm member information acquisition + /// + public class VpnRpcFarmInfo + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// The flag if the server is Cluster Controller (false: Cluster Member servers) + /// + public bool Controller_bool; + + /// + /// Connection Established Time + /// + public DateTime ConnectedTime_dt; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// Point + /// + public uint Point_u32; + + /// + /// Number of Public Ports + /// + public uint NumPort_u32; + + /// + /// Public Ports + /// + public uint[] Ports_u32; + + /// + /// Server certificate + /// + public byte[] ServerCert_bin; + + /// + /// Number of farm HUB + /// + public uint NumFarmHub_u32; + + /// + /// The hosted Virtual Hub list + /// + public VpnRpcFarmHub[] HubsList; + + /// + /// Number of hosted VPN sessions + /// + public uint NumSessions_u32; + + /// + /// Number of TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Performance Standard Ratio + /// + public uint Weight_u32; + } + + /// + /// Server farm configuration + /// + public class VpnRpcFarm + { + /// + /// Type of server + /// + public VpnRpcServerType ServerType_u32; + + /// + /// Valid only for Cluster Member servers. Number of the Ports_u32 element. + /// + public uint NumPort_u32; + + /// + /// Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers. + /// + public uint[] Ports_u32; + + /// + /// Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used. + /// + public string PublicIp_ip; + + /// + /// Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. + /// + public string ControllerName_str; + + /// + /// Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. + /// + public uint ControllerPort_u32; + + /// + /// Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller. + /// + public string MemberPasswordPlaintext_str; + + /// + /// This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used. + /// + public uint Weight_u32; + + /// + /// Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments. + /// + public bool ControllerOnly_bool; + } + + /// + /// Log switch type + /// + public enum VpnRpcLogSwitchType + { + /// + /// No switching + /// + No = 0, + + /// + /// Secondly basis + /// + Second = 1, + + /// + /// Minutely basis + /// + Minute = 2, + + /// + /// Hourly basis + /// + Hour = 3, + + /// + /// Daily basis + /// + Day = 4, + + /// + /// Monthly basis + /// + Month = 5, + } + + /// + /// Packet log settings + /// + public enum VpnRpcPacketLogSetting + { + /// + /// Not save + /// + None = 0, + + /// + /// Only header + /// + Header = 1, + + /// + /// All payloads + /// + All = 2, + } + + /// + /// Packet log settings array index + /// + public enum VpnRpcPacketLogSettingIndex + { + /// + /// TCP connection log + /// + TcpConnection = 0, + + /// + /// TCP packet log + /// + TcpAll = 1, + + /// + /// DHCP Log + /// + Dhcp = 2, + + /// + /// UDP log + /// + Udp = 3, + + /// + /// ICMP log + /// + Icmp = 4, + + /// + /// IP log + /// + Ip = 5, + + /// + /// ARP log + /// + Arp = 6, + + /// + /// Ethernet log + /// + Ethernet = 7, + } + + /// + /// HUB log settings + /// + public class VpnRpcHubLog + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The flag to enable / disable saving the security log + /// + public bool SaveSecurityLog_bool; + + /// + /// The log filename switching setting of the security log + /// + public VpnRpcLogSwitchType SecurityLogSwitchType_u32; + + /// + /// The flag to enable / disable saving the security log + /// + public bool SavePacketLog_bool; + + /// + /// The log filename switching settings of the packet logs + /// + public VpnRpcLogSwitchType PacketLogSwitchType_u32; + + /// + /// Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7. + /// + public VpnRpcPacketLogSetting[] PacketLogConfig_u32 = new VpnRpcPacketLogSetting[16]; + } + + /// + /// RADIUS server options + /// + public class VpnRpcRadius + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// RADIUS server name + /// + public string RadiusServerName_str; + + /// + /// RADIUS port number + /// + public uint RadiusPort_u32; + + /// + /// Secret key + /// + public string RadiusSecret_str; + + /// + /// Radius retry interval + /// + public uint RadiusRetryInterval_u32; + } + + /// + /// Get the state HUB + /// + public class VpnRpcHubStatus + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Online + /// + public bool Online_bool; + + /// + /// Type of HUB + /// + public VpnRpcHubType HubType_u32; + + /// + /// Number of sessions + /// + public uint NumSessions_u32; + + /// + /// Number of sessions (client mode) + /// + public uint NumSessionsClient_u32; + + /// + /// Number of sessions (bridge mode) + /// + public uint NumSessionsBridge_u32; + + /// + /// Number of Access list entries + /// + public uint NumAccessLists_u32; + + /// + /// Number of users + /// + public uint NumUsers_u32; + + /// + /// Number of groups + /// + public uint NumGroups_u32; + + /// + /// Number of MAC table entries + /// + public uint NumMacTables_u32; + + /// + /// Number of IP table entries + /// + public uint NumIpTables_u32; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + + /// + /// Whether SecureNAT is enabled + /// + public bool SecureNATEnabled_bool; + + /// + /// Last communication date and time + /// + public DateTime LastCommTime_dt; + + /// + /// Last login date and time + /// + public DateTime LastLoginTime_dt; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Number of logins + /// + public uint NumLogin_u32; + } + + /// + /// List of services provided by IPsec server + /// + public class VpnIPsecServices + { + /// + /// Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. + /// + public bool L2TP_Raw_bool; + + /// + /// Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option. + /// + public bool L2TP_IPsec_bool; + + /// + /// Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging. + /// + public bool EtherIP_IPsec_bool; + + /// + /// Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters. + /// + public string IPsec_Secret_str; + + /// + /// Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. + /// + public string L2TP_DefaultHub_str; + } + + /// + /// Keep alive protocol + /// + public enum VpnRpcKeepAliveProtocol + { + /// + /// TCP + /// + TCP = 0, + + /// + /// UDP + /// + UDP = 1, + } + + /// + /// Keep Alive settings + /// + public class VpnRpcKeep + { + /// + /// The flag to enable keep-alive to the Internet + /// + public bool UseKeepConnect_bool; + + /// + /// Specify the host name or IP address of the destination + /// + public string KeepConnectHost_str; + + /// + /// Specify the port number of the destination + /// + public uint KeepConnectPort_u32; + + /// + /// Protocol type + /// + public VpnRpcKeepAliveProtocol KeepConnectProtocol_u32; + + /// + /// Interval Between Packets Sends (Seconds) + /// + public uint KeepConnectInterval_u32; + } + + /// + /// State of the client session + /// + public enum VpnRpcClientSessionStatus + { + /// + /// Connecting + /// + Connecting = 0, + + /// + /// Negotiating + /// + Negotiation = 1, + + /// + /// During user authentication + /// + Auth = 2, + + /// + /// Connection complete + /// + Established = 3, + + /// + /// Wait to retry + /// + Retry = 4, + + /// + /// Idle state + /// + Idle = 5, + } + + /// + /// Get the link state + /// + public class VpnRpcLinkStatus + { + /// + /// The Virtual Hub name + /// + public string HubName_Ex_str; + + /// + /// The name of the cascade connection + /// + public string AccountName_utf; + + /// + /// The flag whether the cascade connection is enabled + /// + public bool Active_bool; + + /// + /// The flag whether the cascade connection is established + /// + public bool Connected_bool; + + /// + /// The session status + /// + public VpnRpcClientSessionStatus SessionStatus_u32; + + /// + /// The destination VPN server name + /// + public string ServerName_str; + + /// + /// The port number of the server + /// + public uint ServerPort_u32; + + /// + /// Server product name + /// + public string ServerProductName_str; + + /// + /// Server product version + /// + public uint ServerProductVer_u32; + + /// + /// Server product build number + /// + public uint ServerProductBuild_u32; + + /// + /// Server's X.509 certificate + /// + public byte[] ServerX_bin; + + /// + /// Client certificate + /// + public byte[] ClientX_bin; + + /// + /// Connection start time + /// + public DateTime StartTime_dt; + + /// + /// Connection completion time of the first connection + /// + public DateTime FirstConnectionEstablisiedTime_dt; + + /// + /// Connection completion time of this connection + /// + public DateTime CurrentConnectionEstablishTime_dt; + + /// + /// Number of connections have been established so far + /// + public uint NumConnectionsEatablished_u32; + + /// + /// Half-connection + /// + public bool HalfConnection_bool; + + /// + /// VoIP / QoS + /// + public bool QoS_bool; + + /// + /// Maximum number of the underlying TCP connections + /// + public uint MaxTcpConnections_u32; + + /// + /// Number of current underlying TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Number of underlying inbound TCP connections + /// + public uint NumTcpConnectionsUpload_u32; + + /// + /// Number of underlying outbound TCP connections + /// + public uint NumTcpConnectionsDownload_u32; + + /// + /// Use of encryption + /// + public bool UseEncrypt_bool; + + /// + /// Cipher algorithm name + /// + public string CipherName_str; + + /// + /// Use of compression + /// + public bool UseCompress_bool; + + /// + /// The flag whether this is a R-UDP session + /// + public bool IsRUDPSession_bool; + + /// + /// Underlying physical communication protocol + /// + public string UnderlayProtocol_str; + + /// + /// The UDP acceleration is enabled + /// + public bool IsUdpAccelerationEnabled_bool; + + /// + /// The UDP acceleration is being actually used + /// + public bool IsUsingUdpAcceleration_bool; + + /// + /// Session name + /// + public string SessionName_str; + + /// + /// Connection name + /// + public string ConnectionName_str; + + /// + /// Session key + /// + public byte[] SessionKey_bin; + + /// + /// Total transmitted data size + /// + public ulong TotalSendSize_u64; + + /// + /// Total received data size + /// + public ulong TotalRecvSize_u64; + + /// + /// Total transmitted data size (no compression) + /// + public ulong TotalSendSizeReal_u64; + + /// + /// Total received data size (no compression) + /// + public ulong TotalRecvSizeReal_u64; + + /// + /// The flag whether the VPN session is Bridge Mode + /// + public bool IsBridgeMode_bool; + + /// + /// The flag whether the VPN session is Monitor mode + /// + public bool IsMonitorMode_bool; + + /// + /// VLAN ID + /// + public uint VLanId_u32; + } + + /// + /// Setting of SSTP and OpenVPN + /// + public class VpnOpenVpnSstpConfig + { + /// + /// Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. + /// + public bool EnableOpenVPN_bool; + + /// + /// Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. + /// + public string OpenVPNPortList_str; + + /// + /// pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. + /// + public bool EnableSSTP_bool; + } + + /// + /// Virtual host option + /// + public class VpnVhOption + { + /// + /// Target Virtual HUB name + /// + public string RpcHubName_str; + + /// + /// MAC address + /// + public byte[] MacAddress_bin; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Subnet mask + /// + public string Mask_ip; + + /// + /// Use flag of the Virtual NAT function + /// + public bool UseNat_bool; + + /// + /// MTU value (Standard: 1500) + /// + public uint Mtu_u32; + + /// + /// NAT TCP timeout in seconds + /// + public uint NatTcpTimeout_u32; + + /// + /// NAT UDP timeout in seconds + /// + public uint NatUdpTimeout_u32; + + /// + /// Using flag of DHCP function + /// + public bool UseDhcp_bool; + + /// + /// Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) + /// + public string DhcpLeaseIPStart_ip; + + /// + /// Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) + /// + public string DhcpLeaseIPEnd_ip; + + /// + /// Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) + /// + public string DhcpSubnetMask_ip; + + /// + /// Specify the expiration date in second units for leasing an IP address to a client. + /// + public uint DhcpExpireTimeSpan_u32; + + /// + /// Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway. + /// + public string DhcpGatewayAddress_ip; + + /// + /// Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. + /// + public string DhcpDnsServerAddress_ip; + + /// + /// Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. + /// + public string DhcpDnsServerAddress2_ip; + + /// + /// Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name. + /// + public string DhcpDomainName_str; + + /// + /// Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting. + /// + public bool SaveLog_bool; + + /// + /// The flag to enable the DhcpPushRoutes_str field. + /// + public bool ApplyDhcpPushRoutes_bool; + + /// + /// Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes. + /// + public string DhcpPushRoutes_str; + } + + /// + /// RPC_NAT_STATUS + /// + public class VpnRpcNatStatus + { + /// + /// Virtual Hub Name + /// + public string HubName_str; + + /// + /// Number of TCP sessions + /// + public uint NumTcpSessions_u32; + + /// + /// Ntmber of UDP sessions + /// + public uint NumUdpSessions_u32; + + /// + /// Nymber of ICMP sessions + /// + public uint NumIcmpSessions_u32; + + /// + /// Number of DNS sessions + /// + public uint NumDnsSessions_u32; + + /// + /// Number of DHCP clients + /// + public uint NumDhcpClients_u32; + + /// + /// Whether the NAT is operating in the Kernel Mode + /// + public bool IsKernelMode_bool; + + /// + /// Whether the NAT is operating in the Raw IP Mode + /// + public bool IsRawIpMode_bool; + } + + /// + /// Key pair + /// + public class VpnRpcKeyPair + { + /// + /// The body of the certificate + /// + public byte[] Cert_bin; + + /// + /// The body of the private key + /// + public byte[] Key_bin; + } + + /// + /// Single string value + /// + public class VpnRpcStr + { + /// + /// A string value + /// + public string String_str; + } + + /// + /// Type of VPN Server + /// + public enum VpnRpcServerType + { + /// + /// Stand-alone server + /// + Standalone = 0, + + /// + /// Farm controller server + /// + FarmController = 1, + + /// + /// Farm member server + /// + FarmMember = 2, + } + + /// + /// Operating system type + /// + public enum VpnRpcOsType + { + /// + /// Windows 95 + /// + WINDOWS_95 = 1100, + + /// + /// Windows 98 + /// + WINDOWS_98 = 1200, + + /// + /// Windows Me + /// + WINDOWS_ME = 1300, + + /// + /// Windows (unknown) + /// + WINDOWS_UNKNOWN = 1400, + + /// + /// Windows NT 4.0 Workstation + /// + WINDOWS_NT_4_WORKSTATION = 2100, + + /// + /// Windows NT 4.0 Server + /// + WINDOWS_NT_4_SERVER = 2110, + + /// + /// Windows NT 4.0 Server, Enterprise Edition + /// + WINDOWS_NT_4_SERVER_ENTERPRISE = 2111, + + /// + /// Windows NT 4.0 Terminal Server + /// + WINDOWS_NT_4_TERMINAL_SERVER = 2112, + + /// + /// BackOffice Server 4.5 + /// + WINDOWS_NT_4_BACKOFFICE = 2113, + + /// + /// Small Business Server 4.5 + /// + WINDOWS_NT_4_SMS = 2114, + + /// + /// Windows 2000 Professional + /// + WINDOWS_2000_PROFESSIONAL = 2200, + + /// + /// Windows 2000 Server + /// + WINDOWS_2000_SERVER = 2211, + + /// + /// Windows 2000 Advanced Server + /// + WINDOWS_2000_ADVANCED_SERVER = 2212, + + /// + /// Windows 2000 Datacenter Server + /// + WINDOWS_2000_DATACENTER_SERVER = 2213, + + /// + /// BackOffice Server 2000 + /// + WINDOWS_2000_BACKOFFICE = 2214, + + /// + /// Small Business Server 2000 + /// + WINDOWS_2000_SBS = 2215, + + /// + /// Windows XP Home Edition + /// + WINDOWS_XP_HOME = 2300, + + /// + /// Windows XP Professional + /// + WINDOWS_XP_PROFESSIONAL = 2301, + + /// + /// Windows Server 2003 Web Edition + /// + WINDOWS_2003_WEB = 2410, + + /// + /// Windows Server 2003 Standard Edition + /// + WINDOWS_2003_STANDARD = 2411, + + /// + /// Windows Server 2003 Enterprise Edition + /// + WINDOWS_2003_ENTERPRISE = 2412, + + /// + /// Windows Server 2003 DataCenter Edition + /// + WINDOWS_2003_DATACENTER = 2413, + + /// + /// BackOffice Server 2003 + /// + WINDOWS_2003_BACKOFFICE = 2414, + + /// + /// Small Business Server 2003 + /// + WINDOWS_2003_SBS = 2415, + + /// + /// Windows Vista + /// + WINDOWS_LONGHORN_PROFESSIONAL = 2500, + + /// + /// Windows Server 2008 + /// + WINDOWS_LONGHORN_SERVER = 2510, + + /// + /// Windows 7 + /// + WINDOWS_7 = 2600, + + /// + /// Windows Server 2008 R2 + /// + WINDOWS_SERVER_2008_R2 = 2610, + + /// + /// Windows 8 + /// + WINDOWS_8 = 2700, + + /// + /// Windows Server 2012 + /// + WINDOWS_SERVER_8 = 2710, + + /// + /// Windows 8.1 + /// + WINDOWS_81 = 2701, + + /// + /// Windows Server 2012 R2 + /// + WINDOWS_SERVER_81 = 2711, + + /// + /// Windows 10 + /// + WINDOWS_10 = 2702, + + /// + /// Windows Server 10 + /// + WINDOWS_SERVER_10 = 2712, + + /// + /// Windows 11 or later + /// + WINDOWS_11 = 2800, + + /// + /// Windows Server 11 or later + /// + WINDOWS_SERVER_11 = 2810, + + /// + /// Unknown UNIX + /// + UNIX_UNKNOWN = 3000, + + /// + /// Linux + /// + LINUX = 3100, + + /// + /// Solaris + /// + SOLARIS = 3200, + + /// + /// Cygwin + /// + CYGWIN = 3300, + + /// + /// BSD + /// + BSD = 3400, + + /// + /// MacOS X + /// + MACOS_X = 3500, + } + + /// + /// VPN Server Information + /// + public class VpnRpcServerInfo + { + /// + /// Server product name + /// + public string ServerProductName_str; + + /// + /// Server version string + /// + public string ServerVersionString_str; + + /// + /// Server build information string + /// + public string ServerBuildInfoString_str; + + /// + /// Server version integer value + /// + public uint ServerVerInt_u32; + + /// + /// Server build number integer value + /// + public uint ServerBuildInt_u32; + + /// + /// Server host name + /// + public string ServerHostName_str; + + /// + /// Type of server + /// + public VpnRpcServerType ServerType_u32; + + /// + /// Build date and time of the server + /// + public DateTime ServerBuildDate_dt; + + /// + /// Family name + /// + public string ServerFamilyName_str; + + /// + /// OS type + /// + public VpnRpcOsType OsType_u32; + + /// + /// Service pack number + /// + public uint OsServicePack_u32; + + /// + /// OS system name + /// + public string OsSystemName_str; + + /// + /// OS product name + /// + public string OsProductName_str; + + /// + /// OS vendor name + /// + public string OsVendorName_str; + + /// + /// OS version + /// + public string OsVersion_str; + + /// + /// Kernel name + /// + public string KernelName_str; + + /// + /// Kernel version + /// + public string KernelVersion_str; + } + + /// + /// Server status + /// + public class VpnRpcServerStatus + { + /// + /// Type of server + /// + public VpnRpcServerType ServerType_u32; + + /// + /// Total number of TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Number of Local TCP connections + /// + public uint NumTcpConnectionsLocal_u32; + + /// + /// Number of remote TCP connections + /// + public uint NumTcpConnectionsRemote_u32; + + /// + /// Total number of HUBs + /// + public uint NumHubTotal_u32; + + /// + /// Nymber of stand-alone HUB + /// + public uint NumHubStandalone_u32; + + /// + /// Number of static HUBs + /// + public uint NumHubStatic_u32; + + /// + /// Number of Dynamic HUBs + /// + public uint NumHubDynamic_u32; + + /// + /// Total number of sessions + /// + public uint NumSessionsTotal_u32; + + /// + /// Number of local VPN sessions + /// + public uint NumSessionsLocal_u32; + + /// + /// The number of remote sessions + /// + public uint NumSessionsRemote_u32; + + /// + /// Number of MAC table entries (total sum of all Virtual Hubs) + /// + public uint NumMacTables_u32; + + /// + /// Number of IP table entries (total sum of all Virtual Hubs) + /// + public uint NumIpTables_u32; + + /// + /// Number of users (total sum of all Virtual Hubs) + /// + public uint NumUsers_u32; + + /// + /// Number of groups (total sum of all Virtual Hubs) + /// + public uint NumGroups_u32; + + /// + /// Number of assigned bridge licenses (Useful to make a commercial version) + /// + public uint AssignedBridgeLicenses_u32; + + /// + /// Number of assigned client licenses (Useful to make a commercial version) + /// + public uint AssignedClientLicenses_u32; + + /// + /// Number of Assigned bridge license (cluster-wide), useful to make a commercial version + /// + public uint AssignedBridgeLicensesTotal_u32; + + /// + /// Number of assigned client licenses (cluster-wide), useful to make a commercial version + /// + public uint AssignedClientLicensesTotal_u32; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + + /// + /// Current time + /// + public DateTime CurrentTime_dt; + + /// + /// 64 bit High-Precision Logical System Clock + /// + public ulong CurrentTick_u64; + + /// + /// VPN Server Start-up time + /// + public DateTime StartTime_dt; + + /// + /// Memory information: Total Memory + /// + public ulong TotalMemory_u64; + + /// + /// Memory information: Used Memory + /// + public ulong UsedMemory_u64; + + /// + /// Memory information: Free Memory + /// + public ulong FreeMemory_u64; + + /// + /// Memory information: Total Phys + /// + public ulong TotalPhys_u64; + + /// + /// Memory information: Used Phys + /// + public ulong UsedPhys_u64; + + /// + /// Memory information: Free Phys + /// + public ulong FreePhys_u64; + } + + /// + /// VPN Session status + /// + public class VpnRpcSessionStatus + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// VPN session name + /// + public string Name_str; + + /// + /// User name + /// + public string Username_str; + + /// + /// Real user name which was used for the authentication + /// + public string RealUsername_str; + + /// + /// Group name + /// + public string GroupName_str; + + /// + /// Is Cascade Session + /// + public bool LinkMode_bool; + + /// + /// Client IP address + /// + public string Client_Ip_Address_ip; + + /// + /// Client host name + /// + [JsonProperty("SessionStatus_ClientHostName_str")] + public string ClientHostName_str; + + /// + /// Operation flag + /// + public bool Active_bool; + + /// + /// Connected flag + /// + public bool Connected_bool; + + /// + /// State of the client session + /// + public VpnRpcClientSessionStatus SessionStatus_u32; + + /// + /// Server name + /// + public string ServerName_str; + + /// + /// Port number of the server + /// + public uint ServerPort_u32; + + /// + /// Server product name + /// + public string ServerProductName_str; + + /// + /// Server product version + /// + public uint ServerProductVer_u32; + + /// + /// Server product build number + /// + public uint ServerProductBuild_u32; + + /// + /// Connection start time + /// + public DateTime StartTime_dt; + + /// + /// Connection completion time of the first connection + /// + public DateTime FirstConnectionEstablisiedTime_dt; + + /// + /// Connection completion time of this connection + /// + public DateTime CurrentConnectionEstablishTime_dt; + + /// + /// Number of connections have been established so far + /// + public uint NumConnectionsEatablished_u32; + + /// + /// Half-connection + /// + public bool HalfConnection_bool; + + /// + /// VoIP / QoS + /// + public bool QoS_bool; + + /// + /// Maximum number of the underlying TCP connections + /// + public uint MaxTcpConnections_u32; + + /// + /// Number of current underlying TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Number of inbound underlying connections + /// + public uint NumTcpConnectionsUpload_u32; + + /// + /// Number of outbound underlying connections + /// + public uint NumTcpConnectionsDownload_u32; + + /// + /// Use of encryption + /// + public bool UseEncrypt_bool; + + /// + /// Cipher algorithm name + /// + public string CipherName_str; + + /// + /// Use of compression + /// + public bool UseCompress_bool; + + /// + /// Is R-UDP session + /// + public bool IsRUDPSession_bool; + + /// + /// Physical underlying communication protocol + /// + public string UnderlayProtocol_str; + + /// + /// The UDP acceleration is enabled + /// + public bool IsUdpAccelerationEnabled_bool; + + /// + /// Using the UDP acceleration function + /// + public bool IsUsingUdpAcceleration_bool; + + /// + /// VPN session name + /// + public string SessionName_str; + + /// + /// Connection name + /// + public string ConnectionName_str; + + /// + /// Session key + /// + public byte[] SessionKey_bin; + + /// + /// Total transmitted data size + /// + public ulong TotalSendSize_u64; + + /// + /// Total received data size + /// + public ulong TotalRecvSize_u64; + + /// + /// Total transmitted data size (no compression) + /// + public ulong TotalSendSizeReal_u64; + + /// + /// Total received data size (no compression) + /// + public ulong TotalRecvSizeReal_u64; + + /// + /// Is Bridge Mode + /// + public bool IsBridgeMode_bool; + + /// + /// Is Monitor mode + /// + public bool IsMonitorMode_bool; + + /// + /// VLAN ID + /// + public uint VLanId_u32; + + /// + /// Client product name + /// + public string ClientProductName_str; + + /// + /// Client version + /// + public uint ClientProductVer_u32; + + /// + /// Client build number + /// + public uint ClientProductBuild_u32; + + /// + /// Client OS name + /// + public string ClientOsName_str; + + /// + /// Client OS version + /// + public string ClientOsVer_str; + + /// + /// Client OS Product ID + /// + public string ClientOsProductId_str; + + /// + /// Client host name + /// + public string ClientHostname_str; + + /// + /// Unique ID + /// + public byte[] UniqueId_bin; + } + + /// + /// Set the special listener + /// + public class VpnRpcSpecialListener + { + /// + /// The flag to activate the VPN over ICMP server function + /// + public bool VpnOverIcmpListener_bool; + + /// + /// The flag to activate the VPN over DNS function + /// + public bool VpnOverDnsListener_bool; + } + + /// + /// Syslog configuration + /// + public enum VpnSyslogSaveType + { + /// + /// Do not use syslog + /// + None = 0, + + /// + /// Only server log + /// + ServerLog = 1, + + /// + /// Server and Virtual HUB security log + /// + ServerAndHubSecurityLog = 2, + + /// + /// Server, Virtual HUB security, and packet log + /// + ServerAndHubAllLog = 3, + } + + /// + /// Syslog configuration + /// + public class VpnSyslogSetting + { + /// + /// The behavior of the syslog function + /// + public VpnSyslogSaveType SaveType_u32; + + /// + /// Specify the host name or IP address of the syslog server + /// + public string Hostname_str; + + /// + /// Specify the port number of the syslog server + /// + public uint Port_u32; + } + + /// + /// VPN Gate Server Config + /// + public class VpnVgsConfig + { + /// + /// Active flag + /// + public bool IsEnabled_bool; + + /// + /// Message + /// + public string Message_utf; + + /// + /// Owner name + /// + public string Owner_utf; + + /// + /// Abuse email + /// + public string Abuse_utf; + + /// + /// Log save flag + /// + public bool NoLog_bool; + + /// + /// Save log permanently + /// + public bool LogPermanent_bool; + + /// + /// Enable the L2TP VPN function + /// + public bool EnableL2TP_bool; + } + + /// + /// Read a Log file + /// + public class VpnRpcReadLogFile + { + /// + /// Server name + /// + public string ServerName_str; + + /// + /// File Path + /// + public string FilePath_str; + + /// + /// Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field. + /// + public uint Offset_u32; + + /// + /// Received buffer + /// + public byte[] Buffer_bin; + } + + /// + /// Rename link + /// + public class VpnRpcRenameLink + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The old name of the cascade connection + /// + public string OldAccountName_utf; + + /// + /// The new name of the cascade connection + /// + public string NewAccountName_utf; + } + + /// + /// Online or offline the HUB + /// + public class VpnRpcSetHubOnline + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Online / offline flag + /// + public bool Online_bool; + } + + /// + /// Set Password + /// + public class VpnRpcSetPassword + { + /// + /// The plaintext password + /// + public string PlainTextPassword_str; + } + +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/Main.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/Main.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/Main.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/Main.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,17 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// Program.cs - The Main() entry point +// +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + +class Program +{ + static void Main(string[] args) + { + VPNRPCTest test = new VPNRPCTest(); + test.Test_All(); + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/VpnServerRpcTest.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/VpnServerRpcTest.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/VpnServerRpcTest.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/VpnServerRpcTest.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,3736 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// VpnServerRpcTest.cs - Test sample code for SoftEther VPN Server JSON-RPC Stub +// +// This sample code shows how to call all available RPC functions. +// You can copy and paste test code to write your own C# codes. +// +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + +using System; +using SoftEther.VPNServerRpc; + +class VPNRPCTest +{ + VpnServerRpc api; + + Random rand = new Random(); + + string hub_name = "TEST"; + + public VPNRPCTest() + { + api = new VpnServerRpc("127.0.0.1", 443, "PASSWORD_HERE", ""); // Speficy your VPN Server's password here. + } + + /// + /// Tests all VPN APIs + /// + public void Test_All() + { + hub_name = "TEST"; + + Test_Test(); + + Test_GetServerInfo(); + Test_GetServerStatus(); + + uint new_listener_port = Test_CreateListener(); + Test_EnableListener(new_listener_port, false); + Test_EnumListener(); + Test_EnableListener(new_listener_port, true); + Test_EnumListener(); + Test_DeleteListener(new_listener_port); + + Test_SetServerPassword(); + + Test_GetFarmSetting(); + + if (false) + { + + Test_SetFarmSetting(); + + VpnRpcEnumFarm farm_members = Test_EnumFarmMember(); + + foreach (VpnRpcEnumFarmItem farm_member in farm_members.FarmMemberList) + { + Test_GetFarmInfo(farm_member.Id_u32); + } + + Test_GetFarmConnectionStatus(); + } + else if (false) + { + Console.WriteLine("abc"); + } + else + { + Console.WriteLine("def"); + } + + Test_GetServerCert(); + + Test_SetServerCert(); + + Test_GetServerCipher(); + + Test_SetServerCipher(); + + VpnRpcEnumConnection enum_connection = Test_EnumConnection(); + + foreach (VpnRpcEnumConnectionItem connecton in enum_connection.ConnectionList) + { + Test_GetConnectionInfo(connecton.Name_str); + //Test_DisconnectConnection(connecton.Name_str); + } + + hub_name = Test_CreateHub(); + + Test_SetHub(); + Test_GetHub(); + Test_EnumHub(); + Test_SetHubRadius(); + Test_GetHubRadius(); + + Test_SetHubOnline(); + Test_GetHubStatus(); + + VpnRpcHubLog hub_log_settings = Test_GetHubLog(); + Test_SetHubLog(hub_log_settings); + + Test_AddCa(); + VpnRpcHubEnumCA enum_ca = Test_EnumCa(); + foreach (VpnRpcHubEnumCAItem ca in enum_ca.CAList) + { + Test_GetCa(ca.Key_u32); + Test_DeleteCa(ca.Key_u32); + } + + Test_CreateLink(); + Test_GetLink(); + Test_SetLink(); + Test_SetLinkOffline(); + Test_SetLinkOnline(); + VpnRpcEnumLink enum_link = Test_EnumLink(); + foreach (var link in enum_link.LinkList) + { + Test_GetLinkStatus(link.AccountName_utf); + } + System.Threading.Thread.Sleep(3000); + Test_RenameLink(); + Test_DeleteLink(); + + Test_AddAccess(); + Test_EnumAccess(); + Test_DeleteAccess(); + Test_SetAccessList(); + + Test_CreateGroup(); + Test_SetGroup(); + Test_GetGroup(); + + Test_CreateUser(); + Test_SetUser(); + Test_GetUser(); + Test_EnumUser(); + Test_EnumGroup(); + + Test_DeleteUser(); + Test_DeleteGroup(); + + VpnRpcEnumSession enum_session = Test_EnumSession(); + + foreach (VpnRpcEnumSessionItem session in enum_session.SessionList) + { + Test_GetSessionStatus(session.Name_str); + + Test_DeleteSession(session.Name_str); + } + + VpnRpcEnumMacTable enum_mac = Test_EnumMacTable(); + + foreach (VpnRpcEnumMacTableItem mac in enum_mac.MacTable) + { + Test_DeleteMacTable(mac.Key_u32); + } + + VpnRpcEnumIpTable enum_ip = Test_EnumIpTable(); + + foreach (VpnRpcEnumIpTableItem ip in enum_ip.IpTable) + { + Test_DeleteIpTable(ip.Key_u32); + } + + Test_SetKeep(); + Test_GetKeep(); + + Test_EnableSecureNAT(); + Test_GetSecureNATOption(); + Test_SetSecureNATOption(); + Test_EnumNAT(); + Test_EnumDHCP(); + Test_GetSecureNATStatus(); + Test_DisableSecureNAT(); + + Test_EnumEthernet(); + //Test_AddLocalBridge(); + Test_EnumLocalBridge(); + //Test_DeleteLocalBridge(); + Test_GetBridgeSupport(); + + Test_GetCaps(); + Test_GetConfig(); + //Test_SetConfig(); + + Test_GetDefaultHubAdminOptions(); + Test_GetHubAdminOptions(); + Test_SetHubAdminOptions(); + Test_GetHubExtOptions(); + Test_SetHubExtOptions(); + + Test_AddL3Switch(); + Test_AddL3If(); + Test_EnumL3Switch(); + Test_EnumL3If(); + Test_AddL3Table(); + Test_EnumL3Table(); + Test_DelL3Table(); + Test_StartL3Switch(); + Test_StopL3Switch(); + Test_DelL3If(); + Test_DelL3Switch(); + + Test_AddCrl(); + VpnRpcEnumCrl enum_crl = Test_EnumCrl(); + foreach (VpnRpcEnumCrlItem crl in enum_crl.CRLList) + { + VpnRpcCrl got_crl = Test_GetCrl(crl.Key_u32); + + got_crl.CommonName_utf = got_crl.CommonName_utf + "_a"; + Test_SetCrl(got_crl); + } + + enum_crl = Test_EnumCrl(); + foreach (VpnRpcEnumCrlItem crl in enum_crl.CRLList) + { + Test_DelCrl(crl.Key_u32); + } + + Test_SetAcList(); + Test_GetAcList(); + + VpnRpcEnumLogFile enum_log_file = Test_EnumLogFile(); + foreach (VpnRpcEnumLogFileItem log in enum_log_file.LogFiles) + { + Test_ReadLogFile(log.FilePath_str); + + break; + } + + Test_SetSysLog(true); + Test_GetSysLog(); + Test_SetSysLog(false); + + Test_SetHubMsg(); + Test_GetHubMsg(); + Test_GetAdminMsg(); + Test_Flush(); + + Test_SetIPsecServices(); + Test_GetIPsecServices(); + + Test_AddEtherIpId(); + VpnRpcEnumEtherIpId enum_etherip_id = Test_EnumEtherIpId(); + foreach (VpnEtherIpId etherip_id in enum_etherip_id.Settings) + { + Test_GetEtherIpId(etherip_id.Id_str); + Test_DeleteEtherIpId(etherip_id.Id_str); + } + + Test_SetOpenVpnSstpConfig(); + Test_GetOpenVpnSstpConfig(); + + Test_GetDDnsClientStatus(); + Test_SetDDnsInternetSettng(); + Test_GetDDnsInternetSettng(); + + Test_ChangeDDnsClientHostname(); + Test_RegenerateServerCert(); + Test_MakeOpenVpnConfigFile(); + Test_SetSpecialListener(); + Test_GetSpecialListener(); + + Test_GetAzureStatus(); + Test_SetAzureStatus(); + Test_SetVgsConfig(); + Test_GetVgsConfig(); + + Test_DeleteHub(); + //Test_RebootServer(); + + return; + } + + + /// + /// API test for 'Test', test RPC function + /// + public void Test_Test() + { + Console.WriteLine("Begin: Test_Test"); + + VpnRpcTest a = new VpnRpcTest() { IntValue_u32 = 12345 }; + + VpnRpcTest b = api.Test(a); + + print_object(b); + + Console.WriteLine("End: Test_Test"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetServerInfo', Get server information + /// + public void Test_GetServerInfo() + { + Console.WriteLine("Begin: Test_GetServerInfo"); + + VpnRpcServerInfo info = api.GetServerInfo(); + + print_object(info); + + Console.WriteLine("End: Test_GetServerInfo"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetServerStatus', Get server status + /// + public void Test_GetServerStatus() + { + Console.WriteLine("Begin: Test_GetServerStatus"); + + VpnRpcServerStatus out_rpc_server_status = api.GetServerStatus(); + + print_object(out_rpc_server_status); + + Console.WriteLine("End: Test_GetServerStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateListener', Create a listener + /// + public uint Test_CreateListener() + { + Console.WriteLine("Begin: Test_CreateListener"); + + uint port = (uint)rand.Next(1025, 65534); + + Console.WriteLine("Creating a new listener port: Port " + port); + VpnRpcListener in_rpc_listener = new VpnRpcListener() { Enable_bool = true, Port_u32 = port, }; + VpnRpcListener out_rpc_listener = api.CreateListener(in_rpc_listener); + + Console.WriteLine("Done."); + Console.WriteLine("End: Test_CreateListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return port; + } + + /// + /// API test for 'EnumListener', Enumerating listeners + /// + public void Test_EnumListener() + { + Console.WriteLine("Begin: Test_EnumListener"); + + VpnRpcListenerList out_rpc_listener_list = api.EnumListener(); + + print_object(out_rpc_listener_list); + + Console.WriteLine("End: Test_EnumListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteListener', Delete a listener + /// + public void Test_DeleteListener(uint port) + { + Console.WriteLine("Begin: Test_DeleteListener"); + + Console.WriteLine("Deleting a new listener port: Port" + port); + VpnRpcListener in_rpc_listener = new VpnRpcListener() { Port_u32 = port }; + VpnRpcListener out_rpc_listener = api.DeleteListener(in_rpc_listener); + + Console.WriteLine("Done."); + Console.WriteLine("End: Test_DeleteListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnableListener', Enable / Disable listener + /// + public void Test_EnableListener(uint port, bool enabled) + { + Console.WriteLine("Begin: Test_EnableListener"); + + if (enabled) + { + Console.WriteLine("Enabling listener port = " + port); + } + else + { + Console.WriteLine("Disabling listener port = " + port); + } + + VpnRpcListener in_rpc_listener = new VpnRpcListener() { Port_u32 = port, Enable_bool = enabled }; + VpnRpcListener out_rpc_listener = api.EnableListener(in_rpc_listener); + + Console.WriteLine("Done."); + + Console.WriteLine("End: Test_EnableListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetServerPassword', Set server password + /// + public void Test_SetServerPassword() + { + string password = "microsoft"; + + Console.WriteLine("Begin: Test_SetServerPassword"); + + Console.WriteLine("Set the server administrator password to '" + password + "'."); + + VpnRpcSetPassword in_rpc_set_password = new VpnRpcSetPassword() { PlainTextPassword_str = password }; + VpnRpcSetPassword out_rpc_set_password = api.SetServerPassword(in_rpc_set_password); + + Console.WriteLine("Done."); + + Console.WriteLine("End: Test_SetServerPassword"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetFarmSetting', Set clustering configuration + /// + public void Test_SetFarmSetting() + { + Console.WriteLine("Begin: Test_SetFarmSetting"); + + VpnRpcFarm in_rpc_farm = new VpnRpcFarm() + { + ServerType_u32 = VpnRpcServerType.FarmController, + NumPort_u32 = 2, + Ports_u32 = new uint[] { 443, 444, 445 }, + PublicIp_ip = "1.2.3.4", + ControllerName_str = "controller", + MemberPasswordPlaintext_str = "microsoft", + ControllerPort_u32 = 443, + Weight_u32 = 100, + ControllerOnly_bool = false, + }; + + VpnRpcFarm out_rpc_farm = api.SetFarmSetting(in_rpc_farm); + + Console.WriteLine("End: Test_SetFarmSetting"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetFarmSetting', Get clustering configuration + /// + public void Test_GetFarmSetting() + { + Console.WriteLine("Begin: Test_GetFarmSetting"); + + // VpnRpcFarm in_rpc_farm = new VpnRpcFarm(); + VpnRpcFarm out_rpc_farm = api.GetFarmSetting(); + + print_object(out_rpc_farm); + + Console.WriteLine("End: Test_GetFarmSetting"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetFarmInfo', Get cluster member information + /// + public void Test_GetFarmInfo(uint id) + { + Console.WriteLine("Begin: Test_GetFarmInfo"); + + VpnRpcFarmInfo in_rpc_farm_info = new VpnRpcFarmInfo() { Id_u32 = id }; + VpnRpcFarmInfo out_rpc_farm_info = api.GetFarmInfo(in_rpc_farm_info); + + print_object(out_rpc_farm_info); + + Console.WriteLine("End: Test_GetFarmInfo"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumFarmMember', Enumerate cluster members + /// + public VpnRpcEnumFarm Test_EnumFarmMember() + { + Console.WriteLine("Begin: Test_EnumFarmMember"); + + VpnRpcEnumFarm out_rpc_enum_farm = api.EnumFarmMember(); + + print_object(out_rpc_enum_farm); + + Console.WriteLine("End: Test_EnumFarmMember"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_farm; + } + + /// + /// API test for 'GetFarmConnectionStatus', Get status of connection to cluster controller + /// + public void Test_GetFarmConnectionStatus() + { + Console.WriteLine("Begin: Test_GetFarmConnectionStatus"); + + VpnRpcFarmConnectionStatus out_rpc_farm_connection_status = api.GetFarmConnectionStatus(); + + print_object(out_rpc_farm_connection_status); + + Console.WriteLine("End: Test_GetFarmConnectionStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetServerCert', Set the server certification + /// + public void Test_SetServerCert() + { + Console.WriteLine("Begin: Test_SetServerCert"); + + VpnRpcKeyPair in_rpc_key_pair = new VpnRpcKeyPair() + { + Cert_bin = new byte[] + { +0x2d,0x2d,0x2d,0x2d,0x2d,0x42,0x45,0x47,0x49,0x4e,0x20,0x43,0x45,0x52,0x54,0x49, +0x46,0x49,0x43,0x41,0x54,0x45,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x4d,0x49,0x49,0x44, +0x72,0x6a,0x43,0x43,0x41,0x70,0x61,0x67,0x41,0x77,0x49,0x42,0x41,0x67,0x49,0x42, +0x41,0x44,0x41,0x4e,0x42,0x67,0x6b,0x71,0x68,0x6b,0x69,0x47,0x39,0x77,0x30,0x42, +0x41,0x51,0x73,0x46,0x41,0x44,0x42,0x57,0x4d,0x51,0x77,0x77,0x43,0x67,0x59,0x44, +0x56,0x51,0x51,0x44,0x44,0x41,0x4e,0x68,0x59,0x57,0x45,0x78,0x0a,0x46,0x54,0x41, +0x54,0x42,0x67,0x4e,0x56,0x42,0x41,0x6f,0x4d,0x44,0x4f,0x4f,0x42,0x72,0x2b,0x4f, +0x42,0x71,0x75,0x4f,0x42,0x6a,0x2b,0x4f,0x42,0x6e,0x54,0x45,0x4c,0x4d,0x41,0x6b, +0x47,0x41,0x31,0x55,0x45,0x42,0x68,0x4d,0x43,0x53,0x6c,0x41,0x78,0x45,0x44,0x41, +0x4f,0x42,0x67,0x4e,0x56,0x42,0x41,0x67,0x4d,0x42,0x30,0x6c,0x69,0x0a,0x59,0x58, +0x4a,0x68,0x61,0x32,0x6b,0x78,0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56,0x42,0x41, +0x63,0x4d,0x42,0x31,0x52,0x7a,0x64,0x57,0x74,0x31,0x59,0x6d,0x45,0x77,0x48,0x68, +0x63,0x4e,0x4d,0x54,0x67,0x78,0x4d,0x44,0x45,0x78,0x4d,0x6a,0x4d,0x7a,0x4e,0x54, +0x41,0x78,0x57,0x68,0x63,0x4e,0x4e,0x44,0x49,0x78,0x4d,0x44,0x41,0x31,0x0a,0x4d, +0x6a,0x4d,0x7a,0x4e,0x54,0x41,0x78,0x57,0x6a,0x42,0x57,0x4d,0x51,0x77,0x77,0x43, +0x67,0x59,0x44,0x56,0x51,0x51,0x44,0x44,0x41,0x4e,0x68,0x59,0x57,0x45,0x78,0x46, +0x54,0x41,0x54,0x42,0x67,0x4e,0x56,0x42,0x41,0x6f,0x4d,0x44,0x4f,0x4f,0x42,0x72, +0x2b,0x4f,0x42,0x71,0x75,0x4f,0x42,0x6a,0x2b,0x4f,0x42,0x6e,0x54,0x45,0x4c,0x0a, +0x4d,0x41,0x6b,0x47,0x41,0x31,0x55,0x45,0x42,0x68,0x4d,0x43,0x53,0x6c,0x41,0x78, +0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56,0x42,0x41,0x67,0x4d,0x42,0x30,0x6c,0x69, +0x59,0x58,0x4a,0x68,0x61,0x32,0x6b,0x78,0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56, +0x42,0x41,0x63,0x4d,0x42,0x31,0x52,0x7a,0x64,0x57,0x74,0x31,0x59,0x6d,0x45,0x77, +0x0a,0x67,0x67,0x45,0x69,0x4d,0x41,0x30,0x47,0x43,0x53,0x71,0x47,0x53,0x49,0x62, +0x33,0x44,0x51,0x45,0x42,0x41,0x51,0x55,0x41,0x41,0x34,0x49,0x42,0x44,0x77,0x41, +0x77,0x67,0x67,0x45,0x4b,0x41,0x6f,0x49,0x42,0x41,0x51,0x44,0x58,0x45,0x63,0x76, +0x72,0x59,0x37,0x56,0x2b,0x7a,0x64,0x42,0x79,0x72,0x64,0x4e,0x78,0x4a,0x59,0x45, +0x6d,0x0a,0x61,0x41,0x4e,0x59,0x55,0x4f,0x37,0x76,0x57,0x34,0x68,0x64,0x41,0x35, +0x49,0x42,0x49,0x46,0x6d,0x4d,0x70,0x6e,0x62,0x79,0x69,0x4e,0x6e,0x5a,0x77,0x36, +0x57,0x39,0x6f,0x61,0x67,0x78,0x33,0x5a,0x49,0x65,0x65,0x48,0x56,0x59,0x62,0x52, +0x69,0x4b,0x36,0x41,0x66,0x46,0x74,0x53,0x31,0x32,0x2b,0x45,0x31,0x4d,0x59,0x31, +0x64,0x32,0x0a,0x61,0x71,0x51,0x31,0x53,0x72,0x49,0x43,0x39,0x51,0x35,0x55,0x6e, +0x5a,0x61,0x42,0x72,0x62,0x57,0x32,0x32,0x6d,0x4e,0x75,0x6c,0x4d,0x34,0x2f,0x6c, +0x49,0x4a,0x72,0x48,0x70,0x51,0x55,0x68,0x50,0x78,0x6f,0x62,0x79,0x34,0x2f,0x36, +0x4e,0x41,0x37,0x71,0x4b,0x67,0x55,0x48,0x69,0x79,0x4f,0x64,0x33,0x4a,0x42,0x70, +0x4f,0x66,0x77,0x0a,0x38,0x54,0x76,0x53,0x74,0x51,0x78,0x34,0x4c,0x38,0x59,0x64, +0x4b,0x51,0x35,0x68,0x74,0x7a,0x6b,0x32,0x68,0x70,0x52,0x4a,0x4c,0x30,0x6c,0x4b, +0x67,0x47,0x31,0x57,0x34,0x75,0x4b,0x32,0x39,0x39,0x42,0x74,0x7a,0x64,0x41,0x67, +0x66,0x42,0x76,0x43,0x54,0x33,0x41,0x31,0x61,0x53,0x70,0x6a,0x49,0x47,0x74,0x6e, +0x69,0x72,0x49,0x31,0x0a,0x46,0x4c,0x52,0x58,0x47,0x79,0x38,0x31,0x31,0x57,0x4a, +0x39,0x4a,0x68,0x68,0x34,0x41,0x4b,0x4c,0x66,0x79,0x56,0x70,0x42,0x4a,0x67,0x65, +0x34,0x73,0x56,0x72,0x36,0x4e,0x75,0x75,0x49,0x66,0x32,0x71,0x47,0x31,0x6f,0x79, +0x31,0x30,0x70,0x61,0x51,0x4e,0x65,0x71,0x32,0x33,0x55,0x47,0x61,0x59,0x74,0x2f, +0x7a,0x55,0x56,0x4a,0x77,0x0a,0x55,0x74,0x30,0x57,0x45,0x6b,0x58,0x38,0x48,0x4f, +0x63,0x62,0x33,0x75,0x49,0x6f,0x54,0x6d,0x61,0x4f,0x34,0x72,0x48,0x42,0x55,0x4a, +0x71,0x45,0x79,0x39,0x51,0x58,0x7a,0x53,0x57,0x77,0x43,0x35,0x78,0x45,0x43,0x64, +0x37,0x43,0x4a,0x53,0x53,0x68,0x31,0x30,0x4f,0x75,0x6e,0x6c,0x75,0x4c,0x32,0x4d, +0x47,0x65,0x5a,0x47,0x6e,0x76,0x0a,0x41,0x67,0x4d,0x42,0x41,0x41,0x47,0x6a,0x67, +0x59,0x59,0x77,0x67,0x59,0x4d,0x77,0x44,0x77,0x59,0x44,0x56,0x52,0x30,0x54,0x41, +0x51,0x48,0x2f,0x42,0x41,0x55,0x77,0x41,0x77,0x45,0x42,0x2f,0x7a,0x41,0x4c,0x42, +0x67,0x4e,0x56,0x48,0x51,0x38,0x45,0x42,0x41,0x4d,0x43,0x41,0x66,0x59,0x77,0x59, +0x77,0x59,0x44,0x56,0x52,0x30,0x6c,0x0a,0x42,0x46,0x77,0x77,0x57,0x67,0x59,0x49, +0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48,0x41,0x77,0x45,0x47,0x43,0x43,0x73,0x47, +0x41,0x51,0x55,0x46,0x42,0x77,0x4d,0x43,0x42,0x67,0x67,0x72,0x42,0x67,0x45,0x46, +0x42,0x51,0x63,0x44,0x41,0x77,0x59,0x49,0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48, +0x41,0x77,0x51,0x47,0x43,0x43,0x73,0x47,0x0a,0x41,0x51,0x55,0x46,0x42,0x77,0x4d, +0x46,0x42,0x67,0x67,0x72,0x42,0x67,0x45,0x46,0x42,0x51,0x63,0x44,0x42,0x67,0x59, +0x49,0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48,0x41,0x77,0x63,0x47,0x43,0x43,0x73, +0x47,0x41,0x51,0x55,0x46,0x42,0x77,0x4d,0x49,0x42,0x67,0x67,0x72,0x42,0x67,0x45, +0x46,0x42,0x51,0x63,0x44,0x43,0x54,0x41,0x4e,0x0a,0x42,0x67,0x6b,0x71,0x68,0x6b, +0x69,0x47,0x39,0x77,0x30,0x42,0x41,0x51,0x73,0x46,0x41,0x41,0x4f,0x43,0x41,0x51, +0x45,0x41,0x46,0x6d,0x34,0x37,0x47,0x55,0x70,0x50,0x57,0x35,0x2b,0x37,0x69,0x46, +0x74,0x69,0x6c,0x6f,0x6b,0x35,0x32,0x49,0x6f,0x54,0x57,0x72,0x74,0x46,0x67,0x32, +0x79,0x69,0x36,0x6b,0x49,0x32,0x69,0x52,0x4e,0x51,0x0a,0x4b,0x75,0x67,0x48,0x55, +0x49,0x4f,0x34,0x4b,0x53,0x71,0x4a,0x56,0x42,0x50,0x38,0x61,0x4b,0x4f,0x61,0x54, +0x5a,0x47,0x45,0x31,0x4b,0x4d,0x68,0x2f,0x59,0x6a,0x68,0x36,0x71,0x2f,0x67,0x50, +0x61,0x6c,0x67,0x64,0x2f,0x38,0x44,0x6d,0x72,0x78,0x53,0x4a,0x6d,0x55,0x78,0x33, +0x62,0x4e,0x62,0x38,0x52,0x59,0x36,0x70,0x4b,0x7a,0x74,0x0a,0x5a,0x64,0x75,0x53, +0x61,0x53,0x2b,0x57,0x55,0x30,0x59,0x74,0x2b,0x6c,0x47,0x35,0x76,0x56,0x67,0x61, +0x70,0x48,0x45,0x71,0x36,0x79,0x71,0x4c,0x62,0x65,0x56,0x78,0x51,0x4c,0x75,0x62, +0x54,0x69,0x6e,0x4f,0x66,0x56,0x56,0x5a,0x58,0x79,0x45,0x43,0x59,0x47,0x4d,0x73, +0x59,0x71,0x65,0x6e,0x4a,0x6a,0x4e,0x63,0x62,0x49,0x5a,0x4e,0x0a,0x79,0x4d,0x75, +0x72,0x46,0x63,0x67,0x30,0x34,0x36,0x4f,0x34,0x59,0x79,0x68,0x56,0x79,0x71,0x53, +0x69,0x74,0x43,0x59,0x37,0x68,0x2f,0x65,0x71,0x67,0x6b,0x50,0x4a,0x51,0x30,0x68, +0x6b,0x70,0x39,0x45,0x64,0x51,0x77,0x62,0x6e,0x38,0x56,0x6c,0x66,0x78,0x64,0x42, +0x58,0x77,0x51,0x34,0x4e,0x48,0x4b,0x30,0x4a,0x56,0x46,0x2f,0x33,0x0a,0x71,0x48, +0x61,0x68,0x4e,0x48,0x4f,0x35,0x64,0x62,0x4a,0x5a,0x57,0x59,0x41,0x62,0x42,0x44, +0x70,0x32,0x51,0x45,0x53,0x70,0x76,0x6f,0x2b,0x38,0x33,0x6c,0x68,0x34,0x64,0x6e, +0x58,0x6a,0x46,0x58,0x4d,0x43,0x48,0x76,0x52,0x68,0x35,0x31,0x79,0x2f,0x54,0x71, +0x79,0x42,0x34,0x56,0x76,0x72,0x52,0x4b,0x49,0x4b,0x74,0x54,0x6f,0x7a,0x0a,0x5a, +0x6a,0x48,0x59,0x49,0x63,0x62,0x6a,0x76,0x53,0x58,0x4d,0x7a,0x61,0x44,0x50,0x6a, +0x50,0x63,0x5a,0x47,0x6a,0x42,0x4a,0x6c,0x47,0x36,0x43,0x76,0x44,0x34,0x4c,0x6d, +0x59,0x7a,0x72,0x6b,0x48,0x34,0x31,0x63,0x7a,0x72,0x34,0x57,0x41,0x3d,0x3d,0x0a, +0x2d,0x2d,0x2d,0x2d,0x2d,0x45,0x4e,0x44,0x20,0x43,0x45,0x52,0x54,0x49,0x46,0x49, +0x43,0x41,0x54,0x45,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a + }, + Key_bin = new byte[] + { +0x2d,0x2d,0x2d,0x2d,0x2d,0x42,0x45,0x47,0x49,0x4e,0x20,0x50,0x52,0x49,0x56,0x41, +0x54,0x45,0x20,0x4b,0x45,0x59,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x4d,0x49,0x49,0x45, +0x76,0x67,0x49,0x42,0x41,0x44,0x41,0x4e,0x42,0x67,0x6b,0x71,0x68,0x6b,0x69,0x47, +0x39,0x77,0x30,0x42,0x41,0x51,0x45,0x46,0x41,0x41,0x53,0x43,0x42,0x4b,0x67,0x77, +0x67,0x67,0x53,0x6b,0x41,0x67,0x45,0x41,0x41,0x6f,0x49,0x42,0x41,0x51,0x44,0x58, +0x45,0x63,0x76,0x72,0x59,0x37,0x56,0x2b,0x7a,0x64,0x42,0x79,0x0a,0x72,0x64,0x4e, +0x78,0x4a,0x59,0x45,0x6d,0x61,0x41,0x4e,0x59,0x55,0x4f,0x37,0x76,0x57,0x34,0x68, +0x64,0x41,0x35,0x49,0x42,0x49,0x46,0x6d,0x4d,0x70,0x6e,0x62,0x79,0x69,0x4e,0x6e, +0x5a,0x77,0x36,0x57,0x39,0x6f,0x61,0x67,0x78,0x33,0x5a,0x49,0x65,0x65,0x48,0x56, +0x59,0x62,0x52,0x69,0x4b,0x36,0x41,0x66,0x46,0x74,0x53,0x31,0x32,0x0a,0x2b,0x45, +0x31,0x4d,0x59,0x31,0x64,0x32,0x61,0x71,0x51,0x31,0x53,0x72,0x49,0x43,0x39,0x51, +0x35,0x55,0x6e,0x5a,0x61,0x42,0x72,0x62,0x57,0x32,0x32,0x6d,0x4e,0x75,0x6c,0x4d, +0x34,0x2f,0x6c,0x49,0x4a,0x72,0x48,0x70,0x51,0x55,0x68,0x50,0x78,0x6f,0x62,0x79, +0x34,0x2f,0x36,0x4e,0x41,0x37,0x71,0x4b,0x67,0x55,0x48,0x69,0x79,0x4f,0x0a,0x64, +0x33,0x4a,0x42,0x70,0x4f,0x66,0x77,0x38,0x54,0x76,0x53,0x74,0x51,0x78,0x34,0x4c, +0x38,0x59,0x64,0x4b,0x51,0x35,0x68,0x74,0x7a,0x6b,0x32,0x68,0x70,0x52,0x4a,0x4c, +0x30,0x6c,0x4b,0x67,0x47,0x31,0x57,0x34,0x75,0x4b,0x32,0x39,0x39,0x42,0x74,0x7a, +0x64,0x41,0x67,0x66,0x42,0x76,0x43,0x54,0x33,0x41,0x31,0x61,0x53,0x70,0x6a,0x0a, +0x49,0x47,0x74,0x6e,0x69,0x72,0x49,0x31,0x46,0x4c,0x52,0x58,0x47,0x79,0x38,0x31, +0x31,0x57,0x4a,0x39,0x4a,0x68,0x68,0x34,0x41,0x4b,0x4c,0x66,0x79,0x56,0x70,0x42, +0x4a,0x67,0x65,0x34,0x73,0x56,0x72,0x36,0x4e,0x75,0x75,0x49,0x66,0x32,0x71,0x47, +0x31,0x6f,0x79,0x31,0x30,0x70,0x61,0x51,0x4e,0x65,0x71,0x32,0x33,0x55,0x47,0x61, +0x0a,0x59,0x74,0x2f,0x7a,0x55,0x56,0x4a,0x77,0x55,0x74,0x30,0x57,0x45,0x6b,0x58, +0x38,0x48,0x4f,0x63,0x62,0x33,0x75,0x49,0x6f,0x54,0x6d,0x61,0x4f,0x34,0x72,0x48, +0x42,0x55,0x4a,0x71,0x45,0x79,0x39,0x51,0x58,0x7a,0x53,0x57,0x77,0x43,0x35,0x78, +0x45,0x43,0x64,0x37,0x43,0x4a,0x53,0x53,0x68,0x31,0x30,0x4f,0x75,0x6e,0x6c,0x75, +0x4c,0x0a,0x32,0x4d,0x47,0x65,0x5a,0x47,0x6e,0x76,0x41,0x67,0x4d,0x42,0x41,0x41, +0x45,0x43,0x67,0x67,0x45,0x41,0x54,0x77,0x34,0x52,0x6f,0x52,0x4c,0x6a,0x73,0x68, +0x72,0x42,0x56,0x6f,0x59,0x69,0x78,0x4f,0x4a,0x2b,0x57,0x4c,0x6d,0x2f,0x45,0x51, +0x57,0x65,0x37,0x6f,0x6a,0x38,0x31,0x51,0x50,0x73,0x39,0x56,0x45,0x49,0x32,0x62, +0x53,0x4f,0x0a,0x34,0x4a,0x51,0x42,0x55,0x42,0x53,0x6b,0x70,0x64,0x48,0x34,0x57, +0x32,0x77,0x51,0x75,0x2f,0x61,0x58,0x57,0x38,0x75,0x75,0x53,0x39,0x45,0x43,0x6d, +0x6d,0x41,0x41,0x75,0x45,0x79,0x4a,0x54,0x56,0x7a,0x75,0x31,0x32,0x35,0x58,0x73, +0x65,0x63,0x6c,0x44,0x41,0x55,0x38,0x49,0x55,0x70,0x54,0x2b,0x70,0x4c,0x35,0x79, +0x70,0x37,0x34,0x0a,0x45,0x62,0x76,0x4e,0x48,0x48,0x33,0x67,0x65,0x72,0x4f,0x67, +0x78,0x76,0x49,0x6a,0x50,0x64,0x67,0x77,0x62,0x66,0x6d,0x4d,0x49,0x59,0x48,0x62, +0x56,0x70,0x6e,0x49,0x30,0x77,0x32,0x42,0x43,0x44,0x51,0x76,0x74,0x64,0x64,0x57, +0x6f,0x42,0x74,0x41,0x33,0x43,0x54,0x6a,0x63,0x2f,0x43,0x56,0x67,0x73,0x47,0x77, +0x33,0x43,0x4e,0x72,0x0a,0x46,0x78,0x41,0x46,0x35,0x73,0x4a,0x34,0x63,0x5a,0x4c, +0x6e,0x5a,0x31,0x45,0x36,0x69,0x74,0x4c,0x54,0x50,0x69,0x6f,0x6a,0x74,0x76,0x48, +0x48,0x34,0x61,0x64,0x6d,0x68,0x68,0x43,0x61,0x42,0x49,0x78,0x76,0x47,0x2f,0x53, +0x6e,0x59,0x77,0x4e,0x35,0x38,0x37,0x55,0x5a,0x6d,0x37,0x4c,0x57,0x50,0x61,0x67, +0x4c,0x41,0x33,0x67,0x69,0x0a,0x48,0x4b,0x4f,0x2b,0x4b,0x79,0x42,0x51,0x39,0x33, +0x31,0x4e,0x4d,0x61,0x65,0x6a,0x36,0x6d,0x75,0x75,0x46,0x32,0x30,0x32,0x76,0x34, +0x37,0x6c,0x57,0x6b,0x64,0x50,0x4f,0x6e,0x52,0x43,0x69,0x6f,0x4d,0x58,0x30,0x63, +0x31,0x6a,0x36,0x76,0x32,0x61,0x59,0x34,0x34,0x77,0x55,0x4b,0x71,0x39,0x4d,0x52, +0x67,0x6f,0x52,0x76,0x4a,0x37,0x0a,0x41,0x39,0x77,0x65,0x72,0x4c,0x6b,0x68,0x35, +0x78,0x78,0x35,0x35,0x32,0x4f,0x74,0x71,0x50,0x36,0x73,0x61,0x6d,0x75,0x47,0x44, +0x52,0x78,0x31,0x42,0x70,0x36,0x53,0x4f,0x70,0x68,0x43,0x45,0x50,0x48,0x59,0x67, +0x51,0x4b,0x42,0x67,0x51,0x44,0x36,0x33,0x65,0x2b,0x52,0x75,0x6c,0x36,0x46,0x78, +0x47,0x43,0x76,0x67,0x70,0x6b,0x33,0x0a,0x57,0x67,0x2f,0x54,0x31,0x77,0x2f,0x59, +0x4b,0x6b,0x79,0x4f,0x49,0x46,0x4c,0x63,0x46,0x4c,0x57,0x71,0x42,0x44,0x71,0x6c, +0x6e,0x58,0x65,0x63,0x6c,0x6b,0x50,0x4b,0x6a,0x57,0x4e,0x2f,0x32,0x70,0x4a,0x6d, +0x4f,0x31,0x63,0x46,0x63,0x44,0x4a,0x46,0x59,0x64,0x32,0x45,0x49,0x45,0x72,0x76, +0x42,0x57,0x54,0x34,0x51,0x39,0x4d,0x42,0x0a,0x4e,0x35,0x6c,0x44,0x6b,0x47,0x75, +0x6a,0x34,0x2f,0x6b,0x68,0x56,0x6c,0x79,0x6e,0x77,0x62,0x64,0x42,0x6e,0x47,0x43, +0x34,0x61,0x34,0x48,0x4a,0x49,0x4a,0x76,0x61,0x35,0x63,0x70,0x49,0x63,0x57,0x65, +0x4a,0x72,0x35,0x61,0x57,0x33,0x69,0x44,0x36,0x68,0x53,0x73,0x61,0x6c,0x79,0x55, +0x76,0x4a,0x4d,0x6d,0x64,0x4d,0x42,0x6e,0x47,0x0a,0x37,0x2b,0x50,0x65,0x53,0x2b, +0x4e,0x73,0x4b,0x30,0x61,0x63,0x31,0x67,0x33,0x4d,0x6c,0x56,0x35,0x42,0x41,0x32, +0x70,0x55,0x54,0x77,0x4b,0x42,0x67,0x51,0x44,0x62,0x65,0x46,0x6d,0x2b,0x46,0x46, +0x35,0x62,0x76,0x6f,0x4b,0x7a,0x49,0x4c,0x6c,0x31,0x62,0x79,0x6b,0x6c,0x52,0x6b, +0x69,0x76,0x7a,0x6b,0x62,0x7a,0x49,0x6b,0x41,0x78,0x0a,0x35,0x56,0x6b,0x74,0x67, +0x36,0x4a,0x35,0x63,0x76,0x38,0x44,0x35,0x2b,0x72,0x71,0x50,0x75,0x6a,0x4f,0x66, +0x39,0x67,0x42,0x6a,0x4e,0x37,0x70,0x64,0x78,0x39,0x39,0x35,0x6b,0x47,0x49,0x78, +0x5a,0x39,0x6d,0x31,0x68,0x57,0x69,0x78,0x55,0x55,0x31,0x55,0x6f,0x38,0x72,0x70, +0x39,0x4a,0x69,0x47,0x4f,0x36,0x72,0x65,0x31,0x77,0x69,0x0a,0x6a,0x56,0x2f,0x4c, +0x31,0x64,0x37,0x55,0x66,0x39,0x48,0x6a,0x65,0x61,0x70,0x4f,0x46,0x62,0x34,0x6b, +0x72,0x71,0x52,0x58,0x54,0x65,0x75,0x4d,0x6e,0x35,0x35,0x44,0x33,0x64,0x70,0x79, +0x6a,0x51,0x4e,0x43,0x30,0x5a,0x50,0x72,0x61,0x6d,0x58,0x64,0x38,0x31,0x57,0x6f, +0x6f,0x56,0x77,0x58,0x59,0x41,0x66,0x69,0x46,0x76,0x4c,0x49,0x0a,0x6f,0x66,0x31, +0x37,0x51,0x67,0x67,0x49,0x59,0x51,0x4b,0x42,0x67,0x51,0x44,0x59,0x55,0x67,0x67, +0x43,0x34,0x58,0x49,0x67,0x5a,0x76,0x58,0x34,0x59,0x65,0x55,0x38,0x6c,0x61,0x79, +0x51,0x50,0x79,0x4b,0x71,0x67,0x38,0x37,0x2f,0x76,0x31,0x2b,0x7a,0x35,0x79,0x65, +0x2f,0x4d,0x32,0x5a,0x65,0x36,0x53,0x6e,0x37,0x48,0x4a,0x66,0x59,0x0a,0x55,0x5a, +0x4d,0x36,0x37,0x48,0x37,0x52,0x4b,0x4e,0x6f,0x68,0x46,0x6c,0x35,0x43,0x39,0x65, +0x44,0x4e,0x7a,0x67,0x72,0x50,0x6b,0x52,0x63,0x2f,0x2f,0x54,0x77,0x32,0x45,0x48, +0x74,0x59,0x68,0x33,0x42,0x4b,0x49,0x6f,0x72,0x77,0x39,0x45,0x64,0x78,0x59,0x4e, +0x6c,0x6b,0x2b,0x6a,0x4e,0x73,0x30,0x30,0x64,0x57,0x35,0x34,0x64,0x39,0x0a,0x65, +0x69,0x69,0x7a,0x7a,0x78,0x59,0x34,0x34,0x2f,0x41,0x32,0x70,0x39,0x52,0x49,0x4d, +0x67,0x79,0x35,0x49,0x52,0x77,0x76,0x53,0x73,0x6d,0x50,0x67,0x61,0x71,0x34,0x6f, +0x4b,0x4d,0x64,0x54,0x4e,0x4d,0x4f,0x73,0x30,0x4a,0x77,0x65,0x79,0x50,0x72,0x42, +0x65,0x49,0x41,0x72,0x62,0x46,0x43,0x67,0x51,0x4b,0x42,0x67,0x51,0x43,0x71,0x0a, +0x57,0x30,0x34,0x56,0x33,0x49,0x75,0x74,0x33,0x55,0x42,0x6f,0x75,0x50,0x4d,0x63, +0x63,0x38,0x2f,0x56,0x62,0x69,0x77,0x48,0x77,0x79,0x2b,0x52,0x6c,0x4c,0x6d,0x4e, +0x77,0x59,0x41,0x71,0x63,0x79,0x35,0x50,0x35,0x58,0x4b,0x4c,0x33,0x70,0x36,0x62, +0x65,0x33,0x2b,0x4d,0x6f,0x76,0x48,0x52,0x71,0x6a,0x35,0x78,0x72,0x4a,0x54,0x57, +0x0a,0x54,0x6a,0x2f,0x36,0x59,0x61,0x51,0x73,0x31,0x2b,0x72,0x74,0x63,0x51,0x45, +0x61,0x74,0x64,0x34,0x4b,0x50,0x66,0x64,0x78,0x53,0x2f,0x63,0x66,0x52,0x74,0x38, +0x71,0x74,0x75,0x42,0x77,0x51,0x61,0x2f,0x34,0x39,0x4d,0x72,0x41,0x4c,0x76,0x57, +0x43,0x4c,0x53,0x42,0x75,0x4b,0x74,0x33,0x49,0x49,0x75,0x53,0x2f,0x51,0x44,0x74, +0x43,0x0a,0x5a,0x4e,0x67,0x6d,0x36,0x4d,0x78,0x71,0x4e,0x6e,0x49,0x43,0x58,0x35, +0x46,0x34,0x36,0x6d,0x52,0x49,0x52,0x42,0x42,0x4f,0x32,0x4b,0x7a,0x6c,0x30,0x33, +0x68,0x62,0x51,0x6c,0x71,0x58,0x4c,0x5a,0x63,0x38,0x6f,0x51,0x4b,0x42,0x67,0x43, +0x53,0x77,0x66,0x46,0x7a,0x68,0x48,0x76,0x78,0x36,0x68,0x69,0x64,0x57,0x67,0x48, +0x4a,0x63,0x0a,0x77,0x79,0x76,0x64,0x6e,0x70,0x58,0x78,0x36,0x5a,0x4c,0x6e,0x6f, +0x61,0x7a,0x61,0x6f,0x48,0x47,0x74,0x4d,0x47,0x43,0x45,0x5a,0x49,0x50,0x66,0x6a, +0x4c,0x42,0x63,0x30,0x4d,0x74,0x79,0x45,0x64,0x53,0x4c,0x78,0x54,0x6c,0x35,0x59, +0x70,0x78,0x6f,0x6d,0x43,0x46,0x55,0x4d,0x33,0x55,0x63,0x59,0x4e,0x2f,0x50,0x5a, +0x66,0x58,0x41,0x0a,0x6d,0x36,0x31,0x45,0x6d,0x71,0x53,0x53,0x4d,0x56,0x63,0x47, +0x50,0x67,0x65,0x2f,0x43,0x34,0x44,0x42,0x5a,0x59,0x6a,0x53,0x45,0x71,0x62,0x67, +0x37,0x6d,0x73,0x52,0x30,0x33,0x37,0x42,0x58,0x54,0x48,0x6b,0x78,0x44,0x62,0x33, +0x71,0x48,0x46,0x54,0x6f,0x30,0x6b,0x48,0x57,0x4a,0x66,0x34,0x39,0x59,0x77,0x32, +0x73,0x77,0x6a,0x54,0x0a,0x72,0x4f,0x38,0x46,0x46,0x44,0x52,0x56,0x50,0x44,0x4c, +0x5a,0x61,0x37,0x36,0x47,0x67,0x79,0x41,0x55,0x4a,0x38,0x55,0x63,0x0a,0x2d,0x2d, +0x2d,0x2d,0x2d,0x45,0x4e,0x44,0x20,0x50,0x52,0x49,0x56,0x41,0x54,0x45,0x20,0x4b, +0x45,0x59,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a + }, + }; + + VpnRpcKeyPair out_rpc_key_pair = api.SetServerCert(in_rpc_key_pair); + + print_object(out_rpc_key_pair); + + Console.WriteLine("End: Test_SetServerCert"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetServerCert', Get the server certification + /// + public void Test_GetServerCert() + { + Console.WriteLine("Begin: Test_GetServerCert"); + + VpnRpcKeyPair out_rpc_key_pair = api.GetServerCert(); + + print_object(out_rpc_key_pair); + + Console.WriteLine("End: Test_GetServerCert"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetServerCipher', Get cipher for SSL + /// + public void Test_GetServerCipher() + { + Console.WriteLine("Begin: Test_GetServerCipher"); + + VpnRpcStr out_rpc_str = api.GetServerCipher(); + + print_object(out_rpc_str); + + Console.WriteLine("End: Test_GetServerCipher"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetServerCipher', Set cipher for SSL to the server + /// + public void Test_SetServerCipher() + { + Console.WriteLine("Begin: Test_SetServerCipher"); + + VpnRpcStr in_rpc_str = new VpnRpcStr() { String_str = "RC4-MD5" }; + VpnRpcStr out_rpc_str = api.SetServerCipher(in_rpc_str); + + print_object(out_rpc_str); + + Console.WriteLine("End: Test_SetServerCipher"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateHub', Create a hub + /// + public string Test_CreateHub() + { + string hub_name = "Test_" + rand.Next(100000, 999999); + Console.WriteLine("Begin: Test_CreateHub"); + + VpnRpcCreateHub in_rpc_create_hub = new VpnRpcCreateHub() + { + HubName_str = hub_name, + HubType_u32 = VpnRpcHubType.Standalone, + Online_bool = true, + AdminPasswordPlainText_str = "microsoft", + MaxSession_u32 = 123, + NoEnum_bool = false, + }; + + VpnRpcCreateHub out_rpc_create_hub = api.CreateHub(in_rpc_create_hub); + + print_object(out_rpc_create_hub); + + Console.WriteLine("End: Test_CreateHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return hub_name; + } + + /// + /// API test for 'SetHub', Set hub configuration + /// + public void Test_SetHub() + { + Console.WriteLine("Begin: Test_SetHub"); + + VpnRpcCreateHub in_rpc_create_hub = new VpnRpcCreateHub() + { + HubName_str = hub_name, + AdminPasswordPlainText_str = "aho", + HubType_u32 = VpnRpcHubType.Standalone, + NoEnum_bool = false, + MaxSession_u32 = 128, + Online_bool = true, + }; + + VpnRpcCreateHub out_rpc_create_hub = api.SetHub(in_rpc_create_hub); + + print_object(out_rpc_create_hub); + + Console.WriteLine("End: Test_SetHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHub', Get hub configuration + /// + public void Test_GetHub() + { + Console.WriteLine("Begin: Test_GetHub"); + + VpnRpcCreateHub in_rpc_create_hub = new VpnRpcCreateHub() + { + HubName_str = hub_name, + }; + + VpnRpcCreateHub out_rpc_create_hub = api.GetHub(in_rpc_create_hub); + + print_object(out_rpc_create_hub); + + Console.WriteLine("End: Test_GetHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumHub', Enumerate hubs + /// + public void Test_EnumHub() + { + Console.WriteLine("Begin: Test_EnumHub"); + + VpnRpcEnumHub out_rpc_enum_hub = api.EnumHub(); + + print_object(out_rpc_enum_hub); + + Console.WriteLine("End: Test_EnumHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteHub', Delete a hub + /// + public void Test_DeleteHub() + { + Console.WriteLine("Begin: Test_DeleteHub"); + + VpnRpcDeleteHub in_rpc_delete_hub = new VpnRpcDeleteHub() + { + HubName_str = hub_name, + }; + VpnRpcDeleteHub out_rpc_delete_hub = api.DeleteHub(in_rpc_delete_hub); + + print_object(out_rpc_delete_hub); + + Console.WriteLine("End: Test_DeleteHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubRadius', Get Radius options of the hub + /// + public void Test_GetHubRadius() + { + Console.WriteLine("Begin: Test_GetHubRadius"); + + VpnRpcRadius in_rpc_radius = new VpnRpcRadius() + { + HubName_str = hub_name, + }; + VpnRpcRadius out_rpc_radius = api.GetHubRadius(in_rpc_radius); + + print_object(out_rpc_radius); + + Console.WriteLine("End: Test_GetHubRadius"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubRadius', Set Radius options of the hub + /// + public void Test_SetHubRadius() + { + Console.WriteLine("Begin: Test_SetHubRadius"); + + VpnRpcRadius in_rpc_radius = new VpnRpcRadius() + { + HubName_str = hub_name, + RadiusServerName_str = "1.2.3.4", + RadiusPort_u32 = 1234, + RadiusSecret_str = "microsoft", + RadiusRetryInterval_u32 = 1000, + }; + VpnRpcRadius out_rpc_radius = api.SetHubRadius(in_rpc_radius); + + print_object(out_rpc_radius); + + Console.WriteLine("End: Test_SetHubRadius"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumConnection', Enumerate connections + /// + public VpnRpcEnumConnection Test_EnumConnection() + { + Console.WriteLine("Begin: Test_EnumConnection"); + + VpnRpcEnumConnection out_rpc_enum_connection = api.EnumConnection(); + + print_object(out_rpc_enum_connection); + + Console.WriteLine("End: Test_EnumConnection"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_connection; + } + + /// + /// API test for 'DisconnectConnection', Disconnect a connection + /// + public void Test_DisconnectConnection(string connection_id) + { + Console.WriteLine("Begin: Test_DisconnectConnection"); + + VpnRpcDisconnectConnection in_rpc_disconnect_connection = new VpnRpcDisconnectConnection() + { + Name_str = connection_id, + }; + VpnRpcDisconnectConnection out_rpc_disconnect_connection = api.DisconnectConnection(in_rpc_disconnect_connection); + + print_object(out_rpc_disconnect_connection); + + Console.WriteLine("End: Test_DisconnectConnection"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetConnectionInfo', Get connection information + /// + public void Test_GetConnectionInfo(string name) + { + Console.WriteLine("Begin: Test_GetConnectionInfo"); + + VpnRpcConnectionInfo in_rpc_connection_info = new VpnRpcConnectionInfo() + { + Name_str = name, + }; + VpnRpcConnectionInfo out_rpc_connection_info = api.GetConnectionInfo(in_rpc_connection_info); + + print_object(out_rpc_connection_info); + + Console.WriteLine("End: Test_GetConnectionInfo"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubOnline', Make a hub on-line or off-line + /// + public void Test_SetHubOnline() + { + Console.WriteLine("Begin: Test_SetHubOnline"); + + VpnRpcSetHubOnline in_rpc_set_hub_online = new VpnRpcSetHubOnline() + { + HubName_str = hub_name, + Online_bool = true, + }; + VpnRpcSetHubOnline out_rpc_set_hub_online = api.SetHubOnline(in_rpc_set_hub_online); + + print_object(out_rpc_set_hub_online); + + Console.WriteLine("End: Test_SetHubOnline"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubStatus', Get hub status + /// + public void Test_GetHubStatus() + { + Console.WriteLine("Begin: Test_GetHubStatus"); + + VpnRpcHubStatus in_rpc_hub_status = new VpnRpcHubStatus() + { + HubName_str = hub_name, + }; + VpnRpcHubStatus out_rpc_hub_status = api.GetHubStatus(in_rpc_hub_status); + + print_object(out_rpc_hub_status); + + Console.WriteLine("End: Test_GetHubStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubLog', Set logging configuration into the hub + /// + public void Test_SetHubLog(VpnRpcHubLog in_rpc_hub_log) + { + Console.WriteLine("Begin: Test_SetHubLog"); + + VpnRpcHubLog out_rpc_hub_log = api.SetHubLog(in_rpc_hub_log); + + print_object(out_rpc_hub_log); + + Console.WriteLine("End: Test_SetHubLog"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubLog', Get logging configuration of the hub + /// + public VpnRpcHubLog Test_GetHubLog() + { + Console.WriteLine("Begin: Test_GetHubLog"); + + VpnRpcHubLog in_rpc_hub_log = new VpnRpcHubLog() + { + HubName_str = hub_name, + }; + VpnRpcHubLog out_rpc_hub_log = api.GetHubLog(in_rpc_hub_log); + + print_object(out_rpc_hub_log); + + Console.WriteLine("End: Test_GetHubLog"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_hub_log; + } + + /// + /// API test for 'AddCa', Add CA(Certificate Authority) into the hub + /// + public void Test_AddCa() + { + Console.WriteLine("Begin: Test_AddCa"); + + VpnRpcHubAddCA in_rpc_hub_add_ca = new VpnRpcHubAddCA() + { + HubName_str = hub_name, + Cert_bin = new byte[] + { +0x2d,0x2d,0x2d,0x2d,0x2d,0x42,0x45,0x47,0x49,0x4e,0x20,0x43,0x45,0x52,0x54,0x49, +0x46,0x49,0x43,0x41,0x54,0x45,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x4d,0x49,0x49,0x44, +0x72,0x6a,0x43,0x43,0x41,0x70,0x61,0x67,0x41,0x77,0x49,0x42,0x41,0x67,0x49,0x42, +0x41,0x44,0x41,0x4e,0x42,0x67,0x6b,0x71,0x68,0x6b,0x69,0x47,0x39,0x77,0x30,0x42, +0x41,0x51,0x73,0x46,0x41,0x44,0x42,0x57,0x4d,0x51,0x77,0x77,0x43,0x67,0x59,0x44, +0x56,0x51,0x51,0x44,0x44,0x41,0x4e,0x68,0x59,0x57,0x45,0x78,0x0a,0x46,0x54,0x41, +0x54,0x42,0x67,0x4e,0x56,0x42,0x41,0x6f,0x4d,0x44,0x4f,0x4f,0x42,0x72,0x2b,0x4f, +0x42,0x71,0x75,0x4f,0x42,0x6a,0x2b,0x4f,0x42,0x6e,0x54,0x45,0x4c,0x4d,0x41,0x6b, +0x47,0x41,0x31,0x55,0x45,0x42,0x68,0x4d,0x43,0x53,0x6c,0x41,0x78,0x45,0x44,0x41, +0x4f,0x42,0x67,0x4e,0x56,0x42,0x41,0x67,0x4d,0x42,0x30,0x6c,0x69,0x0a,0x59,0x58, +0x4a,0x68,0x61,0x32,0x6b,0x78,0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56,0x42,0x41, +0x63,0x4d,0x42,0x31,0x52,0x7a,0x64,0x57,0x74,0x31,0x59,0x6d,0x45,0x77,0x48,0x68, +0x63,0x4e,0x4d,0x54,0x67,0x78,0x4d,0x44,0x45,0x78,0x4d,0x6a,0x4d,0x7a,0x4e,0x54, +0x41,0x78,0x57,0x68,0x63,0x4e,0x4e,0x44,0x49,0x78,0x4d,0x44,0x41,0x31,0x0a,0x4d, +0x6a,0x4d,0x7a,0x4e,0x54,0x41,0x78,0x57,0x6a,0x42,0x57,0x4d,0x51,0x77,0x77,0x43, +0x67,0x59,0x44,0x56,0x51,0x51,0x44,0x44,0x41,0x4e,0x68,0x59,0x57,0x45,0x78,0x46, +0x54,0x41,0x54,0x42,0x67,0x4e,0x56,0x42,0x41,0x6f,0x4d,0x44,0x4f,0x4f,0x42,0x72, +0x2b,0x4f,0x42,0x71,0x75,0x4f,0x42,0x6a,0x2b,0x4f,0x42,0x6e,0x54,0x45,0x4c,0x0a, +0x4d,0x41,0x6b,0x47,0x41,0x31,0x55,0x45,0x42,0x68,0x4d,0x43,0x53,0x6c,0x41,0x78, +0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56,0x42,0x41,0x67,0x4d,0x42,0x30,0x6c,0x69, +0x59,0x58,0x4a,0x68,0x61,0x32,0x6b,0x78,0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56, +0x42,0x41,0x63,0x4d,0x42,0x31,0x52,0x7a,0x64,0x57,0x74,0x31,0x59,0x6d,0x45,0x77, +0x0a,0x67,0x67,0x45,0x69,0x4d,0x41,0x30,0x47,0x43,0x53,0x71,0x47,0x53,0x49,0x62, +0x33,0x44,0x51,0x45,0x42,0x41,0x51,0x55,0x41,0x41,0x34,0x49,0x42,0x44,0x77,0x41, +0x77,0x67,0x67,0x45,0x4b,0x41,0x6f,0x49,0x42,0x41,0x51,0x44,0x58,0x45,0x63,0x76, +0x72,0x59,0x37,0x56,0x2b,0x7a,0x64,0x42,0x79,0x72,0x64,0x4e,0x78,0x4a,0x59,0x45, +0x6d,0x0a,0x61,0x41,0x4e,0x59,0x55,0x4f,0x37,0x76,0x57,0x34,0x68,0x64,0x41,0x35, +0x49,0x42,0x49,0x46,0x6d,0x4d,0x70,0x6e,0x62,0x79,0x69,0x4e,0x6e,0x5a,0x77,0x36, +0x57,0x39,0x6f,0x61,0x67,0x78,0x33,0x5a,0x49,0x65,0x65,0x48,0x56,0x59,0x62,0x52, +0x69,0x4b,0x36,0x41,0x66,0x46,0x74,0x53,0x31,0x32,0x2b,0x45,0x31,0x4d,0x59,0x31, +0x64,0x32,0x0a,0x61,0x71,0x51,0x31,0x53,0x72,0x49,0x43,0x39,0x51,0x35,0x55,0x6e, +0x5a,0x61,0x42,0x72,0x62,0x57,0x32,0x32,0x6d,0x4e,0x75,0x6c,0x4d,0x34,0x2f,0x6c, +0x49,0x4a,0x72,0x48,0x70,0x51,0x55,0x68,0x50,0x78,0x6f,0x62,0x79,0x34,0x2f,0x36, +0x4e,0x41,0x37,0x71,0x4b,0x67,0x55,0x48,0x69,0x79,0x4f,0x64,0x33,0x4a,0x42,0x70, +0x4f,0x66,0x77,0x0a,0x38,0x54,0x76,0x53,0x74,0x51,0x78,0x34,0x4c,0x38,0x59,0x64, +0x4b,0x51,0x35,0x68,0x74,0x7a,0x6b,0x32,0x68,0x70,0x52,0x4a,0x4c,0x30,0x6c,0x4b, +0x67,0x47,0x31,0x57,0x34,0x75,0x4b,0x32,0x39,0x39,0x42,0x74,0x7a,0x64,0x41,0x67, +0x66,0x42,0x76,0x43,0x54,0x33,0x41,0x31,0x61,0x53,0x70,0x6a,0x49,0x47,0x74,0x6e, +0x69,0x72,0x49,0x31,0x0a,0x46,0x4c,0x52,0x58,0x47,0x79,0x38,0x31,0x31,0x57,0x4a, +0x39,0x4a,0x68,0x68,0x34,0x41,0x4b,0x4c,0x66,0x79,0x56,0x70,0x42,0x4a,0x67,0x65, +0x34,0x73,0x56,0x72,0x36,0x4e,0x75,0x75,0x49,0x66,0x32,0x71,0x47,0x31,0x6f,0x79, +0x31,0x30,0x70,0x61,0x51,0x4e,0x65,0x71,0x32,0x33,0x55,0x47,0x61,0x59,0x74,0x2f, +0x7a,0x55,0x56,0x4a,0x77,0x0a,0x55,0x74,0x30,0x57,0x45,0x6b,0x58,0x38,0x48,0x4f, +0x63,0x62,0x33,0x75,0x49,0x6f,0x54,0x6d,0x61,0x4f,0x34,0x72,0x48,0x42,0x55,0x4a, +0x71,0x45,0x79,0x39,0x51,0x58,0x7a,0x53,0x57,0x77,0x43,0x35,0x78,0x45,0x43,0x64, +0x37,0x43,0x4a,0x53,0x53,0x68,0x31,0x30,0x4f,0x75,0x6e,0x6c,0x75,0x4c,0x32,0x4d, +0x47,0x65,0x5a,0x47,0x6e,0x76,0x0a,0x41,0x67,0x4d,0x42,0x41,0x41,0x47,0x6a,0x67, +0x59,0x59,0x77,0x67,0x59,0x4d,0x77,0x44,0x77,0x59,0x44,0x56,0x52,0x30,0x54,0x41, +0x51,0x48,0x2f,0x42,0x41,0x55,0x77,0x41,0x77,0x45,0x42,0x2f,0x7a,0x41,0x4c,0x42, +0x67,0x4e,0x56,0x48,0x51,0x38,0x45,0x42,0x41,0x4d,0x43,0x41,0x66,0x59,0x77,0x59, +0x77,0x59,0x44,0x56,0x52,0x30,0x6c,0x0a,0x42,0x46,0x77,0x77,0x57,0x67,0x59,0x49, +0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48,0x41,0x77,0x45,0x47,0x43,0x43,0x73,0x47, +0x41,0x51,0x55,0x46,0x42,0x77,0x4d,0x43,0x42,0x67,0x67,0x72,0x42,0x67,0x45,0x46, +0x42,0x51,0x63,0x44,0x41,0x77,0x59,0x49,0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48, +0x41,0x77,0x51,0x47,0x43,0x43,0x73,0x47,0x0a,0x41,0x51,0x55,0x46,0x42,0x77,0x4d, +0x46,0x42,0x67,0x67,0x72,0x42,0x67,0x45,0x46,0x42,0x51,0x63,0x44,0x42,0x67,0x59, +0x49,0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48,0x41,0x77,0x63,0x47,0x43,0x43,0x73, +0x47,0x41,0x51,0x55,0x46,0x42,0x77,0x4d,0x49,0x42,0x67,0x67,0x72,0x42,0x67,0x45, +0x46,0x42,0x51,0x63,0x44,0x43,0x54,0x41,0x4e,0x0a,0x42,0x67,0x6b,0x71,0x68,0x6b, +0x69,0x47,0x39,0x77,0x30,0x42,0x41,0x51,0x73,0x46,0x41,0x41,0x4f,0x43,0x41,0x51, +0x45,0x41,0x46,0x6d,0x34,0x37,0x47,0x55,0x70,0x50,0x57,0x35,0x2b,0x37,0x69,0x46, +0x74,0x69,0x6c,0x6f,0x6b,0x35,0x32,0x49,0x6f,0x54,0x57,0x72,0x74,0x46,0x67,0x32, +0x79,0x69,0x36,0x6b,0x49,0x32,0x69,0x52,0x4e,0x51,0x0a,0x4b,0x75,0x67,0x48,0x55, +0x49,0x4f,0x34,0x4b,0x53,0x71,0x4a,0x56,0x42,0x50,0x38,0x61,0x4b,0x4f,0x61,0x54, +0x5a,0x47,0x45,0x31,0x4b,0x4d,0x68,0x2f,0x59,0x6a,0x68,0x36,0x71,0x2f,0x67,0x50, +0x61,0x6c,0x67,0x64,0x2f,0x38,0x44,0x6d,0x72,0x78,0x53,0x4a,0x6d,0x55,0x78,0x33, +0x62,0x4e,0x62,0x38,0x52,0x59,0x36,0x70,0x4b,0x7a,0x74,0x0a,0x5a,0x64,0x75,0x53, +0x61,0x53,0x2b,0x57,0x55,0x30,0x59,0x74,0x2b,0x6c,0x47,0x35,0x76,0x56,0x67,0x61, +0x70,0x48,0x45,0x71,0x36,0x79,0x71,0x4c,0x62,0x65,0x56,0x78,0x51,0x4c,0x75,0x62, +0x54,0x69,0x6e,0x4f,0x66,0x56,0x56,0x5a,0x58,0x79,0x45,0x43,0x59,0x47,0x4d,0x73, +0x59,0x71,0x65,0x6e,0x4a,0x6a,0x4e,0x63,0x62,0x49,0x5a,0x4e,0x0a,0x79,0x4d,0x75, +0x72,0x46,0x63,0x67,0x30,0x34,0x36,0x4f,0x34,0x59,0x79,0x68,0x56,0x79,0x71,0x53, +0x69,0x74,0x43,0x59,0x37,0x68,0x2f,0x65,0x71,0x67,0x6b,0x50,0x4a,0x51,0x30,0x68, +0x6b,0x70,0x39,0x45,0x64,0x51,0x77,0x62,0x6e,0x38,0x56,0x6c,0x66,0x78,0x64,0x42, +0x58,0x77,0x51,0x34,0x4e,0x48,0x4b,0x30,0x4a,0x56,0x46,0x2f,0x33,0x0a,0x71,0x48, +0x61,0x68,0x4e,0x48,0x4f,0x35,0x64,0x62,0x4a,0x5a,0x57,0x59,0x41,0x62,0x42,0x44, +0x70,0x32,0x51,0x45,0x53,0x70,0x76,0x6f,0x2b,0x38,0x33,0x6c,0x68,0x34,0x64,0x6e, +0x58,0x6a,0x46,0x58,0x4d,0x43,0x48,0x76,0x52,0x68,0x35,0x31,0x79,0x2f,0x54,0x71, +0x79,0x42,0x34,0x56,0x76,0x72,0x52,0x4b,0x49,0x4b,0x74,0x54,0x6f,0x7a,0x0a,0x5a, +0x6a,0x48,0x59,0x49,0x63,0x62,0x6a,0x76,0x53,0x58,0x4d,0x7a,0x61,0x44,0x50,0x6a, +0x50,0x63,0x5a,0x47,0x6a,0x42,0x4a,0x6c,0x47,0x36,0x43,0x76,0x44,0x34,0x4c,0x6d, +0x59,0x7a,0x72,0x6b,0x48,0x34,0x31,0x63,0x7a,0x72,0x34,0x57,0x41,0x3d,0x3d,0x0a, +0x2d,0x2d,0x2d,0x2d,0x2d,0x45,0x4e,0x44,0x20,0x43,0x45,0x52,0x54,0x49,0x46,0x49, +0x43,0x41,0x54,0x45,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a + }, + }; + VpnRpcHubAddCA out_rpc_hub_add_ca = api.AddCa(in_rpc_hub_add_ca); + + print_object(out_rpc_hub_add_ca); + + Console.WriteLine("End: Test_AddCa"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumCa', Enumerate CA(Certificate Authority) in the hub + /// + public VpnRpcHubEnumCA Test_EnumCa() + { + Console.WriteLine("Begin: Test_EnumCa"); + + VpnRpcHubEnumCA in_rpc_hub_enum_ca = new VpnRpcHubEnumCA() + { + HubName_str = hub_name, + }; + VpnRpcHubEnumCA out_rpc_hub_enum_ca = api.EnumCa(in_rpc_hub_enum_ca); + + print_object(out_rpc_hub_enum_ca); + + Console.WriteLine("End: Test_EnumCa"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_hub_enum_ca; + } + + /// + /// API test for 'GetCa', Get CA(Certificate Authority) setting from the hub + /// + public void Test_GetCa(uint key) + { + Console.WriteLine("Begin: Test_GetCa"); + + VpnRpcHubGetCA in_rpc_hub_get_ca = new VpnRpcHubGetCA() + { + HubName_str = hub_name, + Key_u32 = key, + }; + VpnRpcHubGetCA out_rpc_hub_get_ca = api.GetCa(in_rpc_hub_get_ca); + + print_object(out_rpc_hub_get_ca); + + Console.WriteLine("End: Test_GetCa"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteCa', Delete a CA(Certificate Authority) setting from the hub + /// + public void Test_DeleteCa(uint key) + { + Console.WriteLine("Begin: Test_DeleteCa"); + + VpnRpcHubDeleteCA in_rpc_hub_delete_ca = new VpnRpcHubDeleteCA() + { + HubName_str = hub_name, + Key_u32 = key, + }; + VpnRpcHubDeleteCA out_rpc_hub_delete_ca = api.DeleteCa(in_rpc_hub_delete_ca); + + print_object(out_rpc_hub_delete_ca); + + Console.WriteLine("End: Test_DeleteCa"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetLinkOnline', Make a link into on-line + /// + public void Test_SetLinkOnline() + { + Console.WriteLine("Begin: Test_SetLinkOnline"); + + VpnRpcLink in_rpc_link = new VpnRpcLink() + { + HubName_str = hub_name, + AccountName_utf = "linktest", + }; + VpnRpcLink out_rpc_link = api.SetLinkOnline(in_rpc_link); + + print_object(out_rpc_link); + + Console.WriteLine("End: Test_SetLinkOnline"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetLinkOffline', Make a link into off-line + /// + public void Test_SetLinkOffline() + { + Console.WriteLine("Begin: Test_SetLinkOffline"); + + VpnRpcLink in_rpc_link = new VpnRpcLink() + { + HubName_str = hub_name, + AccountName_utf = "linktest", + }; + VpnRpcLink out_rpc_link = api.SetLinkOffline(in_rpc_link); + + print_object(out_rpc_link); + + Console.WriteLine("End: Test_SetLinkOffline"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteLink', Delete a link + /// + public void Test_DeleteLink() + { + Console.WriteLine("Begin: Test_DeleteLink"); + + VpnRpcLink in_rpc_link = new VpnRpcLink() + { + HubName_str = hub_name, + AccountName_utf = "linktest2", + }; + VpnRpcLink out_rpc_link = api.DeleteLink(in_rpc_link); + + print_object(out_rpc_link); + + Console.WriteLine("End: Test_DeleteLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'RenameLink', Rename link (cascade connection) + /// + public void Test_RenameLink() + { + Console.WriteLine("Begin: Test_RenameLink"); + + VpnRpcRenameLink in_rpc_rename_link = new VpnRpcRenameLink() + { + HubName_str = hub_name, + OldAccountName_utf = "linktest", + NewAccountName_utf = "linktest2", + }; + VpnRpcRenameLink out_rpc_rename_link = api.RenameLink(in_rpc_rename_link); + + print_object(out_rpc_rename_link); + + Console.WriteLine("End: Test_RenameLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateLink', Create a new link(cascade) + /// + public void Test_CreateLink() + { + Console.WriteLine("Begin: Test_CreateLink"); + + VpnRpcCreateLink in_rpc_create_link = new VpnRpcCreateLink() + { + HubName_Ex_str = hub_name, + CheckServerCert_bool = false, + + ClientOption_AccountName_utf = "linktest", + ClientOption_Hostname_str = "1.2.3.4", + ClientOption_Port_u32 = 443, + ClientOption_ProxyType_u32 = 0, + ClientOption_HubName_str = "ABC", + ClientOption_MaxConnection_u32 = 16, + ClientOption_UseEncrypt_bool = true, + ClientOption_UseCompress_bool = false, + ClientOption_HalfConnection_bool = true, + ClientOption_AdditionalConnectionInterval_u32 = 2, + ClientOption_ConnectionDisconnectSpan_u32 = 24, + + ClientAuth_AuthType_u32 = VpnRpcClientAuthType.PlainPassword, + ClientAuth_Username_str = "181012", + ClientAuth_PlainPassword_str = "microsoft", + ClientAuth_HashedPassword_bin = new byte[0] { }, + ClientAuth_ClientX_bin = new byte[0] { }, + ClientAuth_ClientK_bin = new byte[0] { }, + + SecPol_DHCPFilter_bool = true, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = true, + SecPol_CheckMac_bool = true, + SecPol_CheckIP_bool = true, + SecPol_ArpDhcpOnly_bool = true, + SecPol_PrivacyFilter_bool = true, + SecPol_NoServer_bool = true, + SecPol_NoBroadcastLimiter_bool = true, + SecPol_MaxMac_u32 = 32, + SecPol_MaxIP_u32 = 64, + SecPol_MaxUpload_u32 = 960000, + SecPol_MaxDownload_u32 = 1280000, + SecPol_RSandRAFilter_bool = true, + SecPol_RAFilter_bool = true, + SecPol_DHCPv6Filter_bool = true, + SecPol_DHCPv6NoServer_bool = true, + SecPol_CheckIPv6_bool = true, + SecPol_NoServerV6_bool = true, + SecPol_MaxIPv6_u32 = 127, + SecPol_FilterIPv4_bool = true, + SecPol_FilterIPv6_bool = true, + SecPol_FilterNonIP_bool = true, + SecPol_NoIPv6DefaultRouterInRA_bool = true, + SecPol_VLanId_u32 = 123, + SecPol_Ver3_bool = true, + }; + VpnRpcCreateLink out_rpc_create_link = api.CreateLink(in_rpc_create_link); + + print_object(out_rpc_create_link); + + Console.WriteLine("End: Test_CreateLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetLink', Get link configuration + /// + public void Test_GetLink() + { + Console.WriteLine("Begin: Test_GetLink"); + + VpnRpcCreateLink in_rpc_create_link = new VpnRpcCreateLink() + { + HubName_Ex_str = hub_name, + ClientOption_AccountName_utf = "linktest", + }; + VpnRpcCreateLink out_rpc_create_link = api.GetLink(in_rpc_create_link); + + print_object(out_rpc_create_link); + + Console.WriteLine("End: Test_GetLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetLink', Set link configuration + /// + public void Test_SetLink() + { + Console.WriteLine("Begin: Test_SetLink"); + + VpnRpcCreateLink in_rpc_create_link = new VpnRpcCreateLink() + { + HubName_Ex_str = hub_name, + CheckServerCert_bool = false, + + ClientOption_AccountName_utf = "linktest", + ClientOption_Hostname_str = "1.2.3.4", + ClientOption_Port_u32 = 443, + ClientOption_ProxyType_u32 = 0, + ClientOption_HubName_str = "ABC", + ClientOption_MaxConnection_u32 = 16, + ClientOption_UseEncrypt_bool = true, + ClientOption_UseCompress_bool = false, + ClientOption_HalfConnection_bool = true, + ClientOption_AdditionalConnectionInterval_u32 = 2, + ClientOption_ConnectionDisconnectSpan_u32 = 24, + + ClientAuth_AuthType_u32 = VpnRpcClientAuthType.PlainPassword, + ClientAuth_Username_str = "181012", + ClientAuth_PlainPassword_str = "microsoft", + ClientAuth_HashedPassword_bin = new byte[0] { }, + ClientAuth_ClientX_bin = new byte[0] { }, + ClientAuth_ClientK_bin = new byte[0] { }, + + SecPol_DHCPFilter_bool = true, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = true, + SecPol_CheckMac_bool = true, + SecPol_CheckIP_bool = true, + SecPol_ArpDhcpOnly_bool = true, + SecPol_PrivacyFilter_bool = true, + SecPol_NoServer_bool = true, + SecPol_NoBroadcastLimiter_bool = true, + SecPol_MaxMac_u32 = 32, + SecPol_MaxIP_u32 = 64, + SecPol_MaxUpload_u32 = 960000, + SecPol_MaxDownload_u32 = 1280000, + SecPol_RSandRAFilter_bool = true, + SecPol_RAFilter_bool = true, + SecPol_DHCPv6Filter_bool = true, + SecPol_DHCPv6NoServer_bool = true, + SecPol_CheckIPv6_bool = true, + SecPol_NoServerV6_bool = true, + SecPol_MaxIPv6_u32 = 127, + SecPol_FilterIPv4_bool = true, + SecPol_FilterIPv6_bool = true, + SecPol_FilterNonIP_bool = true, + SecPol_NoIPv6DefaultRouterInRA_bool = true, + SecPol_VLanId_u32 = 123, + SecPol_Ver3_bool = true, + }; + VpnRpcCreateLink out_rpc_create_link = api.SetLink(in_rpc_create_link); + + print_object(out_rpc_create_link); + + Console.WriteLine("End: Test_SetLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumLink', Enumerate links + /// + public VpnRpcEnumLink Test_EnumLink() + { + Console.WriteLine("Begin: Test_EnumLink"); + + VpnRpcEnumLink in_rpc_enum_link = new VpnRpcEnumLink() + { + HubName_str = hub_name, + }; + VpnRpcEnumLink out_rpc_enum_link = api.EnumLink(in_rpc_enum_link); + + print_object(out_rpc_enum_link); + + Console.WriteLine("End: Test_EnumLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_link; + } + + /// + /// API test for 'GetLinkStatus', Get link status + /// + public void Test_GetLinkStatus(string name) + { + Console.WriteLine("Begin: Test_GetLinkStatus"); + + VpnRpcLinkStatus in_rpc_link_status = new VpnRpcLinkStatus() + { + HubName_Ex_str = hub_name, + AccountName_utf = name, + }; + VpnRpcLinkStatus out_rpc_link_status = api.GetLinkStatus(in_rpc_link_status); + + print_object(out_rpc_link_status); + + Console.WriteLine("End: Test_GetLinkStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddAccess', Add access list entry + /// + public void Test_AddAccess() + { + Console.WriteLine("Begin: Test_AddAccess"); + + VpnRpcAddAccess in_rpc_add_access_ipv4 = new VpnRpcAddAccess() + { + HubName_str = hub_name, + + AccessListSingle = new VpnAccess[1] + { + new VpnAccess() + { + Note_utf = "IPv4 Test", + Active_bool = true, + Priority_u32 = 100, + Discard_bool = true, + IsIPv6_bool = false, + SrcIpAddress_ip = "192.168.0.0", + SrcSubnetMask_ip = "255.255.255.0", + DestIpAddress_ip = "10.0.0.0", + DestSubnetMask_ip = "255.255.0.0", + Protocol_u32 = VpnIpProtocolNumber.TCP, + SrcPortStart_u32 = 123, + SrcPortEnd_u32 = 456, + DestPortStart_u32 = 555, + DestPortEnd_u32 = 666, + SrcUsername_str = "dnobori", + DestUsername_str = "nekosan", + CheckSrcMac_bool = true, + SrcMacAddress_bin = new byte[] { 1, 2, 3, 0, 0, 0 }, + SrcMacMask_bin = new byte[] { 255, 255, 255, 0, 0, 0 }, + CheckTcpState_bool = true, + Established_bool = true, + Delay_u32 = 10, + Jitter_u32 = 20, + Loss_u32 = 30, + RedirectUrl_str = "aho", + }, + }, + }; + VpnRpcAddAccess out_rpc_add_access_ipv4 = api.AddAccess(in_rpc_add_access_ipv4); + + VpnRpcAddAccess in_rpc_add_access_ipv6 = new VpnRpcAddAccess() + { + HubName_str = hub_name, + + AccessListSingle = new VpnAccess[1] + { + new VpnAccess() + { + Note_utf = "IPv6 Test", + Active_bool = true, + Priority_u32 = 100, + Discard_bool = true, + IsIPv6_bool = true, + SrcIpAddress6_bin = new byte[] { 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + SrcSubnetMask6_bin = new byte[] { 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + Protocol_u32 = VpnIpProtocolNumber.UDP, + SrcPortStart_u32 = 123, + SrcPortEnd_u32 = 456, + DestPortStart_u32 = 555, + DestPortEnd_u32 = 666, + SrcUsername_str = "dnobori", + DestUsername_str = "nekosan", + CheckSrcMac_bool = true, + SrcMacAddress_bin = new byte[] { 1, 2, 3, 0, 0, 0 }, + SrcMacMask_bin = new byte[] { 255, 255, 255, 0, 0, 0 }, + CheckTcpState_bool = true, + Established_bool = true, + Delay_u32 = 10, + Jitter_u32 = 20, + Loss_u32 = 30, + RedirectUrl_str = "aho", + }, + }, + }; + VpnRpcAddAccess out_rpc_add_access_ipv6 = api.AddAccess(in_rpc_add_access_ipv6); + + Console.WriteLine("End: Test_AddAccess"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteAccess', Delete access list entry + /// + public void Test_DeleteAccess() + { + Console.WriteLine("Begin: Test_DeleteAccess"); + + VpnRpcDeleteAccess in_rpc_delete_access = new VpnRpcDeleteAccess() + { + HubName_str = hub_name, + Id_u32 = 1, + }; + VpnRpcDeleteAccess out_rpc_delete_access = api.DeleteAccess(in_rpc_delete_access); + + print_object(out_rpc_delete_access); + + Console.WriteLine("End: Test_DeleteAccess"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumAccess', Get access list + /// + public void Test_EnumAccess() + { + Console.WriteLine("Begin: Test_EnumAccess"); + + VpnRpcEnumAccessList in_rpc_enum_access_list = new VpnRpcEnumAccessList() + { + HubName_str = hub_name, + }; + VpnRpcEnumAccessList out_rpc_enum_access_list = api.EnumAccess(in_rpc_enum_access_list); + + print_object(out_rpc_enum_access_list); + + Console.WriteLine("End: Test_EnumAccess"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetAccessList', Set access list + /// + public void Test_SetAccessList() + { + Console.WriteLine("Begin: Test_SetAccessList"); + + VpnRpcEnumAccessList in_rpc_enum_access_list = new VpnRpcEnumAccessList() + { + HubName_str = hub_name, + AccessList = new VpnAccess[] + { + new VpnAccess() + { + Note_utf = "IPv4 Test 2", + Active_bool = true, + Priority_u32 = 100, + Discard_bool = true, + IsIPv6_bool = false, + SrcIpAddress_ip = "192.168.0.0", + SrcSubnetMask_ip = "255.255.255.0", + DestIpAddress_ip = "10.0.0.0", + DestSubnetMask_ip = "255.255.0.0", + Protocol_u32 = VpnIpProtocolNumber.TCP, + SrcPortStart_u32 = 123, + SrcPortEnd_u32 = 456, + DestPortStart_u32 = 555, + DestPortEnd_u32 = 666, + SrcUsername_str = "dnobori", + DestUsername_str = "nekosan", + CheckSrcMac_bool = true, + SrcMacAddress_bin = new byte[] { 1, 2, 3, 0, 0, 0 }, + SrcMacMask_bin = new byte[] { 255, 255, 255, 0, 0, 0 }, + CheckTcpState_bool = true, + Established_bool = true, + Delay_u32 = 10, + Jitter_u32 = 20, + Loss_u32 = 30, + RedirectUrl_str = "aho", + }, + new VpnAccess() + { + Note_utf = "IPv6 Test 2", + Active_bool = true, + Priority_u32 = 100, + Discard_bool = true, + IsIPv6_bool = true, + SrcIpAddress6_bin = new byte[] { 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + SrcSubnetMask6_bin = new byte[] { 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + Protocol_u32 = VpnIpProtocolNumber.UDP, + SrcPortStart_u32 = 123, + SrcPortEnd_u32 = 456, + DestPortStart_u32 = 555, + DestPortEnd_u32 = 666, + SrcUsername_str = "dnobori", + DestUsername_str = "nekosan", + CheckSrcMac_bool = true, + SrcMacAddress_bin = new byte[] { 1, 2, 3, 0, 0, 0 }, + SrcMacMask_bin = new byte[] { 255, 255, 255, 0, 0, 0 }, + CheckTcpState_bool = true, + Established_bool = true, + Delay_u32 = 10, + Jitter_u32 = 20, + Loss_u32 = 30, + RedirectUrl_str = "aho", + }, + } + }; + VpnRpcEnumAccessList out_rpc_enum_access_list = api.SetAccessList(in_rpc_enum_access_list); + + print_object(out_rpc_enum_access_list); + + Console.WriteLine("End: Test_SetAccessList"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateUser', Create a user + /// + public void Test_CreateUser() + { + Console.WriteLine("Begin: Test_CreateUser"); + + VpnRpcSetUser in_rpc_set_user = new VpnRpcSetUser() + { + HubName_str = hub_name, + Name_str = "test1", + Realname_utf = "Cat man", + Note_utf = "Hey!!!", + AuthType_u32 = VpnRpcUserAuthType.Password, + Auth_Password_str = "microsoft", + Auth_UserCert_CertData = new byte[0] { }, + Auth_RootCert_Serial = new byte[0] { }, + Auth_RootCert_CommonName = "", + Auth_Radius_RadiusUsername = "", + Auth_NT_NTUsername = "", + ExpireTime_dt = new DateTime(2019, 1, 1), + UsePolicy_bool = true, + SecPol_Access_bool = true, + SecPol_DHCPFilter_bool = false, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = false, + SecPol_NoBridge_bool = false, + SecPol_NoRouting_bool = false, + SecPol_CheckMac_bool = false, + SecPol_CheckIP_bool = false, + SecPol_ArpDhcpOnly_bool = false, + SecPol_PrivacyFilter_bool = false, + SecPol_NoServer_bool = false, + SecPol_NoBroadcastLimiter_bool = false, + SecPol_MonitorPort_bool = false, + SecPol_MaxConnection_u32 = 32, + SecPol_TimeOut_u32 = 15, + SecPol_MaxMac_u32 = 1000, + SecPol_MaxIP_u32 = 1000, + SecPol_MaxUpload_u32 = 1000000000, + SecPol_MaxDownload_u32 = 1000000000, + SecPol_FixPassword_bool = false, + SecPol_MultiLogins_u32 = 1000, + SecPol_NoQoS_bool = false, + SecPol_RSandRAFilter_bool = false, + SecPol_RAFilter_bool = false, + SecPol_DHCPv6Filter_bool = false, + SecPol_DHCPv6NoServer_bool = false, + SecPol_NoRoutingV6_bool = false, + SecPol_CheckIPv6_bool = false, + SecPol_NoServerV6_bool = false, + SecPol_MaxIPv6_u32 = 1234, + SecPol_NoSavePassword_bool = false, + SecPol_AutoDisconnect_u32 = 0, + SecPol_FilterIPv4_bool = false, + SecPol_FilterIPv6_bool = false, + SecPol_FilterNonIP_bool = false, + SecPol_NoIPv6DefaultRouterInRA_bool = false, + SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool = false, + SecPol_VLanId_u32 = 0, + SecPol_Ver3_bool = true, + }; + VpnRpcSetUser out_rpc_set_user = api.CreateUser(in_rpc_set_user); + + Console.WriteLine("End: Test_CreateUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetUser', Set user setting + /// + public void Test_SetUser() + { + Console.WriteLine("Begin: Test_SetUser"); + + VpnRpcSetUser in_rpc_set_user = new VpnRpcSetUser() + { + HubName_str = hub_name, + Name_str = "test1", + Realname_utf = "Cat man", + Note_utf = "Hey!!!", + GroupName_str = "group1", + AuthType_u32 = VpnRpcUserAuthType.Anonymous, + Auth_Password_str = "", + Auth_UserCert_CertData = new byte[0] { }, + Auth_RootCert_Serial = new byte[0] { }, + Auth_RootCert_CommonName = "", + Auth_Radius_RadiusUsername = "", + Auth_NT_NTUsername = "", + ExpireTime_dt = new DateTime(2019, 1, 1), + UsePolicy_bool = true, + SecPol_Access_bool = true, + SecPol_DHCPFilter_bool = false, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = false, + SecPol_NoBridge_bool = false, + SecPol_NoRouting_bool = false, + SecPol_CheckMac_bool = false, + SecPol_CheckIP_bool = false, + SecPol_ArpDhcpOnly_bool = false, + SecPol_PrivacyFilter_bool = false, + SecPol_NoServer_bool = false, + SecPol_NoBroadcastLimiter_bool = false, + SecPol_MonitorPort_bool = false, + SecPol_MaxConnection_u32 = 32, + SecPol_TimeOut_u32 = 15, + SecPol_MaxMac_u32 = 1000, + SecPol_MaxIP_u32 = 1000, + SecPol_MaxUpload_u32 = 1000000000, + SecPol_MaxDownload_u32 = 1000000000, + SecPol_FixPassword_bool = false, + SecPol_MultiLogins_u32 = 1000, + SecPol_NoQoS_bool = false, + SecPol_RSandRAFilter_bool = false, + SecPol_RAFilter_bool = false, + SecPol_DHCPv6Filter_bool = false, + SecPol_DHCPv6NoServer_bool = false, + SecPol_NoRoutingV6_bool = false, + SecPol_CheckIPv6_bool = false, + SecPol_NoServerV6_bool = false, + SecPol_MaxIPv6_u32 = 1234, + SecPol_NoSavePassword_bool = false, + SecPol_AutoDisconnect_u32 = 0, + SecPol_FilterIPv4_bool = false, + SecPol_FilterIPv6_bool = false, + SecPol_FilterNonIP_bool = false, + SecPol_NoIPv6DefaultRouterInRA_bool = false, + SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool = false, + SecPol_VLanId_u32 = 0, + SecPol_Ver3_bool = true, + }; + VpnRpcSetUser out_rpc_set_user = api.SetUser(in_rpc_set_user); + + Console.WriteLine("End: Test_SetUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetUser', Get user setting + /// + public void Test_GetUser() + { + Console.WriteLine("Begin: Test_GetUser"); + + VpnRpcSetUser in_rpc_set_user = new VpnRpcSetUser() + { + HubName_str = hub_name, + Name_str = "test1", + }; + VpnRpcSetUser out_rpc_set_user = api.GetUser(in_rpc_set_user); + + print_object(out_rpc_set_user); + + Console.WriteLine("End: Test_GetUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteUser', Delete a user + /// + public void Test_DeleteUser() + { + Console.WriteLine("Begin: Test_DeleteUser"); + + VpnRpcDeleteUser in_rpc_delete_user = new VpnRpcDeleteUser() + { + HubName_str = hub_name, + Name_str = "test1", + }; + VpnRpcDeleteUser out_rpc_delete_user = api.DeleteUser(in_rpc_delete_user); + + Console.WriteLine("End: Test_DeleteUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumUser', Enumerate users + /// + public void Test_EnumUser() + { + Console.WriteLine("Begin: Test_EnumUser"); + + VpnRpcEnumUser in_rpc_enum_user = new VpnRpcEnumUser() + { + HubName_str = hub_name, + }; + VpnRpcEnumUser out_rpc_enum_user = api.EnumUser(in_rpc_enum_user); + + print_object(out_rpc_enum_user); + + Console.WriteLine("End: Test_EnumUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateGroup', Create a group + /// + public void Test_CreateGroup() + { + Console.WriteLine("Begin: Test_CreateGroup"); + + VpnRpcSetGroup in_rpc_set_group = new VpnRpcSetGroup() + { + HubName_str = hub_name, + Name_str = "group1", + Realname_utf = "Cat group", + Note_utf = "This is it! This is it!!", + UsePolicy_bool = true, + SecPol_Access_bool = true, + SecPol_DHCPFilter_bool = false, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = false, + SecPol_NoBridge_bool = false, + SecPol_NoRouting_bool = false, + SecPol_CheckMac_bool = false, + SecPol_CheckIP_bool = false, + SecPol_ArpDhcpOnly_bool = false, + SecPol_PrivacyFilter_bool = false, + SecPol_NoServer_bool = false, + SecPol_NoBroadcastLimiter_bool = false, + SecPol_MonitorPort_bool = false, + SecPol_MaxConnection_u32 = 32, + SecPol_TimeOut_u32 = 15, + SecPol_MaxMac_u32 = 1000, + SecPol_MaxIP_u32 = 1000, + SecPol_MaxUpload_u32 = 1000000000, + SecPol_MaxDownload_u32 = 1000000000, + SecPol_FixPassword_bool = false, + SecPol_MultiLogins_u32 = 1000, + SecPol_NoQoS_bool = false, + SecPol_RSandRAFilter_bool = false, + SecPol_RAFilter_bool = false, + SecPol_DHCPv6Filter_bool = false, + SecPol_DHCPv6NoServer_bool = false, + SecPol_NoRoutingV6_bool = false, + SecPol_CheckIPv6_bool = false, + SecPol_NoServerV6_bool = false, + SecPol_MaxIPv6_u32 = 1234, + SecPol_NoSavePassword_bool = false, + SecPol_AutoDisconnect_u32 = 0, + SecPol_FilterIPv4_bool = false, + SecPol_FilterIPv6_bool = false, + SecPol_FilterNonIP_bool = false, + SecPol_NoIPv6DefaultRouterInRA_bool = false, + SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool = false, + SecPol_VLanId_u32 = 0, + SecPol_Ver3_bool = true, + }; + VpnRpcSetGroup out_rpc_set_group = api.CreateGroup(in_rpc_set_group); + + print_object(out_rpc_set_group); + + Console.WriteLine("End: Test_CreateGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetGroup', Set group setting + /// + public void Test_SetGroup() + { + Console.WriteLine("Begin: Test_SetGroup"); + + VpnRpcSetGroup in_rpc_set_group = new VpnRpcSetGroup() + { + HubName_str = hub_name, + Name_str = "group1", + Realname_utf = "Cat group 2", + Note_utf = "This is it! This is it!! 2", + UsePolicy_bool = true, + SecPol_Access_bool = true, + SecPol_DHCPFilter_bool = false, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = false, + SecPol_NoBridge_bool = false, + SecPol_NoRouting_bool = false, + SecPol_CheckMac_bool = false, + SecPol_CheckIP_bool = false, + SecPol_ArpDhcpOnly_bool = false, + SecPol_PrivacyFilter_bool = false, + SecPol_NoServer_bool = false, + SecPol_NoBroadcastLimiter_bool = false, + SecPol_MonitorPort_bool = false, + SecPol_MaxConnection_u32 = 32, + SecPol_TimeOut_u32 = 15, + SecPol_MaxMac_u32 = 1000, + SecPol_MaxIP_u32 = 1000, + SecPol_MaxUpload_u32 = 1000000000, + SecPol_MaxDownload_u32 = 1000000000, + SecPol_FixPassword_bool = false, + SecPol_MultiLogins_u32 = 1000, + SecPol_NoQoS_bool = false, + SecPol_RSandRAFilter_bool = false, + SecPol_RAFilter_bool = false, + SecPol_DHCPv6Filter_bool = false, + SecPol_DHCPv6NoServer_bool = false, + SecPol_NoRoutingV6_bool = false, + SecPol_CheckIPv6_bool = false, + SecPol_NoServerV6_bool = false, + SecPol_MaxIPv6_u32 = 1234, + SecPol_NoSavePassword_bool = false, + SecPol_AutoDisconnect_u32 = 0, + SecPol_FilterIPv4_bool = false, + SecPol_FilterIPv6_bool = false, + SecPol_FilterNonIP_bool = false, + SecPol_NoIPv6DefaultRouterInRA_bool = false, + SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool = false, + SecPol_VLanId_u32 = 0, + SecPol_Ver3_bool = true, + }; + VpnRpcSetGroup out_rpc_set_group = api.SetGroup(in_rpc_set_group); + + print_object(out_rpc_set_group); + + Console.WriteLine("End: Test_SetGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetGroup', Get group information + /// + public void Test_GetGroup() + { + Console.WriteLine("Begin: Test_GetGroup"); + + VpnRpcSetGroup in_rpc_set_group = new VpnRpcSetGroup() + { + HubName_str = hub_name, + Name_str = "group1", + }; + VpnRpcSetGroup out_rpc_set_group = api.GetGroup(in_rpc_set_group); + + print_object(out_rpc_set_group); + + Console.WriteLine("End: Test_GetGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteGroup', Delete a group + /// + public void Test_DeleteGroup() + { + Console.WriteLine("Begin: Test_DeleteGroup"); + + VpnRpcDeleteUser in_rpc_delete_user = new VpnRpcDeleteUser() + { + HubName_str = hub_name, + Name_str = "group1", + }; + VpnRpcDeleteUser out_rpc_delete_user = api.DeleteGroup(in_rpc_delete_user); + + print_object(out_rpc_delete_user); + + Console.WriteLine("End: Test_DeleteGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumGroup', Enumerate groups + /// + public void Test_EnumGroup() + { + Console.WriteLine("Begin: Test_EnumGroup"); + + VpnRpcEnumGroup in_rpc_enum_group = new VpnRpcEnumGroup() + { + HubName_str = hub_name, + }; + VpnRpcEnumGroup out_rpc_enum_group = api.EnumGroup(in_rpc_enum_group); + + print_object(out_rpc_enum_group); + + Console.WriteLine("End: Test_EnumGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumSession', Enumerate sessions + /// + public VpnRpcEnumSession Test_EnumSession() + { + Console.WriteLine("Begin: Test_EnumSession"); + + VpnRpcEnumSession in_rpc_enum_session = new VpnRpcEnumSession() + { + HubName_str = hub_name, + }; + VpnRpcEnumSession out_rpc_enum_session = api.EnumSession(in_rpc_enum_session); + + print_object(out_rpc_enum_session); + + Console.WriteLine("End: Test_EnumSession"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_session; + } + + /// + /// API test for 'GetSessionStatus', Get session status + /// + public void Test_GetSessionStatus(string session_name) + { + Console.WriteLine("Begin: Test_GetSessionStatus"); + + VpnRpcSessionStatus in_rpc_session_status = new VpnRpcSessionStatus() + { + HubName_str = hub_name, + Name_str = session_name, + }; + VpnRpcSessionStatus out_rpc_session_status = api.GetSessionStatus(in_rpc_session_status); + + print_object(out_rpc_session_status); + + Console.WriteLine("End: Test_GetSessionStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteSession', Delete a session + /// + public void Test_DeleteSession(string session_id) + { + Console.WriteLine("Begin: Test_DeleteSession"); + + VpnRpcDeleteSession in_rpc_delete_session = new VpnRpcDeleteSession() + { + HubName_str = hub_name, + Name_str = session_id, + }; + VpnRpcDeleteSession out_rpc_delete_session = api.DeleteSession(in_rpc_delete_session); + + print_object(out_rpc_delete_session); + + Console.WriteLine("End: Test_DeleteSession"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumMacTable', Get MAC address table + /// + public VpnRpcEnumMacTable Test_EnumMacTable() + { + Console.WriteLine("Begin: Test_EnumMacTable"); + + VpnRpcEnumMacTable in_rpc_enum_mac_table = new VpnRpcEnumMacTable() + { + HubName_str = hub_name, + }; + VpnRpcEnumMacTable out_rpc_enum_mac_table = api.EnumMacTable(in_rpc_enum_mac_table); + + print_object(out_rpc_enum_mac_table); + + Console.WriteLine("End: Test_EnumMacTable"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_mac_table; + } + + /// + /// API test for 'DeleteMacTable', Delete MAC address table entry + /// + public void Test_DeleteMacTable(uint key32) + { + Console.WriteLine("Begin: Test_DeleteMacTable"); + + VpnRpcDeleteTable in_rpc_delete_table = new VpnRpcDeleteTable() + { + HubName_str = hub_name, + Key_u32 = key32, + }; + VpnRpcDeleteTable out_rpc_delete_table = api.DeleteMacTable(in_rpc_delete_table); + + Console.WriteLine("End: Test_DeleteMacTable"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumIpTable', Get IP address table + /// + public VpnRpcEnumIpTable Test_EnumIpTable() + { + Console.WriteLine("Begin: Test_EnumIpTable"); + + VpnRpcEnumIpTable in_rpc_enum_ip_table = new VpnRpcEnumIpTable() + { + HubName_str = hub_name, + }; + VpnRpcEnumIpTable out_rpc_enum_ip_table = api.EnumIpTable(in_rpc_enum_ip_table); + + print_object(out_rpc_enum_ip_table); + + Console.WriteLine("End: Test_EnumIpTable"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_ip_table; + } + + /// + /// API test for 'DeleteIpTable', Delete IP address table entry + /// + public void Test_DeleteIpTable(uint key32) + { + Console.WriteLine("Begin: Test_DeleteIpTable"); + + VpnRpcDeleteTable in_rpc_delete_table = new VpnRpcDeleteTable() + { + HubName_str = hub_name, + Key_u32 = key32, + }; + VpnRpcDeleteTable out_rpc_delete_table = api.DeleteIpTable(in_rpc_delete_table); + + print_object(out_rpc_delete_table); + + Console.WriteLine("End: Test_DeleteIpTable"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetKeep', Set keep-alive function setting + /// + public void Test_SetKeep() + { + Console.WriteLine("Begin: Test_SetKeep"); + + VpnRpcKeep in_rpc_keep = new VpnRpcKeep() + { + UseKeepConnect_bool = true, + KeepConnectHost_str = "www.softether.org", + KeepConnectPort_u32 = 123, + KeepConnectProtocol_u32 = VpnRpcKeepAliveProtocol.UDP, + KeepConnectInterval_u32 = 1, + }; + VpnRpcKeep out_rpc_keep = api.SetKeep(in_rpc_keep); + + print_object(out_rpc_keep); + + Console.WriteLine("End: Test_SetKeep"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetKeep', Get keep-alive function setting + /// + public void Test_GetKeep() + { + Console.WriteLine("Begin: Test_GetKeep"); + + VpnRpcKeep in_rpc_keep = new VpnRpcKeep() + { + }; + VpnRpcKeep out_rpc_keep = api.GetKeep(in_rpc_keep); + + print_object(out_rpc_keep); + + Console.WriteLine("End: Test_GetKeep"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnableSecureNAT', Enable SecureNAT function of the hub + /// + public void Test_EnableSecureNAT() + { + Console.WriteLine("Begin: Test_EnableSecureNAT"); + + VpnRpcHub in_rpc_hub = new VpnRpcHub() + { + HubName_str = hub_name, + }; + VpnRpcHub out_rpc_hub = api.EnableSecureNAT(in_rpc_hub); + + print_object(out_rpc_hub); + + Console.WriteLine("End: Test_EnableSecureNAT"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DisableSecureNAT', Disable the SecureNAT function of the hub + /// + public void Test_DisableSecureNAT() + { + Console.WriteLine("Begin: Test_DisableSecureNAT"); + + VpnRpcHub in_rpc_hub = new VpnRpcHub() + { + HubName_str = hub_name, + }; + VpnRpcHub out_rpc_hub = api.DisableSecureNAT(in_rpc_hub); + + print_object(out_rpc_hub); + + Console.WriteLine("End: Test_DisableSecureNAT"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetSecureNATOption', Set SecureNAT options + /// + public void Test_SetSecureNATOption() + { + Console.WriteLine("Begin: Test_SetSecureNATOption"); + + VpnVhOption in_vh_option = new VpnVhOption() + { + RpcHubName_str = hub_name, + MacAddress_bin = new byte[] { 0x00, 0xAC, 0x00, 0x11, 0x22, 0x33 }, + Ip_ip = "10.0.0.254", + Mask_ip = "255.255.255.0", + UseNat_bool = true, + Mtu_u32 = 1200, + NatTcpTimeout_u32 = 100, + NatUdpTimeout_u32 = 50, + UseDhcp_bool = true, + DhcpLeaseIPStart_ip = "10.0.0.101", + DhcpLeaseIPEnd_ip = "10.0.0.199", + DhcpSubnetMask_ip = "255.255.255.0", + DhcpExpireTimeSpan_u32 = 3600, + DhcpGatewayAddress_ip = "10.0.0.254", + DhcpDnsServerAddress_ip = "10.0.0.254", + DhcpDnsServerAddress2_ip = "8.8.8.8", + DhcpDomainName_str = "lab.coe.ad.jp", + SaveLog_bool = true, + ApplyDhcpPushRoutes_bool = false, + DhcpPushRoutes_str = "", + }; + VpnVhOption out_vh_option = api.SetSecureNATOption(in_vh_option); + + print_object(out_vh_option); + + Console.WriteLine("End: Test_SetSecureNATOption"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetSecureNATOption', Get SecureNAT options + /// + public void Test_GetSecureNATOption() + { + Console.WriteLine("Begin: Test_GetSecureNATOption"); + + VpnVhOption in_vh_option = new VpnVhOption() + { + RpcHubName_str = hub_name, + }; + VpnVhOption out_vh_option = api.GetSecureNATOption(in_vh_option); + + print_object(out_vh_option); + + Console.WriteLine("End: Test_GetSecureNATOption"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumNAT', Enumerate NAT entries of the SecureNAT + /// + public void Test_EnumNAT() + { + Console.WriteLine("Begin: Test_EnumNAT"); + + VpnRpcEnumNat in_rpc_enum_nat = new VpnRpcEnumNat() + { + HubName_str = hub_name, + }; + VpnRpcEnumNat out_rpc_enum_nat = api.EnumNAT(in_rpc_enum_nat); + + print_object(out_rpc_enum_nat); + + Console.WriteLine("End: Test_EnumNAT"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumDHCP', Enumerate DHCP entries + /// + public void Test_EnumDHCP() + { + Console.WriteLine("Begin: Test_EnumDHCP"); + + VpnRpcEnumDhcp in_rpc_enum_dhcp = new VpnRpcEnumDhcp() + { + HubName_str = hub_name, + }; + VpnRpcEnumDhcp out_rpc_enum_dhcp = api.EnumDHCP(in_rpc_enum_dhcp); + + print_object(out_rpc_enum_dhcp); + + Console.WriteLine("End: Test_EnumDHCP"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetSecureNATStatus', Get status of the SecureNAT + /// + public void Test_GetSecureNATStatus() + { + Console.WriteLine("Begin: Test_GetSecureNATStatus"); + + VpnRpcNatStatus in_rpc_nat_status = new VpnRpcNatStatus() + { + HubName_str = hub_name, + }; + VpnRpcNatStatus out_rpc_nat_status = api.GetSecureNATStatus(in_rpc_nat_status); + + print_object(out_rpc_nat_status); + + Console.WriteLine("End: Test_GetSecureNATStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumEthernet', Enumerate Ethernet devices + /// + public void Test_EnumEthernet() + { + Console.WriteLine("Begin: Test_EnumEthernet"); + + VpnRpcEnumEth out_rpc_enum_eth = api.EnumEthernet(); + + print_object(out_rpc_enum_eth); + + Console.WriteLine("End: Test_EnumEthernet"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddLocalBridge', Add a new local bridge + /// + public void Test_AddLocalBridge() + { + Console.WriteLine("Begin: Test_AddLocalBridge"); + + VpnRpcLocalBridge in_rpc_localbridge = new VpnRpcLocalBridge() + { + DeviceName_str = "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str = hub_name, + }; + VpnRpcLocalBridge out_rpc_localbridge = api.AddLocalBridge(in_rpc_localbridge); + + print_object(out_rpc_localbridge); + + Console.WriteLine("End: Test_AddLocalBridge"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteLocalBridge', Delete a local bridge + /// + public void Test_DeleteLocalBridge() + { + Console.WriteLine("Begin: Test_DeleteLocalBridge"); + + VpnRpcLocalBridge in_rpc_localbridge = new VpnRpcLocalBridge() + { + DeviceName_str = "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str = hub_name, + }; + VpnRpcLocalBridge out_rpc_localbridge = api.DeleteLocalBridge(in_rpc_localbridge); + + print_object(out_rpc_localbridge); + + Console.WriteLine("End: Test_DeleteLocalBridge"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumLocalBridge', Enumerate local bridges + /// + public void Test_EnumLocalBridge() + { + Console.WriteLine("Begin: Test_EnumLocalBridge"); + + VpnRpcEnumLocalBridge out_rpc_enum_localbridge = api.EnumLocalBridge(); + + print_object(out_rpc_enum_localbridge); + + Console.WriteLine("End: Test_EnumLocalBridge"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetBridgeSupport', Get availability to localbridge function + /// + public void Test_GetBridgeSupport() + { + Console.WriteLine("Begin: Test_GetBridgeSupport"); + + VpnRpcBridgeSupport out_rpc_bridge_support = api.GetBridgeSupport(); + + print_object(out_rpc_bridge_support); + + Console.WriteLine("End: Test_GetBridgeSupport"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'RebootServer', Reboot server itself + /// + public void Test_RebootServer() + { + Console.WriteLine("Begin: Test_RebootServer"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + }; + VpnRpcTest out_rpc_test = api.RebootServer(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_RebootServer"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetCaps', Get capabilities + /// + public void Test_GetCaps() + { + Console.WriteLine("Begin: Test_GetCaps"); + + VpnCapslist out_capslist = api.GetCaps(); + + print_object(out_capslist); + + Console.WriteLine("End: Test_GetCaps"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetConfig', Get configuration file stream + /// + public void Test_GetConfig() + { + Console.WriteLine("Begin: Test_GetConfig"); + + VpnRpcConfig out_rpc_config = api.GetConfig(); + + print_object(out_rpc_config); + + Console.WriteLine("End: Test_GetConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetConfig', Overwrite configuration file by specified data + /// + public void Test_SetConfig() + { + Console.WriteLine("Begin: Test_SetConfig"); + + VpnRpcConfig in_rpc_config = new VpnRpcConfig() + { + FileData_bin = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, }, + }; + VpnRpcConfig out_rpc_config = api.SetConfig(in_rpc_config); + + Console.WriteLine("End: Test_SetConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetDefaultHubAdminOptions', Get default hub administration options + /// + public void Test_GetDefaultHubAdminOptions() + { + Console.WriteLine("Begin: Test_GetDefaultHubAdminOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + }; + VpnRpcAdminOption out_rpc_admin_option = api.GetDefaultHubAdminOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_GetDefaultHubAdminOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubAdminOptions', Get hub administration options + /// + public void Test_GetHubAdminOptions() + { + Console.WriteLine("Begin: Test_GetHubAdminOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + }; + VpnRpcAdminOption out_rpc_admin_option = api.GetHubAdminOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_GetHubAdminOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubAdminOptions', Set hub administration options + /// + public void Test_SetHubAdminOptions() + { + Console.WriteLine("Begin: Test_SetHubAdminOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + AdminOptionList = new VpnAdminOption[] + { + new VpnAdminOption() + { + Name_str = "no_securenat_enablenat", + Value_u32 = 1, + } + } + }; + VpnRpcAdminOption out_rpc_admin_option = api.SetHubAdminOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_SetHubAdminOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubExtOptions', Get hub extended options + /// + public void Test_GetHubExtOptions() + { + Console.WriteLine("Begin: Test_GetHubExtOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + }; + VpnRpcAdminOption out_rpc_admin_option = api.GetHubExtOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_GetHubExtOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubExtOptions', Set hub extended options + /// + public void Test_SetHubExtOptions() + { + Console.WriteLine("Begin: Test_SetHubExtOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + AdminOptionList = new VpnAdminOption[] + { + new VpnAdminOption() + { + Name_str = "SecureNAT_RandomizeAssignIp", + Value_u32 = 1, + } + } + }; + VpnRpcAdminOption out_rpc_admin_option = api.SetHubExtOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_SetHubExtOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddL3Switch', Add a new virtual layer-3 switch + /// + public void Test_AddL3Switch() + { + Console.WriteLine("Begin: Test_AddL3Switch"); + + VpnRpcL3Sw in_rpc_l3sw = new VpnRpcL3Sw() + { + Name_str = "L3SW1", + }; + VpnRpcL3Sw out_rpc_l3sw = api.AddL3Switch(in_rpc_l3sw); + + print_object(out_rpc_l3sw); + + Console.WriteLine("End: Test_AddL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DelL3Switch', Delete a virtual layer-3 switch + /// + public void Test_DelL3Switch() + { + Console.WriteLine("Begin: Test_DelL3Switch"); + + VpnRpcL3Sw in_rpc_l3sw = new VpnRpcL3Sw() + { + Name_str = "L3SW1", + }; + VpnRpcL3Sw out_rpc_l3sw = api.DelL3Switch(in_rpc_l3sw); + + print_object(out_rpc_l3sw); + + Console.WriteLine("End: Test_DelL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumL3Switch', Enumerate virtual layer-3 switches + /// + public void Test_EnumL3Switch() + { + Console.WriteLine("Begin: Test_EnumL3Switch"); + + VpnRpcEnumL3Sw out_rpc_enum_l3sw = api.EnumL3Switch(); + + print_object(out_rpc_enum_l3sw); + + Console.WriteLine("End: Test_EnumL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'StartL3Switch', Start a virtual layer-3 switch + /// + public void Test_StartL3Switch() + { + Console.WriteLine("Begin: Test_StartL3Switch"); + + VpnRpcL3Sw in_rpc_l3sw = new VpnRpcL3Sw() + { + Name_str = "L3SW1", + }; + VpnRpcL3Sw out_rpc_l3sw = api.StartL3Switch(in_rpc_l3sw); + + print_object(out_rpc_l3sw); + + Console.WriteLine("End: Test_StartL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'StopL3Switch', Stop a virtual layer-3 switch + /// + public void Test_StopL3Switch() + { + Console.WriteLine("Begin: Test_StopL3Switch"); + + VpnRpcL3Sw in_rpc_l3sw = new VpnRpcL3Sw() + { + Name_str = "L3SW1", + }; + VpnRpcL3Sw out_rpc_l3sw = api.StopL3Switch(in_rpc_l3sw); + + print_object(out_rpc_l3sw); + + Console.WriteLine("End: Test_StopL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddL3If', Add new virtual interface on virtual L3 switch + /// + public void Test_AddL3If() + { + Console.WriteLine("Begin: Test_AddL3If"); + + VpnRpcL3If in_rpc_l3if = new VpnRpcL3If() + { + Name_str = "L3SW1", + HubName_str = hub_name, + IpAddress_ip = "192.168.0.1", + SubnetMask_ip = "255.255.255.0", + }; + VpnRpcL3If out_rpc_l3if = api.AddL3If(in_rpc_l3if); + + print_object(out_rpc_l3if); + + Console.WriteLine("End: Test_AddL3If"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DelL3If', Delete a virtual interface on virtual L3 switch + /// + public void Test_DelL3If() + { + Console.WriteLine("Begin: Test_DelL3If"); + + VpnRpcL3If in_rpc_l3if = new VpnRpcL3If() + { + Name_str = "L3SW1", + HubName_str = hub_name, + }; + VpnRpcL3If out_rpc_l3if = api.DelL3If(in_rpc_l3if); + + print_object(out_rpc_l3if); + + Console.WriteLine("End: Test_DelL3If"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumL3If', Enumerate virtual interfaces on virtual L3 switch + /// + public void Test_EnumL3If() + { + Console.WriteLine("Begin: Test_EnumL3If"); + + VpnRpcEnumL3If in_rpc_enum_l3if = new VpnRpcEnumL3If() + { + Name_str = "L3SW1", + }; + VpnRpcEnumL3If out_rpc_enum_l3if = api.EnumL3If(in_rpc_enum_l3if); + + print_object(out_rpc_enum_l3if); + + Console.WriteLine("End: Test_EnumL3If"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddL3Table', Add new routing table entry on virtual L3 switch + /// + public void Test_AddL3Table() + { + Console.WriteLine("Begin: Test_AddL3Table"); + + VpnRpcL3Table in_rpc_l3table = new VpnRpcL3Table() + { + Name_str = "L3SW1", + NetworkAddress_ip = "10.0.0.0", + SubnetMask_ip = "255.0.0.0", + GatewayAddress_ip = "192.168.7.1", + Metric_u32 = 10, + }; + VpnRpcL3Table out_rpc_l3table = api.AddL3Table(in_rpc_l3table); + + print_object(out_rpc_l3table); + + Console.WriteLine("End: Test_AddL3Table"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DelL3Table', Delete routing table entry on virtual L3 switch + /// + public void Test_DelL3Table() + { + Console.WriteLine("Begin: Test_DelL3Table"); + + VpnRpcL3Table in_rpc_l3table = new VpnRpcL3Table() + { + Name_str = "L3SW1", + NetworkAddress_ip = "10.0.0.0", + SubnetMask_ip = "255.0.0.0", + GatewayAddress_ip = "192.168.7.1", + Metric_u32 = 10, + }; + VpnRpcL3Table out_rpc_l3table = api.DelL3Table(in_rpc_l3table); + + print_object(out_rpc_l3table); + + Console.WriteLine("End: Test_DelL3Table"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumL3Table', Get routing table on virtual L3 switch + /// + public void Test_EnumL3Table() + { + Console.WriteLine("Begin: Test_EnumL3Table"); + + VpnRpcEnumL3Table in_rpc_enum_l3table = new VpnRpcEnumL3Table() + { + Name_str = "L3SW1", + }; + VpnRpcEnumL3Table out_rpc_enum_l3table = api.EnumL3Table(in_rpc_enum_l3table); + + print_object(out_rpc_enum_l3table); + + Console.WriteLine("End: Test_EnumL3Table"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumCrl', Get CRL (Certificate Revocation List) index + /// + public VpnRpcEnumCrl Test_EnumCrl() + { + Console.WriteLine("Begin: Test_EnumCrl"); + + VpnRpcEnumCrl in_rpc_enum_crl = new VpnRpcEnumCrl() + { + HubName_str = hub_name, + }; + VpnRpcEnumCrl out_rpc_enum_crl = api.EnumCrl(in_rpc_enum_crl); + + print_object(out_rpc_enum_crl); + + Console.WriteLine("End: Test_EnumCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_crl; + } + + /// + /// API test for 'AddCrl', Add new CRL (Certificate Revocation List) entry + /// + public void Test_AddCrl() + { + Console.WriteLine("Begin: Test_AddCrl"); + + VpnRpcCrl in_rpc_crl = new VpnRpcCrl() + { + HubName_str = hub_name, + CommonName_utf = "CN", + Organization_utf = "Org", + Unit_utf = "ICSCOE", + Country_utf = "JP", + State_utf = "Ibaraki", + Local_utf = "Tsukuba", + Serial_bin = new byte[] { 1, 2, 3, 4, 5 }, + DigestMD5_bin = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, + DigestSHA1_bin = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }, + }; + VpnRpcCrl out_rpc_crl = api.AddCrl(in_rpc_crl); + + print_object(out_rpc_crl); + + Console.WriteLine("End: Test_AddCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DelCrl', Delete CRL (Certificate Revocation List) entry + /// + public void Test_DelCrl(uint key) + { + Console.WriteLine("Begin: Test_DelCrl"); + + VpnRpcCrl in_rpc_crl = new VpnRpcCrl() + { + HubName_str = hub_name, + Key_u32 = key, + }; + VpnRpcCrl out_rpc_crl = api.DelCrl(in_rpc_crl); + + print_object(out_rpc_crl); + + Console.WriteLine("End: Test_DelCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetCrl', Get CRL (Certificate Revocation List) entry + /// + public VpnRpcCrl Test_GetCrl(uint key) + { + Console.WriteLine("Begin: Test_GetCrl"); + + VpnRpcCrl in_rpc_crl = new VpnRpcCrl() + { + HubName_str = hub_name, + Key_u32 = key, + }; + VpnRpcCrl out_rpc_crl = api.GetCrl(in_rpc_crl); + + print_object(out_rpc_crl); + + Console.WriteLine("End: Test_GetCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_crl; + } + + /// + /// API test for 'SetCrl', Set CRL (Certificate Revocation List) entry + /// + public void Test_SetCrl(VpnRpcCrl crl) + { + Console.WriteLine("Begin: Test_SetCrl"); + + VpnRpcCrl out_rpc_crl = api.SetCrl(crl); + + print_object(out_rpc_crl); + + Console.WriteLine("End: Test_SetCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetAcList', Set access control list + /// + public void Test_SetAcList() + { + Console.WriteLine("Begin: Test_SetAcList"); + + VpnRpcAcList in_rpc_ac_list = new VpnRpcAcList() + { + HubName_str = hub_name, + + ACList = new VpnAc[] + { + new VpnAc() + { + Deny_bool = true, + IpAddress_ip = "192.168.0.0", + SubnetMask_ip = "255.255.0.0", + Masked_bool = true, + Priority_u32 = 123, + }, + new VpnAc() + { + Deny_bool = false, + IpAddress_ip = "fe80::", + SubnetMask_ip = "8", + Masked_bool = true, + Priority_u32 = 123, + }, + } + }; + VpnRpcAcList out_rpc_ac_list = api.SetAcList(in_rpc_ac_list); + + print_object(out_rpc_ac_list); + + Console.WriteLine("End: Test_SetAcList"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetAcList', Get access control list + /// + public void Test_GetAcList() + { + Console.WriteLine("Begin: Test_GetAcList"); + + VpnRpcAcList in_rpc_ac_list = new VpnRpcAcList() + { + HubName_str = hub_name, + }; + VpnRpcAcList out_rpc_ac_list = api.GetAcList(in_rpc_ac_list); + + print_object(out_rpc_ac_list); + + Console.WriteLine("End: Test_GetAcList"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumLogFile', Enumerate log files + /// + public VpnRpcEnumLogFile Test_EnumLogFile() + { + Console.WriteLine("Begin: Test_EnumLogFile"); + + VpnRpcEnumLogFile out_rpc_enum_log_file = api.EnumLogFile(); + + print_object(out_rpc_enum_log_file); + + Console.WriteLine("End: Test_EnumLogFile"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_log_file; + } + + /// + /// API test for 'ReadLogFile', Read a log file + /// + public void Test_ReadLogFile(string filename) + { + Console.WriteLine("Begin: Test_ReadLogFile"); + + VpnRpcReadLogFile in_rpc_read_log_file = new VpnRpcReadLogFile() + { + FilePath_str = filename, + }; + VpnRpcReadLogFile out_rpc_read_log_file = api.ReadLogFile(in_rpc_read_log_file); + + print_object(out_rpc_read_log_file); + + Console.WriteLine("End: Test_ReadLogFile"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetSysLog', Set syslog function setting + /// + public void Test_SetSysLog(bool flag) + { + Console.WriteLine("Begin: Test_SetSysLog"); + + VpnSyslogSetting in_syslog_setting = new VpnSyslogSetting() + { + SaveType_u32 = flag ? VpnSyslogSaveType.ServerAndHubAllLog : VpnSyslogSaveType.None, + Hostname_str = "1.2.3.4", + Port_u32 = 123, + }; + VpnSyslogSetting out_syslog_setting = api.SetSysLog(in_syslog_setting); + + print_object(out_syslog_setting); + + Console.WriteLine("End: Test_SetSysLog"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetSysLog', Get syslog function setting + /// + public void Test_GetSysLog() + { + Console.WriteLine("Begin: Test_GetSysLog"); + + VpnSyslogSetting in_syslog_setting = new VpnSyslogSetting() + { + }; + VpnSyslogSetting out_syslog_setting = api.GetSysLog(in_syslog_setting); + + print_object(out_syslog_setting); + + Console.WriteLine("End: Test_GetSysLog"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubMsg', Set message of today on hub + /// + public void Test_SetHubMsg() + { + Console.WriteLine("Begin: Test_SetHubMsg"); + + VpnRpcMsg in_rpc_msg = new VpnRpcMsg() + { + HubName_str = hub_name, + Msg_bin = new byte[] + { +0x57,0x6f,0x72,0x6b,0x69,0x6e,0x67,0x20,0x4d,0x65,0x6e,0x20,0x6f,0x66,0x20,0x41, +0x6c,0x6c,0x20,0x43,0x6f,0x75,0x6e,0x74,0x72,0x69,0x65,0x73,0x2c,0x20,0x55,0x6e, +0x69,0x74,0x65,0x21,0x20,0xe4,0xb8,0x87,0xe5,0x9b,0xbd,0xe3,0x81,0xae,0xe5,0x8a, +0xb4,0xe5,0x83,0x8d,0xe8,0x80,0x85,0xe3,0x82,0x88,0xe3,0x80,0x81,0xe5,0x9b,0xa3, +0xe7,0xb5,0x90,0xe3,0x81,0x9b,0xe3,0x82,0x88,0x21,0x20,0xd7,0x92,0xd7,0x91,0xd7, +0xa8,0xd7,0x99,0xd7,0x9d,0x20,0xd7,0xa2,0xd7,0x95,0xd7,0x91,0xd7,0x93,0xd7,0x99, +0xd7,0x9d,0x20,0xd7,0xa9,0xd7,0x9c,0x20,0xd7,0x9b,0xd7,0x9c,0x20,0xd7,0x94,0xd7, +0x9e,0xd7,0x93,0xd7,0x99,0xd7,0xa0,0xd7,0x95,0xd7,0xaa,0x2c,0x20,0xd7,0x94,0xd7, +0xaa,0xd7,0x90,0xd7,0x97,0xd7,0x93,0xd7,0x95,0x21 + }, + }; + VpnRpcMsg out_rpc_msg = api.SetHubMsg(in_rpc_msg); + + print_object(out_rpc_msg); + + Console.WriteLine("End: Test_SetHubMsg"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubMsg', Get message of today on hub + /// + public void Test_GetHubMsg() + { + Console.WriteLine("Begin: Test_GetHubMsg"); + + VpnRpcMsg in_rpc_msg = new VpnRpcMsg() + { + HubName_str = hub_name, + }; + VpnRpcMsg out_rpc_msg = api.GetHubMsg(in_rpc_msg); + + print_object(out_rpc_msg); + + Console.WriteLine("End: Test_GetHubMsg"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'Crash', Do Crash + /// + public void Test_Crash() + { + Console.WriteLine("Begin: Test_Crash"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + }; + VpnRpcTest out_rpc_test = api.Crash(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_Crash"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetAdminMsg', Get message for administrators + /// + public void Test_GetAdminMsg() + { + Console.WriteLine("Begin: Test_GetAdminMsg"); + + VpnRpcMsg out_rpc_msg = api.GetAdminMsg(); + + print_object(out_rpc_msg); + + Console.WriteLine("End: Test_GetAdminMsg"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'Flush', Flush configuration file + /// + public void Test_Flush() + { + Console.WriteLine("Begin: Test_Flush"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + }; + VpnRpcTest out_rpc_test = api.Flush(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_Flush"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetIPsecServices', Set IPsec service configuration + /// + public void Test_SetIPsecServices() + { + Console.WriteLine("Begin: Test_SetIPsecServices"); + + VpnIPsecServices in_ipsec_services = new VpnIPsecServices() + { + L2TP_Raw_bool = false, + L2TP_IPsec_bool = false, + EtherIP_IPsec_bool = false, + IPsec_Secret_str = "vpn", + L2TP_DefaultHub_str = "HUB_ABC", + }; + VpnIPsecServices out_ipsec_services = api.SetIPsecServices(in_ipsec_services); + + print_object(out_ipsec_services); + + Console.WriteLine("End: Test_SetIPsecServices"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetIPsecServices', Get IPsec service configuration + /// + public void Test_GetIPsecServices() + { + Console.WriteLine("Begin: Test_GetIPsecServices"); + + VpnIPsecServices out_ipsec_services = api.GetIPsecServices(); + + print_object(out_ipsec_services); + + Console.WriteLine("End: Test_GetIPsecServices"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddEtherIpId', Add EtherIP ID setting + /// + public void Test_AddEtherIpId() + { + Console.WriteLine("Begin: Test_AddEtherIpId"); + + VpnEtherIpId in_etherip_id = new VpnEtherIpId() + { + Id_str = "testid", + HubName_str = hub_name, + UserName_str = "nekosan", + Password_str = "torisan", + }; + VpnEtherIpId out_etherip_id = api.AddEtherIpId(in_etherip_id); + + print_object(out_etherip_id); + + Console.WriteLine("End: Test_AddEtherIpId"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetEtherIpId', Get EtherIP ID setting + /// + public void Test_GetEtherIpId(string id) + { + Console.WriteLine("Begin: Test_GetEtherIpId"); + + VpnEtherIpId in_etherip_id = new VpnEtherIpId() + { + Id_str = id, + }; + VpnEtherIpId out_etherip_id = api.GetEtherIpId(in_etherip_id); + + print_object(out_etherip_id); + + Console.WriteLine("End: Test_GetEtherIpId"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteEtherIpId', Delete EtherIP ID setting + /// + public void Test_DeleteEtherIpId(string id) + { + Console.WriteLine("Begin: Test_DeleteEtherIpId"); + + VpnEtherIpId in_etherip_id = new VpnEtherIpId() + { + Id_str = id, + }; + VpnEtherIpId out_etherip_id = api.DeleteEtherIpId(in_etherip_id); + + print_object(out_etherip_id); + + Console.WriteLine("End: Test_DeleteEtherIpId"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumEtherIpId', Enumerate EtherIP ID settings + /// + public VpnRpcEnumEtherIpId Test_EnumEtherIpId() + { + Console.WriteLine("Begin: Test_EnumEtherIpId"); + + VpnRpcEnumEtherIpId out_rpc_enum_etherip_id = api.EnumEtherIpId(); + + print_object(out_rpc_enum_etherip_id); + + Console.WriteLine("End: Test_EnumEtherIpId"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_etherip_id; + } + + /// + /// API test for 'SetOpenVpnSstpConfig', Set configurations for OpenVPN and SSTP + /// + public void Test_SetOpenVpnSstpConfig() + { + Console.WriteLine("Begin: Test_SetOpenVpnSstpConfig"); + + VpnOpenVpnSstpConfig in_openvpn_sstp_config = new VpnOpenVpnSstpConfig() + { + EnableOpenVPN_bool = true, + OpenVPNPortList_str = "1 2 3 4 5", + EnableSSTP_bool = true, + }; + VpnOpenVpnSstpConfig out_openvpn_sstp_config = api.SetOpenVpnSstpConfig(in_openvpn_sstp_config); + + print_object(out_openvpn_sstp_config); + + Console.WriteLine("End: Test_SetOpenVpnSstpConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetOpenVpnSstpConfig', Get configurations for OpenVPN and SSTP + /// + public void Test_GetOpenVpnSstpConfig() + { + Console.WriteLine("Begin: Test_GetOpenVpnSstpConfig"); + + VpnOpenVpnSstpConfig out_openvpn_sstp_config = api.GetOpenVpnSstpConfig(); + + print_object(out_openvpn_sstp_config); + + Console.WriteLine("End: Test_GetOpenVpnSstpConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetDDnsClientStatus', Get status of DDNS client + /// + public void Test_GetDDnsClientStatus() + { + Console.WriteLine("Begin: Test_GetDDnsClientStatus"); + + VpnDDnsClientStatus out_ddns_client_status = api.GetDDnsClientStatus(); + + print_object(out_ddns_client_status); + + Console.WriteLine("End: Test_GetDDnsClientStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'ChangeDDnsClientHostname', Change host-name for DDNS client + /// + public void Test_ChangeDDnsClientHostname() + { + Console.WriteLine("Begin: Test_ChangeDDnsClientHostname"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + StrValue_str = "nekotest" + rand.Next(1000000000, 2100000000), + }; + VpnRpcTest out_rpc_test = api.ChangeDDnsClientHostname(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_ChangeDDnsClientHostname"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'RegenerateServerCert', Regenerate server certification + /// + public void Test_RegenerateServerCert() + { + Console.WriteLine("Begin: Test_RegenerateServerCert"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + StrValue_str = "abc.example.org", + }; + + VpnRpcTest out_rpc_test = api.RegenerateServerCert(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_RegenerateServerCert"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'MakeOpenVpnConfigFile', Generate OpenVPN configuration files + /// + public void Test_MakeOpenVpnConfigFile() + { + Console.WriteLine("Begin: Test_MakeOpenVpnConfigFile"); + + VpnRpcReadLogFile out_rpc_read_log_file = api.MakeOpenVpnConfigFile(); + + print_object(out_rpc_read_log_file); + + Console.WriteLine("End: Test_MakeOpenVpnConfigFile"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetSpecialListener', Set special listener status + /// + public void Test_SetSpecialListener() + { + Console.WriteLine("Begin: Test_SetSpecialListener"); + + VpnRpcSpecialListener in_rpc_special_listener = new VpnRpcSpecialListener() + { + VpnOverDnsListener_bool = true, + VpnOverIcmpListener_bool = true, + }; + VpnRpcSpecialListener out_rpc_special_listener = api.SetSpecialListener(in_rpc_special_listener); + + print_object(out_rpc_special_listener); + + Console.WriteLine("End: Test_SetSpecialListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetSpecialListener', Get special listener status + /// + public void Test_GetSpecialListener() + { + Console.WriteLine("Begin: Test_GetSpecialListener"); + + VpnRpcSpecialListener out_rpc_special_listener = api.GetSpecialListener(); + + print_object(out_rpc_special_listener); + + Console.WriteLine("End: Test_GetSpecialListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetAzureStatus', Get Azure status + /// + public void Test_GetAzureStatus() + { + Console.WriteLine("Begin: Test_GetAzureStatus"); + + VpnRpcAzureStatus out_rpc_azure_status = api.GetAzureStatus(); + + print_object(out_rpc_azure_status); + + Console.WriteLine("End: Test_GetAzureStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetAzureStatus', Set Azure status + /// + public void Test_SetAzureStatus() + { + Console.WriteLine("Begin: Test_SetAzureStatus"); + + VpnRpcAzureStatus in_rpc_azure_status = new VpnRpcAzureStatus() + { + IsEnabled_bool = true, + }; + VpnRpcAzureStatus out_rpc_azure_status = api.SetAzureStatus(in_rpc_azure_status); + + print_object(out_rpc_azure_status); + + Console.WriteLine("End: Test_SetAzureStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetDDnsInternetSettng', Get DDNS proxy configuration + /// + public void Test_GetDDnsInternetSettng() + { + Console.WriteLine("Begin: Test_GetDDnsInternetSettng"); + + VpnInternetSetting out_internet_setting = api.GetDDnsInternetSettng(); + + print_object(out_internet_setting); + + Console.WriteLine("End: Test_GetDDnsInternetSettng"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetDDnsInternetSettng', Set DDNS proxy configuration + /// + public void Test_SetDDnsInternetSettng() + { + Console.WriteLine("Begin: Test_SetDDnsInternetSettng"); + + VpnInternetSetting in_internet_setting = new VpnInternetSetting() + { + ProxyType_u32 = VpnRpcProxyType.Direct, + ProxyHostName_str = "1.2.3.4", + ProxyPort_u32 = 1234, + ProxyUsername_str = "neko", + ProxyPassword_str = "dog", + }; + VpnInternetSetting out_internet_setting = api.SetDDnsInternetSettng(in_internet_setting); + + print_object(out_internet_setting); + + Console.WriteLine("End: Test_SetDDnsInternetSettng"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetVgsConfig', Setting VPN Gate Server Configuration + /// + public void Test_SetVgsConfig() + { + Console.WriteLine("Begin: Test_SetVgsConfig"); + + VpnVgsConfig in_vgs_config = new VpnVgsConfig() + { + IsEnabled_bool = false, + Message_utf = "Neko san!!!", + Owner_utf = "Go go go!!!", + Abuse_utf = "da.test@softether.co.jp", + NoLog_bool = false, + LogPermanent_bool = true, + EnableL2TP_bool = true, + }; + VpnVgsConfig out_vgs_config = api.SetVgsConfig(in_vgs_config); + + print_object(out_vgs_config); + + Console.WriteLine("End: Test_SetVgsConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetVgsConfig', Get VPN Gate configuration + /// + public void Test_GetVgsConfig() + { + Console.WriteLine("Begin: Test_GetVgsConfig"); + + VpnVgsConfig out_vgs_config = api.GetVgsConfig(); + + print_object(out_vgs_config); + + Console.WriteLine("End: Test_GetVgsConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + + void print_object(object obj) + { + var setting = new Newtonsoft.Json.JsonSerializerSettings() + { + NullValueHandling = Newtonsoft.Json.NullValueHandling.Include, + ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Error, + }; + string str = Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented, setting); + Console.WriteLine(str); + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/vpnserver-jsonrpc-client-csharp.csproj softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/vpnserver-jsonrpc-client-csharp.csproj --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/vpnserver-jsonrpc-client-csharp.csproj 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/vpnserver-jsonrpc-client-csharp.csproj 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp2.1 + SoftEther.VPNServerRpc + + + + + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/vpnserver-jsonrpc-client-csharp.sln softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/vpnserver-jsonrpc-client-csharp.sln --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/vpnserver-jsonrpc-client-csharp.sln 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/vpnserver-jsonrpc-client-csharp.sln 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2041 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vpnserver-jsonrpc-client-csharp", "vpnserver-jsonrpc-client-csharp.csproj", "{81CA3EC4-026E-4D37-9889-828186BBB8C0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {81CA3EC4-026E-4D37-9889-828186BBB8C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81CA3EC4-026E-4D37-9889-828186BBB8C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81CA3EC4-026E-4D37-9889-828186BBB8C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81CA3EC4-026E-4D37-9889-828186BBB8C0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D87E5CF1-9A10-431C-AC42-F1041470AEE8} + EndGlobalSection +EndGlobal diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.d.ts softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.d.ts --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.d.ts 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=sample.d.ts.map \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.d.ts.map softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.d.ts.map --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.d.ts.map 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.d.ts.map 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1 @@ +{"version":3,"file":"sample.d.ts","sourceRoot":"","sources":["../src/sample.ts"],"names":[],"mappings":""} \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,4146 @@ +"use strict"; +// Test sample code for SoftEther VPN Server JSON-RPC Stub +// Runs on both web browsers and Node.js +// +// sample.ts +// Automatically generated at 2019-05-29 18:21:39 by vpnserver-jsonrpc-codegen +// +// This sample code shows how to call all available RPC functions. +// You can copy and paste test code to write your own web browser TypeScript / JavaScript codes. +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +// On the web browser uncomment below imports as necessary to support old browsers. +// import "core-js/es6/promise"; +// import "core-js/es6/string"; +// import "whatwg-fetch"; +// Import the vpnrpc.ts RPC stub. +var VPN = __importStar(require("./vpnrpc")); +// Output JSON-RPC request / reply strings to the debug console. +VPN.VpnServerRpc.SetDebugMode(true); +var api; +// Creating the VpnServerRpc class instance here. +if (VPN.VpnServerRpc.IsNodeJS() === false) // // Determine if this JavaScript environment is on the Node.js or not + { + // On the web browser. We do not need to specify any hostname, port or credential as the web browser already knows it. + api = new VPN.VpnServerRpc(); +} +else { + // On the Node.js. We need to specify the target VPN Server's hostname, port and credential. + api = new VPN.VpnServerRpc("127.0.0.1", 443, "", "PASSWORD_HERE", false); +} +// A variable for test +var hub_name = "test"; +// Call the Test_All() function to test almost all VPN APIs. +Test_All(); +/** Tests all VPN APIs */ +function Test_All() { + return __awaiter(this, void 0, void 0, function () { + var new_listener_port, farm_members, _i, _a, farm_member, enum_connection, _b, _c, connecton, hub_log_settings, enum_ca, _d, _e, ca, enum_link, _f, _g, link, enum_session, _h, _j, session, enum_mac, _k, _l, mac, enum_ip, _m, _o, ip, enum_crl, _p, _q, crl, got_crl, _r, _s, crl, enum_log_file, _t, _u, log, enum_etherip_id, _v, _w, etherip_id; + return __generator(this, function (_x) { + switch (_x.label) { + case 0: + hub_name = "TEST"; + return [4 /*yield*/, Test_Test()]; + case 1: + _x.sent(); + return [4 /*yield*/, Test_GetServerInfo()]; + case 2: + _x.sent(); + return [4 /*yield*/, Test_GetServerStatus()]; + case 3: + _x.sent(); + return [4 /*yield*/, Test_CreateListener()]; + case 4: + new_listener_port = _x.sent(); + return [4 /*yield*/, Test_EnableListener(new_listener_port, false)]; + case 5: + _x.sent(); + return [4 /*yield*/, Test_EnumListener()]; + case 6: + _x.sent(); + return [4 /*yield*/, Test_EnableListener(new_listener_port, true)]; + case 7: + _x.sent(); + return [4 /*yield*/, Test_EnumListener()]; + case 8: + _x.sent(); + return [4 /*yield*/, Test_DeleteListener(new_listener_port)]; + case 9: + _x.sent(); + return [4 /*yield*/, Test_SetServerPassword()]; + case 10: + _x.sent(); + return [4 /*yield*/, Test_GetFarmSetting()]; + case 11: + _x.sent(); + if (!false) return [3 /*break*/, 19]; + return [4 /*yield*/, Test_SetFarmSetting()]; + case 12: + _x.sent(); + return [4 /*yield*/, Test_EnumFarmMember()]; + case 13: + farm_members = _x.sent(); + _i = 0, _a = farm_members.FarmMemberList; + _x.label = 14; + case 14: + if (!(_i < _a.length)) return [3 /*break*/, 17]; + farm_member = _a[_i]; + return [4 /*yield*/, Test_GetFarmInfo(farm_member.Id_u32)]; + case 15: + _x.sent(); + _x.label = 16; + case 16: + _i++; + return [3 /*break*/, 14]; + case 17: return [4 /*yield*/, Test_GetFarmConnectionStatus()]; + case 18: + _x.sent(); + return [3 /*break*/, 20]; + case 19: + if (false) { + console.log("abc"); + } + else { + console.log("def"); + } + _x.label = 20; + case 20: return [4 /*yield*/, Test_GetServerCert()]; + case 21: + _x.sent(); + return [4 /*yield*/, Test_SetServerCert()]; + case 22: + _x.sent(); + return [4 /*yield*/, Test_GetServerCipher()]; + case 23: + _x.sent(); + return [4 /*yield*/, Test_SetServerCipher()]; + case 24: + _x.sent(); + return [4 /*yield*/, Test_EnumConnection()]; + case 25: + enum_connection = _x.sent(); + _b = 0, _c = enum_connection.ConnectionList; + _x.label = 26; + case 26: + if (!(_b < _c.length)) return [3 /*break*/, 29]; + connecton = _c[_b]; + return [4 /*yield*/, Test_GetConnectionInfo(connecton.Name_str)]; + case 27: + _x.sent(); + _x.label = 28; + case 28: + _b++; + return [3 /*break*/, 26]; + case 29: return [4 /*yield*/, Test_CreateHub()]; + case 30: + hub_name = _x.sent(); + return [4 /*yield*/, Test_SetHub()]; + case 31: + _x.sent(); + return [4 /*yield*/, Test_GetHub()]; + case 32: + _x.sent(); + return [4 /*yield*/, Test_EnumHub()]; + case 33: + _x.sent(); + return [4 /*yield*/, Test_SetHubRadius()]; + case 34: + _x.sent(); + return [4 /*yield*/, Test_GetHubRadius()]; + case 35: + _x.sent(); + return [4 /*yield*/, Test_SetHubOnline()]; + case 36: + _x.sent(); + return [4 /*yield*/, Test_GetHubStatus()]; + case 37: + _x.sent(); + return [4 /*yield*/, Test_GetHubLog()]; + case 38: + hub_log_settings = _x.sent(); + return [4 /*yield*/, Test_SetHubLog(hub_log_settings)]; + case 39: + _x.sent(); + return [4 /*yield*/, Test_AddCa()]; + case 40: + _x.sent(); + return [4 /*yield*/, Test_EnumCa()]; + case 41: + enum_ca = _x.sent(); + _d = 0, _e = enum_ca.CAList; + _x.label = 42; + case 42: + if (!(_d < _e.length)) return [3 /*break*/, 46]; + ca = _e[_d]; + return [4 /*yield*/, Test_GetCa(ca.Key_u32)]; + case 43: + _x.sent(); + return [4 /*yield*/, Test_DeleteCa(ca.Key_u32)]; + case 44: + _x.sent(); + _x.label = 45; + case 45: + _d++; + return [3 /*break*/, 42]; + case 46: return [4 /*yield*/, Test_CreateLink()]; + case 47: + _x.sent(); + return [4 /*yield*/, Test_GetLink()]; + case 48: + _x.sent(); + return [4 /*yield*/, Test_SetLink()]; + case 49: + _x.sent(); + return [4 /*yield*/, Test_SetLinkOffline()]; + case 50: + _x.sent(); + return [4 /*yield*/, Test_SetLinkOnline()]; + case 51: + _x.sent(); + return [4 /*yield*/, Test_EnumLink()]; + case 52: + enum_link = _x.sent(); + _f = 0, _g = enum_link.LinkList; + _x.label = 53; + case 53: + if (!(_f < _g.length)) return [3 /*break*/, 56]; + link = _g[_f]; + return [4 /*yield*/, Test_GetLinkStatus(link.AccountName_utf)]; + case 54: + _x.sent(); + _x.label = 55; + case 55: + _f++; + return [3 /*break*/, 53]; + case 56: return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 3000); })]; + case 57: + _x.sent(); + return [4 /*yield*/, Test_RenameLink()]; + case 58: + _x.sent(); + return [4 /*yield*/, Test_DeleteLink()]; + case 59: + _x.sent(); + return [4 /*yield*/, Test_AddAccess()]; + case 60: + _x.sent(); + return [4 /*yield*/, Test_EnumAccess()]; + case 61: + _x.sent(); + return [4 /*yield*/, Test_DeleteAccess()]; + case 62: + _x.sent(); + return [4 /*yield*/, Test_SetAccessList()]; + case 63: + _x.sent(); + return [4 /*yield*/, Test_CreateGroup()]; + case 64: + _x.sent(); + return [4 /*yield*/, Test_SetGroup()]; + case 65: + _x.sent(); + return [4 /*yield*/, Test_GetGroup()]; + case 66: + _x.sent(); + return [4 /*yield*/, Test_CreateUser()]; + case 67: + _x.sent(); + return [4 /*yield*/, Test_SetUser()]; + case 68: + _x.sent(); + return [4 /*yield*/, Test_GetUser()]; + case 69: + _x.sent(); + return [4 /*yield*/, Test_EnumUser()]; + case 70: + _x.sent(); + return [4 /*yield*/, Test_EnumGroup()]; + case 71: + _x.sent(); + return [4 /*yield*/, Test_DeleteUser()]; + case 72: + _x.sent(); + return [4 /*yield*/, Test_DeleteGroup()]; + case 73: + _x.sent(); + return [4 /*yield*/, Test_EnumSession()]; + case 74: + enum_session = _x.sent(); + _h = 0, _j = enum_session.SessionList; + _x.label = 75; + case 75: + if (!(_h < _j.length)) return [3 /*break*/, 79]; + session = _j[_h]; + return [4 /*yield*/, Test_GetSessionStatus(session.Name_str)]; + case 76: + _x.sent(); + return [4 /*yield*/, Test_DeleteSession(session.Name_str)]; + case 77: + _x.sent(); + _x.label = 78; + case 78: + _h++; + return [3 /*break*/, 75]; + case 79: return [4 /*yield*/, Test_EnumMacTable()]; + case 80: + enum_mac = _x.sent(); + _k = 0, _l = enum_mac.MacTable; + _x.label = 81; + case 81: + if (!(_k < _l.length)) return [3 /*break*/, 84]; + mac = _l[_k]; + return [4 /*yield*/, Test_DeleteMacTable(mac.Key_u32)]; + case 82: + _x.sent(); + _x.label = 83; + case 83: + _k++; + return [3 /*break*/, 81]; + case 84: return [4 /*yield*/, Test_EnumIpTable()]; + case 85: + enum_ip = _x.sent(); + _m = 0, _o = enum_ip.IpTable; + _x.label = 86; + case 86: + if (!(_m < _o.length)) return [3 /*break*/, 89]; + ip = _o[_m]; + return [4 /*yield*/, Test_DeleteIpTable(ip.Key_u32)]; + case 87: + _x.sent(); + _x.label = 88; + case 88: + _m++; + return [3 /*break*/, 86]; + case 89: return [4 /*yield*/, Test_SetKeep()]; + case 90: + _x.sent(); + return [4 /*yield*/, Test_GetKeep()]; + case 91: + _x.sent(); + return [4 /*yield*/, Test_EnableSecureNAT()]; + case 92: + _x.sent(); + return [4 /*yield*/, Test_GetSecureNATOption()]; + case 93: + _x.sent(); + return [4 /*yield*/, Test_SetSecureNATOption()]; + case 94: + _x.sent(); + return [4 /*yield*/, Test_EnumNAT()]; + case 95: + _x.sent(); + return [4 /*yield*/, Test_EnumDHCP()]; + case 96: + _x.sent(); + return [4 /*yield*/, Test_GetSecureNATStatus()]; + case 97: + _x.sent(); + return [4 /*yield*/, Test_DisableSecureNAT()]; + case 98: + _x.sent(); + return [4 /*yield*/, Test_EnumEthernet()]; + case 99: + _x.sent(); + return [4 /*yield*/, Test_EnumLocalBridge()]; + case 100: + _x.sent(); + return [4 /*yield*/, Test_GetBridgeSupport()]; + case 101: + _x.sent(); + return [4 /*yield*/, Test_GetCaps()]; + case 102: + _x.sent(); + return [4 /*yield*/, Test_GetConfig()]; + case 103: + _x.sent(); + return [4 /*yield*/, Test_GetDefaultHubAdminOptions()]; + case 104: + _x.sent(); + return [4 /*yield*/, Test_GetHubAdminOptions()]; + case 105: + _x.sent(); + return [4 /*yield*/, Test_SetHubAdminOptions()]; + case 106: + _x.sent(); + return [4 /*yield*/, Test_GetHubExtOptions()]; + case 107: + _x.sent(); + return [4 /*yield*/, Test_SetHubExtOptions()]; + case 108: + _x.sent(); + return [4 /*yield*/, Test_AddL3Switch()]; + case 109: + _x.sent(); + return [4 /*yield*/, Test_AddL3If()]; + case 110: + _x.sent(); + return [4 /*yield*/, Test_EnumL3Switch()]; + case 111: + _x.sent(); + return [4 /*yield*/, Test_EnumL3If()]; + case 112: + _x.sent(); + return [4 /*yield*/, Test_AddL3Table()]; + case 113: + _x.sent(); + return [4 /*yield*/, Test_EnumL3Table()]; + case 114: + _x.sent(); + return [4 /*yield*/, Test_DelL3Table()]; + case 115: + _x.sent(); + return [4 /*yield*/, Test_StartL3Switch()]; + case 116: + _x.sent(); + return [4 /*yield*/, Test_StopL3Switch()]; + case 117: + _x.sent(); + return [4 /*yield*/, Test_DelL3If()]; + case 118: + _x.sent(); + return [4 /*yield*/, Test_DelL3Switch()]; + case 119: + _x.sent(); + return [4 /*yield*/, Test_AddCrl()]; + case 120: + _x.sent(); + return [4 /*yield*/, Test_EnumCrl()]; + case 121: + enum_crl = _x.sent(); + _p = 0, _q = enum_crl.CRLList; + _x.label = 122; + case 122: + if (!(_p < _q.length)) return [3 /*break*/, 126]; + crl = _q[_p]; + return [4 /*yield*/, Test_GetCrl(crl.Key_u32)]; + case 123: + got_crl = _x.sent(); + got_crl.CommonName_utf = got_crl.CommonName_utf + "_a"; + return [4 /*yield*/, Test_SetCrl(got_crl)]; + case 124: + _x.sent(); + _x.label = 125; + case 125: + _p++; + return [3 /*break*/, 122]; + case 126: return [4 /*yield*/, Test_EnumCrl()]; + case 127: + enum_crl = _x.sent(); + _r = 0, _s = enum_crl.CRLList; + _x.label = 128; + case 128: + if (!(_r < _s.length)) return [3 /*break*/, 131]; + crl = _s[_r]; + return [4 /*yield*/, Test_DelCrl(crl.Key_u32)]; + case 129: + _x.sent(); + _x.label = 130; + case 130: + _r++; + return [3 /*break*/, 128]; + case 131: return [4 /*yield*/, Test_SetAcList()]; + case 132: + _x.sent(); + return [4 /*yield*/, Test_GetAcList()]; + case 133: + _x.sent(); + return [4 /*yield*/, Test_EnumLogFile()]; + case 134: + enum_log_file = _x.sent(); + _t = 0, _u = enum_log_file.LogFiles; + _x.label = 135; + case 135: + if (!(_t < _u.length)) return [3 /*break*/, 138]; + log = _u[_t]; + return [4 /*yield*/, Test_ReadLogFile(log.FilePath_str)]; + case 136: + _x.sent(); + return [3 /*break*/, 138]; + case 137: + _t++; + return [3 /*break*/, 135]; + case 138: return [4 /*yield*/, Test_SetSysLog(true)]; + case 139: + _x.sent(); + return [4 /*yield*/, Test_GetSysLog()]; + case 140: + _x.sent(); + return [4 /*yield*/, Test_SetSysLog(false)]; + case 141: + _x.sent(); + return [4 /*yield*/, Test_SetHubMsg()]; + case 142: + _x.sent(); + return [4 /*yield*/, Test_GetHubMsg()]; + case 143: + _x.sent(); + return [4 /*yield*/, Test_GetAdminMsg()]; + case 144: + _x.sent(); + return [4 /*yield*/, Test_Flush()]; + case 145: + _x.sent(); + return [4 /*yield*/, Test_SetIPsecServices()]; + case 146: + _x.sent(); + return [4 /*yield*/, Test_GetIPsecServices()]; + case 147: + _x.sent(); + return [4 /*yield*/, Test_AddEtherIpId()]; + case 148: + _x.sent(); + return [4 /*yield*/, Test_EnumEtherIpId()]; + case 149: + enum_etherip_id = _x.sent(); + _v = 0, _w = enum_etherip_id.Settings; + _x.label = 150; + case 150: + if (!(_v < _w.length)) return [3 /*break*/, 154]; + etherip_id = _w[_v]; + return [4 /*yield*/, Test_GetEtherIpId(etherip_id.Id_str)]; + case 151: + _x.sent(); + return [4 /*yield*/, Test_DeleteEtherIpId(etherip_id.Id_str)]; + case 152: + _x.sent(); + _x.label = 153; + case 153: + _v++; + return [3 /*break*/, 150]; + case 154: return [4 /*yield*/, Test_SetOpenVpnSstpConfig()]; + case 155: + _x.sent(); + return [4 /*yield*/, Test_GetOpenVpnSstpConfig()]; + case 156: + _x.sent(); + return [4 /*yield*/, Test_GetDDnsClientStatus()]; + case 157: + _x.sent(); + return [4 /*yield*/, Test_SetDDnsInternetSettng()]; + case 158: + _x.sent(); + return [4 /*yield*/, Test_GetDDnsInternetSettng()]; + case 159: + _x.sent(); + return [4 /*yield*/, Test_ChangeDDnsClientHostname()]; + case 160: + _x.sent(); + return [4 /*yield*/, Test_RegenerateServerCert()]; + case 161: + _x.sent(); + return [4 /*yield*/, Test_MakeOpenVpnConfigFile()]; + case 162: + _x.sent(); + return [4 /*yield*/, Test_SetSpecialListener()]; + case 163: + _x.sent(); + return [4 /*yield*/, Test_GetSpecialListener()]; + case 164: + _x.sent(); + return [4 /*yield*/, Test_GetAzureStatus()]; + case 165: + _x.sent(); + return [4 /*yield*/, Test_SetAzureStatus()]; + case 166: + _x.sent(); + return [4 /*yield*/, Test_SetVgsConfig()]; + case 167: + _x.sent(); + return [4 /*yield*/, Test_GetVgsConfig()]; + case 168: + _x.sent(); + return [4 /*yield*/, Test_DeleteHub()]; + case 169: + _x.sent(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'Test', test RPC function */ +function Test_Test() { + return __awaiter(this, void 0, void 0, function () { + var a, b; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_Test"); + a = new VPN.VpnRpcTest({ + IntValue_u32: 12345 + }); + return [4 /*yield*/, api.Test(a)]; + case 1: + b = _a.sent(); + console.log(b); + console.log("End: Test_Test"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetServerInfo', Get server information */ +function Test_GetServerInfo() { + return __awaiter(this, void 0, void 0, function () { + var info; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetServerInfo"); + return [4 /*yield*/, api.GetServerInfo()]; + case 1: + info = _a.sent(); + console.log(info); + console.log("End: Test_GetServerInfo"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetServerStatus', Get server status */ +function Test_GetServerStatus() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_server_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetServerStatus"); + return [4 /*yield*/, api.GetServerStatus()]; + case 1: + out_rpc_server_status = _a.sent(); + console.log(out_rpc_server_status); + console.log("End: Test_GetServerStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'CreateListener', Create a listener */ +function Test_CreateListener() { + return __awaiter(this, void 0, void 0, function () { + var port, in_rpc_listener, out_rpc_listener; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_CreateListener"); + port = Math.floor((Math.random() * (65534 - 1025)) + 1025); + console.log("Creating a new listener port: Port " + port); + in_rpc_listener = new VPN.VpnRpcListener({ + Enable_bool: true, + Port_u32: port + }); + return [4 /*yield*/, api.CreateListener(in_rpc_listener)]; + case 1: + out_rpc_listener = _a.sent(); + console.log("Done."); + console.log("End: Test_CreateListener"); + console.log("-----"); + console.log(); + return [2 /*return*/, port]; + } + }); + }); +} +/** API test for 'EnumListener', Enumerating listeners */ +function Test_EnumListener() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_listener_list; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumListener"); + return [4 /*yield*/, api.EnumListener()]; + case 1: + out_rpc_listener_list = _a.sent(); + console.log(out_rpc_listener_list); + console.log("End: Test_EnumListener"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteListener', Delete a listener */ +function Test_DeleteListener(port) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_listener, out_rpc_listener; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteListener"); + console.log("Deleting a new listener port: Port" + port); + in_rpc_listener = new VPN.VpnRpcListener({ + Port_u32: port + }); + return [4 /*yield*/, api.DeleteListener(in_rpc_listener)]; + case 1: + out_rpc_listener = _a.sent(); + console.log("Done."); + console.log("End: Test_DeleteListener"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnableListener', Enable / Disable listener */ +function Test_EnableListener(port, enabled) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_listener, out_rpc_listener; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnableListener"); + if (enabled) { + console.log("Enabling listener port = " + port); + } + else { + console.log("Disabling listener port = " + port); + } + in_rpc_listener = new VPN.VpnRpcListener({ + Port_u32: port, + Enable_bool: enabled + }); + return [4 /*yield*/, api.EnableListener(in_rpc_listener)]; + case 1: + out_rpc_listener = _a.sent(); + console.log("Done."); + console.log("End: Test_EnableListener"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetServerPassword', Set server password */ +function Test_SetServerPassword() { + return __awaiter(this, void 0, void 0, function () { + var password, in_rpc_set_password, out_rpc_set_password; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + password = "microsoft"; + console.log("Begin: Test_SetServerPassword"); + console.log("Set the server administrator password to '" + password + "'."); + in_rpc_set_password = new VPN.VpnRpcSetPassword({ + PlainTextPassword_str: password + }); + return [4 /*yield*/, api.SetServerPassword(in_rpc_set_password)]; + case 1: + out_rpc_set_password = _a.sent(); + console.log("Done."); + console.log("End: Test_SetServerPassword"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetFarmSetting', Set clustering configuration */ +function Test_SetFarmSetting() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_farm, out_rpc_farm; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetFarmSetting"); + in_rpc_farm = new VPN.VpnRpcFarm({ + ServerType_u32: VPN.VpnRpcServerType.FarmController, + NumPort_u32: 2, + Ports_u32: [443, 444, 445,], + PublicIp_ip: "1.2.3.4", + ControllerName_str: "controller", + MemberPasswordPlaintext_str: "microsoft", + ControllerPort_u32: 443, + Weight_u32: 100, + ControllerOnly_bool: false + }); + return [4 /*yield*/, api.SetFarmSetting(in_rpc_farm)]; + case 1: + out_rpc_farm = _a.sent(); + console.log("End: Test_SetFarmSetting"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetFarmSetting', Get clustering configuration */ +function Test_GetFarmSetting() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_farm; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetFarmSetting"); + return [4 /*yield*/, api.GetFarmSetting()]; + case 1: + out_rpc_farm = _a.sent(); + console.log(out_rpc_farm); + console.log("End: Test_GetFarmSetting"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetFarmInfo', Get cluster member information */ +function Test_GetFarmInfo(id) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_farm_info, out_rpc_farm_info; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetFarmInfo"); + in_rpc_farm_info = new VPN.VpnRpcFarmInfo({ + Id_u32: id + }); + return [4 /*yield*/, api.GetFarmInfo(in_rpc_farm_info)]; + case 1: + out_rpc_farm_info = _a.sent(); + console.log(out_rpc_farm_info); + console.log("End: Test_GetFarmInfo"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumFarmMember', Enumerate cluster members */ +function Test_EnumFarmMember() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_enum_farm; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumFarmMember"); + return [4 /*yield*/, api.EnumFarmMember()]; + case 1: + out_rpc_enum_farm = _a.sent(); + console.log(out_rpc_enum_farm); + console.log("End: Test_EnumFarmMember"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_farm]; + } + }); + }); +} +/** API test for 'GetFarmConnectionStatus', Get status of connection to cluster controller */ +function Test_GetFarmConnectionStatus() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_farm_connection_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetFarmConnectionStatus"); + return [4 /*yield*/, api.GetFarmConnectionStatus()]; + case 1: + out_rpc_farm_connection_status = _a.sent(); + console.log(out_rpc_farm_connection_status); + console.log("End: Test_GetFarmConnectionStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetServerCert', Set the server certification */ +function Test_SetServerCert() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_key_pair, out_rpc_key_pair; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetServerCert"); + in_rpc_key_pair = new VPN.VpnRpcKeyPair({ + Cert_bin: new Uint8Array([0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x72, 0x6a, 0x43, 0x43, 0x41, 0x70, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x0a, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x0a, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4e, 0x4d, 0x54, 0x67, 0x78, 0x4d, 0x44, 0x45, 0x78, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x68, 0x63, 0x4e, 0x4e, 0x44, 0x49, 0x78, 0x4d, 0x44, 0x41, 0x31, 0x0a, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x6a, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x0a, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x0a, 0x67, 0x67, 0x45, 0x69, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4b, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x0a, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x0a, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x0a, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x0a, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x0a, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x0a, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, 0x67, 0x59, 0x59, 0x77, 0x67, 0x59, 0x4d, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2f, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2f, 0x7a, 0x41, 0x4c, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4d, 0x43, 0x41, 0x66, 0x59, 0x77, 0x59, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6c, 0x0a, 0x42, 0x46, 0x77, 0x77, 0x57, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x45, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x43, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x41, 0x77, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x51, 0x47, 0x43, 0x43, 0x73, 0x47, 0x0a, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x46, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x42, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x63, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x49, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x43, 0x54, 0x41, 0x4e, 0x0a, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x45, 0x41, 0x46, 0x6d, 0x34, 0x37, 0x47, 0x55, 0x70, 0x50, 0x57, 0x35, 0x2b, 0x37, 0x69, 0x46, 0x74, 0x69, 0x6c, 0x6f, 0x6b, 0x35, 0x32, 0x49, 0x6f, 0x54, 0x57, 0x72, 0x74, 0x46, 0x67, 0x32, 0x79, 0x69, 0x36, 0x6b, 0x49, 0x32, 0x69, 0x52, 0x4e, 0x51, 0x0a, 0x4b, 0x75, 0x67, 0x48, 0x55, 0x49, 0x4f, 0x34, 0x4b, 0x53, 0x71, 0x4a, 0x56, 0x42, 0x50, 0x38, 0x61, 0x4b, 0x4f, 0x61, 0x54, 0x5a, 0x47, 0x45, 0x31, 0x4b, 0x4d, 0x68, 0x2f, 0x59, 0x6a, 0x68, 0x36, 0x71, 0x2f, 0x67, 0x50, 0x61, 0x6c, 0x67, 0x64, 0x2f, 0x38, 0x44, 0x6d, 0x72, 0x78, 0x53, 0x4a, 0x6d, 0x55, 0x78, 0x33, 0x62, 0x4e, 0x62, 0x38, 0x52, 0x59, 0x36, 0x70, 0x4b, 0x7a, 0x74, 0x0a, 0x5a, 0x64, 0x75, 0x53, 0x61, 0x53, 0x2b, 0x57, 0x55, 0x30, 0x59, 0x74, 0x2b, 0x6c, 0x47, 0x35, 0x76, 0x56, 0x67, 0x61, 0x70, 0x48, 0x45, 0x71, 0x36, 0x79, 0x71, 0x4c, 0x62, 0x65, 0x56, 0x78, 0x51, 0x4c, 0x75, 0x62, 0x54, 0x69, 0x6e, 0x4f, 0x66, 0x56, 0x56, 0x5a, 0x58, 0x79, 0x45, 0x43, 0x59, 0x47, 0x4d, 0x73, 0x59, 0x71, 0x65, 0x6e, 0x4a, 0x6a, 0x4e, 0x63, 0x62, 0x49, 0x5a, 0x4e, 0x0a, 0x79, 0x4d, 0x75, 0x72, 0x46, 0x63, 0x67, 0x30, 0x34, 0x36, 0x4f, 0x34, 0x59, 0x79, 0x68, 0x56, 0x79, 0x71, 0x53, 0x69, 0x74, 0x43, 0x59, 0x37, 0x68, 0x2f, 0x65, 0x71, 0x67, 0x6b, 0x50, 0x4a, 0x51, 0x30, 0x68, 0x6b, 0x70, 0x39, 0x45, 0x64, 0x51, 0x77, 0x62, 0x6e, 0x38, 0x56, 0x6c, 0x66, 0x78, 0x64, 0x42, 0x58, 0x77, 0x51, 0x34, 0x4e, 0x48, 0x4b, 0x30, 0x4a, 0x56, 0x46, 0x2f, 0x33, 0x0a, 0x71, 0x48, 0x61, 0x68, 0x4e, 0x48, 0x4f, 0x35, 0x64, 0x62, 0x4a, 0x5a, 0x57, 0x59, 0x41, 0x62, 0x42, 0x44, 0x70, 0x32, 0x51, 0x45, 0x53, 0x70, 0x76, 0x6f, 0x2b, 0x38, 0x33, 0x6c, 0x68, 0x34, 0x64, 0x6e, 0x58, 0x6a, 0x46, 0x58, 0x4d, 0x43, 0x48, 0x76, 0x52, 0x68, 0x35, 0x31, 0x79, 0x2f, 0x54, 0x71, 0x79, 0x42, 0x34, 0x56, 0x76, 0x72, 0x52, 0x4b, 0x49, 0x4b, 0x74, 0x54, 0x6f, 0x7a, 0x0a, 0x5a, 0x6a, 0x48, 0x59, 0x49, 0x63, 0x62, 0x6a, 0x76, 0x53, 0x58, 0x4d, 0x7a, 0x61, 0x44, 0x50, 0x6a, 0x50, 0x63, 0x5a, 0x47, 0x6a, 0x42, 0x4a, 0x6c, 0x47, 0x36, 0x43, 0x76, 0x44, 0x34, 0x4c, 0x6d, 0x59, 0x7a, 0x72, 0x6b, 0x48, 0x34, 0x31, 0x63, 0x7a, 0x72, 0x34, 0x57, 0x41, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,]), + Key_bin: new Uint8Array([0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x45, 0x76, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x53, 0x43, 0x42, 0x4b, 0x67, 0x77, 0x67, 0x67, 0x53, 0x6b, 0x41, 0x67, 0x45, 0x41, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x0a, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x0a, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x0a, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x0a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x0a, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x0a, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x45, 0x43, 0x67, 0x67, 0x45, 0x41, 0x54, 0x77, 0x34, 0x52, 0x6f, 0x52, 0x4c, 0x6a, 0x73, 0x68, 0x72, 0x42, 0x56, 0x6f, 0x59, 0x69, 0x78, 0x4f, 0x4a, 0x2b, 0x57, 0x4c, 0x6d, 0x2f, 0x45, 0x51, 0x57, 0x65, 0x37, 0x6f, 0x6a, 0x38, 0x31, 0x51, 0x50, 0x73, 0x39, 0x56, 0x45, 0x49, 0x32, 0x62, 0x53, 0x4f, 0x0a, 0x34, 0x4a, 0x51, 0x42, 0x55, 0x42, 0x53, 0x6b, 0x70, 0x64, 0x48, 0x34, 0x57, 0x32, 0x77, 0x51, 0x75, 0x2f, 0x61, 0x58, 0x57, 0x38, 0x75, 0x75, 0x53, 0x39, 0x45, 0x43, 0x6d, 0x6d, 0x41, 0x41, 0x75, 0x45, 0x79, 0x4a, 0x54, 0x56, 0x7a, 0x75, 0x31, 0x32, 0x35, 0x58, 0x73, 0x65, 0x63, 0x6c, 0x44, 0x41, 0x55, 0x38, 0x49, 0x55, 0x70, 0x54, 0x2b, 0x70, 0x4c, 0x35, 0x79, 0x70, 0x37, 0x34, 0x0a, 0x45, 0x62, 0x76, 0x4e, 0x48, 0x48, 0x33, 0x67, 0x65, 0x72, 0x4f, 0x67, 0x78, 0x76, 0x49, 0x6a, 0x50, 0x64, 0x67, 0x77, 0x62, 0x66, 0x6d, 0x4d, 0x49, 0x59, 0x48, 0x62, 0x56, 0x70, 0x6e, 0x49, 0x30, 0x77, 0x32, 0x42, 0x43, 0x44, 0x51, 0x76, 0x74, 0x64, 0x64, 0x57, 0x6f, 0x42, 0x74, 0x41, 0x33, 0x43, 0x54, 0x6a, 0x63, 0x2f, 0x43, 0x56, 0x67, 0x73, 0x47, 0x77, 0x33, 0x43, 0x4e, 0x72, 0x0a, 0x46, 0x78, 0x41, 0x46, 0x35, 0x73, 0x4a, 0x34, 0x63, 0x5a, 0x4c, 0x6e, 0x5a, 0x31, 0x45, 0x36, 0x69, 0x74, 0x4c, 0x54, 0x50, 0x69, 0x6f, 0x6a, 0x74, 0x76, 0x48, 0x48, 0x34, 0x61, 0x64, 0x6d, 0x68, 0x68, 0x43, 0x61, 0x42, 0x49, 0x78, 0x76, 0x47, 0x2f, 0x53, 0x6e, 0x59, 0x77, 0x4e, 0x35, 0x38, 0x37, 0x55, 0x5a, 0x6d, 0x37, 0x4c, 0x57, 0x50, 0x61, 0x67, 0x4c, 0x41, 0x33, 0x67, 0x69, 0x0a, 0x48, 0x4b, 0x4f, 0x2b, 0x4b, 0x79, 0x42, 0x51, 0x39, 0x33, 0x31, 0x4e, 0x4d, 0x61, 0x65, 0x6a, 0x36, 0x6d, 0x75, 0x75, 0x46, 0x32, 0x30, 0x32, 0x76, 0x34, 0x37, 0x6c, 0x57, 0x6b, 0x64, 0x50, 0x4f, 0x6e, 0x52, 0x43, 0x69, 0x6f, 0x4d, 0x58, 0x30, 0x63, 0x31, 0x6a, 0x36, 0x76, 0x32, 0x61, 0x59, 0x34, 0x34, 0x77, 0x55, 0x4b, 0x71, 0x39, 0x4d, 0x52, 0x67, 0x6f, 0x52, 0x76, 0x4a, 0x37, 0x0a, 0x41, 0x39, 0x77, 0x65, 0x72, 0x4c, 0x6b, 0x68, 0x35, 0x78, 0x78, 0x35, 0x35, 0x32, 0x4f, 0x74, 0x71, 0x50, 0x36, 0x73, 0x61, 0x6d, 0x75, 0x47, 0x44, 0x52, 0x78, 0x31, 0x42, 0x70, 0x36, 0x53, 0x4f, 0x70, 0x68, 0x43, 0x45, 0x50, 0x48, 0x59, 0x67, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x36, 0x33, 0x65, 0x2b, 0x52, 0x75, 0x6c, 0x36, 0x46, 0x78, 0x47, 0x43, 0x76, 0x67, 0x70, 0x6b, 0x33, 0x0a, 0x57, 0x67, 0x2f, 0x54, 0x31, 0x77, 0x2f, 0x59, 0x4b, 0x6b, 0x79, 0x4f, 0x49, 0x46, 0x4c, 0x63, 0x46, 0x4c, 0x57, 0x71, 0x42, 0x44, 0x71, 0x6c, 0x6e, 0x58, 0x65, 0x63, 0x6c, 0x6b, 0x50, 0x4b, 0x6a, 0x57, 0x4e, 0x2f, 0x32, 0x70, 0x4a, 0x6d, 0x4f, 0x31, 0x63, 0x46, 0x63, 0x44, 0x4a, 0x46, 0x59, 0x64, 0x32, 0x45, 0x49, 0x45, 0x72, 0x76, 0x42, 0x57, 0x54, 0x34, 0x51, 0x39, 0x4d, 0x42, 0x0a, 0x4e, 0x35, 0x6c, 0x44, 0x6b, 0x47, 0x75, 0x6a, 0x34, 0x2f, 0x6b, 0x68, 0x56, 0x6c, 0x79, 0x6e, 0x77, 0x62, 0x64, 0x42, 0x6e, 0x47, 0x43, 0x34, 0x61, 0x34, 0x48, 0x4a, 0x49, 0x4a, 0x76, 0x61, 0x35, 0x63, 0x70, 0x49, 0x63, 0x57, 0x65, 0x4a, 0x72, 0x35, 0x61, 0x57, 0x33, 0x69, 0x44, 0x36, 0x68, 0x53, 0x73, 0x61, 0x6c, 0x79, 0x55, 0x76, 0x4a, 0x4d, 0x6d, 0x64, 0x4d, 0x42, 0x6e, 0x47, 0x0a, 0x37, 0x2b, 0x50, 0x65, 0x53, 0x2b, 0x4e, 0x73, 0x4b, 0x30, 0x61, 0x63, 0x31, 0x67, 0x33, 0x4d, 0x6c, 0x56, 0x35, 0x42, 0x41, 0x32, 0x70, 0x55, 0x54, 0x77, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x62, 0x65, 0x46, 0x6d, 0x2b, 0x46, 0x46, 0x35, 0x62, 0x76, 0x6f, 0x4b, 0x7a, 0x49, 0x4c, 0x6c, 0x31, 0x62, 0x79, 0x6b, 0x6c, 0x52, 0x6b, 0x69, 0x76, 0x7a, 0x6b, 0x62, 0x7a, 0x49, 0x6b, 0x41, 0x78, 0x0a, 0x35, 0x56, 0x6b, 0x74, 0x67, 0x36, 0x4a, 0x35, 0x63, 0x76, 0x38, 0x44, 0x35, 0x2b, 0x72, 0x71, 0x50, 0x75, 0x6a, 0x4f, 0x66, 0x39, 0x67, 0x42, 0x6a, 0x4e, 0x37, 0x70, 0x64, 0x78, 0x39, 0x39, 0x35, 0x6b, 0x47, 0x49, 0x78, 0x5a, 0x39, 0x6d, 0x31, 0x68, 0x57, 0x69, 0x78, 0x55, 0x55, 0x31, 0x55, 0x6f, 0x38, 0x72, 0x70, 0x39, 0x4a, 0x69, 0x47, 0x4f, 0x36, 0x72, 0x65, 0x31, 0x77, 0x69, 0x0a, 0x6a, 0x56, 0x2f, 0x4c, 0x31, 0x64, 0x37, 0x55, 0x66, 0x39, 0x48, 0x6a, 0x65, 0x61, 0x70, 0x4f, 0x46, 0x62, 0x34, 0x6b, 0x72, 0x71, 0x52, 0x58, 0x54, 0x65, 0x75, 0x4d, 0x6e, 0x35, 0x35, 0x44, 0x33, 0x64, 0x70, 0x79, 0x6a, 0x51, 0x4e, 0x43, 0x30, 0x5a, 0x50, 0x72, 0x61, 0x6d, 0x58, 0x64, 0x38, 0x31, 0x57, 0x6f, 0x6f, 0x56, 0x77, 0x58, 0x59, 0x41, 0x66, 0x69, 0x46, 0x76, 0x4c, 0x49, 0x0a, 0x6f, 0x66, 0x31, 0x37, 0x51, 0x67, 0x67, 0x49, 0x59, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x59, 0x55, 0x67, 0x67, 0x43, 0x34, 0x58, 0x49, 0x67, 0x5a, 0x76, 0x58, 0x34, 0x59, 0x65, 0x55, 0x38, 0x6c, 0x61, 0x79, 0x51, 0x50, 0x79, 0x4b, 0x71, 0x67, 0x38, 0x37, 0x2f, 0x76, 0x31, 0x2b, 0x7a, 0x35, 0x79, 0x65, 0x2f, 0x4d, 0x32, 0x5a, 0x65, 0x36, 0x53, 0x6e, 0x37, 0x48, 0x4a, 0x66, 0x59, 0x0a, 0x55, 0x5a, 0x4d, 0x36, 0x37, 0x48, 0x37, 0x52, 0x4b, 0x4e, 0x6f, 0x68, 0x46, 0x6c, 0x35, 0x43, 0x39, 0x65, 0x44, 0x4e, 0x7a, 0x67, 0x72, 0x50, 0x6b, 0x52, 0x63, 0x2f, 0x2f, 0x54, 0x77, 0x32, 0x45, 0x48, 0x74, 0x59, 0x68, 0x33, 0x42, 0x4b, 0x49, 0x6f, 0x72, 0x77, 0x39, 0x45, 0x64, 0x78, 0x59, 0x4e, 0x6c, 0x6b, 0x2b, 0x6a, 0x4e, 0x73, 0x30, 0x30, 0x64, 0x57, 0x35, 0x34, 0x64, 0x39, 0x0a, 0x65, 0x69, 0x69, 0x7a, 0x7a, 0x78, 0x59, 0x34, 0x34, 0x2f, 0x41, 0x32, 0x70, 0x39, 0x52, 0x49, 0x4d, 0x67, 0x79, 0x35, 0x49, 0x52, 0x77, 0x76, 0x53, 0x73, 0x6d, 0x50, 0x67, 0x61, 0x71, 0x34, 0x6f, 0x4b, 0x4d, 0x64, 0x54, 0x4e, 0x4d, 0x4f, 0x73, 0x30, 0x4a, 0x77, 0x65, 0x79, 0x50, 0x72, 0x42, 0x65, 0x49, 0x41, 0x72, 0x62, 0x46, 0x43, 0x67, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x43, 0x71, 0x0a, 0x57, 0x30, 0x34, 0x56, 0x33, 0x49, 0x75, 0x74, 0x33, 0x55, 0x42, 0x6f, 0x75, 0x50, 0x4d, 0x63, 0x63, 0x38, 0x2f, 0x56, 0x62, 0x69, 0x77, 0x48, 0x77, 0x79, 0x2b, 0x52, 0x6c, 0x4c, 0x6d, 0x4e, 0x77, 0x59, 0x41, 0x71, 0x63, 0x79, 0x35, 0x50, 0x35, 0x58, 0x4b, 0x4c, 0x33, 0x70, 0x36, 0x62, 0x65, 0x33, 0x2b, 0x4d, 0x6f, 0x76, 0x48, 0x52, 0x71, 0x6a, 0x35, 0x78, 0x72, 0x4a, 0x54, 0x57, 0x0a, 0x54, 0x6a, 0x2f, 0x36, 0x59, 0x61, 0x51, 0x73, 0x31, 0x2b, 0x72, 0x74, 0x63, 0x51, 0x45, 0x61, 0x74, 0x64, 0x34, 0x4b, 0x50, 0x66, 0x64, 0x78, 0x53, 0x2f, 0x63, 0x66, 0x52, 0x74, 0x38, 0x71, 0x74, 0x75, 0x42, 0x77, 0x51, 0x61, 0x2f, 0x34, 0x39, 0x4d, 0x72, 0x41, 0x4c, 0x76, 0x57, 0x43, 0x4c, 0x53, 0x42, 0x75, 0x4b, 0x74, 0x33, 0x49, 0x49, 0x75, 0x53, 0x2f, 0x51, 0x44, 0x74, 0x43, 0x0a, 0x5a, 0x4e, 0x67, 0x6d, 0x36, 0x4d, 0x78, 0x71, 0x4e, 0x6e, 0x49, 0x43, 0x58, 0x35, 0x46, 0x34, 0x36, 0x6d, 0x52, 0x49, 0x52, 0x42, 0x42, 0x4f, 0x32, 0x4b, 0x7a, 0x6c, 0x30, 0x33, 0x68, 0x62, 0x51, 0x6c, 0x71, 0x58, 0x4c, 0x5a, 0x63, 0x38, 0x6f, 0x51, 0x4b, 0x42, 0x67, 0x43, 0x53, 0x77, 0x66, 0x46, 0x7a, 0x68, 0x48, 0x76, 0x78, 0x36, 0x68, 0x69, 0x64, 0x57, 0x67, 0x48, 0x4a, 0x63, 0x0a, 0x77, 0x79, 0x76, 0x64, 0x6e, 0x70, 0x58, 0x78, 0x36, 0x5a, 0x4c, 0x6e, 0x6f, 0x61, 0x7a, 0x61, 0x6f, 0x48, 0x47, 0x74, 0x4d, 0x47, 0x43, 0x45, 0x5a, 0x49, 0x50, 0x66, 0x6a, 0x4c, 0x42, 0x63, 0x30, 0x4d, 0x74, 0x79, 0x45, 0x64, 0x53, 0x4c, 0x78, 0x54, 0x6c, 0x35, 0x59, 0x70, 0x78, 0x6f, 0x6d, 0x43, 0x46, 0x55, 0x4d, 0x33, 0x55, 0x63, 0x59, 0x4e, 0x2f, 0x50, 0x5a, 0x66, 0x58, 0x41, 0x0a, 0x6d, 0x36, 0x31, 0x45, 0x6d, 0x71, 0x53, 0x53, 0x4d, 0x56, 0x63, 0x47, 0x50, 0x67, 0x65, 0x2f, 0x43, 0x34, 0x44, 0x42, 0x5a, 0x59, 0x6a, 0x53, 0x45, 0x71, 0x62, 0x67, 0x37, 0x6d, 0x73, 0x52, 0x30, 0x33, 0x37, 0x42, 0x58, 0x54, 0x48, 0x6b, 0x78, 0x44, 0x62, 0x33, 0x71, 0x48, 0x46, 0x54, 0x6f, 0x30, 0x6b, 0x48, 0x57, 0x4a, 0x66, 0x34, 0x39, 0x59, 0x77, 0x32, 0x73, 0x77, 0x6a, 0x54, 0x0a, 0x72, 0x4f, 0x38, 0x46, 0x46, 0x44, 0x52, 0x56, 0x50, 0x44, 0x4c, 0x5a, 0x61, 0x37, 0x36, 0x47, 0x67, 0x79, 0x41, 0x55, 0x4a, 0x38, 0x55, 0x63, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,]) + }); + return [4 /*yield*/, api.SetServerCert(in_rpc_key_pair)]; + case 1: + out_rpc_key_pair = _a.sent(); + console.log(out_rpc_key_pair); + console.log("End: Test_SetServerCert"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetServerCert', Get the server certification */ +function Test_GetServerCert() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_key_pair; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetServerCert"); + return [4 /*yield*/, api.GetServerCert()]; + case 1: + out_rpc_key_pair = _a.sent(); + console.log(out_rpc_key_pair); + console.log("End: Test_GetServerCert"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetServerCipher', Get cipher for SSL */ +function Test_GetServerCipher() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_str; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetServerCipher"); + return [4 /*yield*/, api.GetServerCipher()]; + case 1: + out_rpc_str = _a.sent(); + console.log(out_rpc_str); + console.log("End: Test_GetServerCipher"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetServerCipher', Set cipher for SSL to the server */ +function Test_SetServerCipher() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_str, out_rpc_str; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetServerCipher"); + in_rpc_str = new VPN.VpnRpcStr({ + String_str: "RC4-MD5" + }); + return [4 /*yield*/, api.SetServerCipher(in_rpc_str)]; + case 1: + out_rpc_str = _a.sent(); + console.log(out_rpc_str); + console.log("End: Test_SetServerCipher"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'CreateHub', Create a hub */ +function Test_CreateHub() { + return __awaiter(this, void 0, void 0, function () { + var hub_name, in_rpc_create_hub, out_rpc_create_hub; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + hub_name = "Test_" + Math.floor((Math.random() * (999999 - 100000)) + 100000); + console.log("Begin: Test_CreateHub"); + in_rpc_create_hub = new VPN.VpnRpcCreateHub({ + HubName_str: hub_name, + HubType_u32: VPN.VpnRpcHubType.Standalone, + Online_bool: true, + AdminPasswordPlainText_str: "microsoft", + MaxSession_u32: 123, + NoEnum_bool: false + }); + return [4 /*yield*/, api.CreateHub(in_rpc_create_hub)]; + case 1: + out_rpc_create_hub = _a.sent(); + console.log(out_rpc_create_hub); + console.log("End: Test_CreateHub"); + console.log("-----"); + console.log(); + return [2 /*return*/, hub_name]; + } + }); + }); +} +/** API test for 'SetHub', Set hub configuration */ +function Test_SetHub() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_create_hub, out_rpc_create_hub; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetHub"); + in_rpc_create_hub = new VPN.VpnRpcCreateHub({ + HubName_str: hub_name, + AdminPasswordPlainText_str: "aho", + HubType_u32: VPN.VpnRpcHubType.Standalone, + NoEnum_bool: false, + MaxSession_u32: 128, + Online_bool: true + }); + return [4 /*yield*/, api.SetHub(in_rpc_create_hub)]; + case 1: + out_rpc_create_hub = _a.sent(); + console.log(out_rpc_create_hub); + console.log("End: Test_SetHub"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetHub', Get hub configuration */ +function Test_GetHub() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_create_hub, out_rpc_create_hub; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetHub"); + in_rpc_create_hub = new VPN.VpnRpcCreateHub({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetHub(in_rpc_create_hub)]; + case 1: + out_rpc_create_hub = _a.sent(); + console.log(out_rpc_create_hub); + console.log("End: Test_GetHub"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumHub', Enumerate hubs */ +function Test_EnumHub() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_enum_hub; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumHub"); + return [4 /*yield*/, api.EnumHub()]; + case 1: + out_rpc_enum_hub = _a.sent(); + console.log(out_rpc_enum_hub); + console.log("End: Test_EnumHub"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteHub', Delete a hub */ +function Test_DeleteHub() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_delete_hub, out_rpc_delete_hub; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteHub"); + in_rpc_delete_hub = new VPN.VpnRpcDeleteHub({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.DeleteHub(in_rpc_delete_hub)]; + case 1: + out_rpc_delete_hub = _a.sent(); + console.log(out_rpc_delete_hub); + console.log("End: Test_DeleteHub"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetHubRadius', Get Radius options of the hub */ +function Test_GetHubRadius() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_radius, out_rpc_radius; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetHubRadius"); + in_rpc_radius = new VPN.VpnRpcRadius({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetHubRadius(in_rpc_radius)]; + case 1: + out_rpc_radius = _a.sent(); + console.log(out_rpc_radius); + console.log("End: Test_GetHubRadius"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetHubRadius', Set Radius options of the hub */ +function Test_SetHubRadius() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_radius, out_rpc_radius; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetHubRadius"); + in_rpc_radius = new VPN.VpnRpcRadius({ + HubName_str: hub_name, + RadiusServerName_str: "1.2.3.4", + RadiusPort_u32: 1234, + RadiusSecret_str: "microsoft", + RadiusRetryInterval_u32: 1000 + }); + return [4 /*yield*/, api.SetHubRadius(in_rpc_radius)]; + case 1: + out_rpc_radius = _a.sent(); + console.log(out_rpc_radius); + console.log("End: Test_SetHubRadius"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumConnection', Enumerate connections */ +function Test_EnumConnection() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_enum_connection; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumConnection"); + return [4 /*yield*/, api.EnumConnection()]; + case 1: + out_rpc_enum_connection = _a.sent(); + console.log(out_rpc_enum_connection); + console.log("End: Test_EnumConnection"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_connection]; + } + }); + }); +} +/** API test for 'DisconnectConnection', Disconnect a connection */ +function Test_DisconnectConnection(connection_id) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_disconnect_connection, out_rpc_disconnect_connection; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DisconnectConnection"); + in_rpc_disconnect_connection = new VPN.VpnRpcDisconnectConnection({ + Name_str: connection_id + }); + return [4 /*yield*/, api.DisconnectConnection(in_rpc_disconnect_connection)]; + case 1: + out_rpc_disconnect_connection = _a.sent(); + console.log(out_rpc_disconnect_connection); + console.log("End: Test_DisconnectConnection"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetConnectionInfo', Get connection information */ +function Test_GetConnectionInfo(name) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_connection_info, out_rpc_connection_info; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetConnectionInfo"); + in_rpc_connection_info = new VPN.VpnRpcConnectionInfo({ + Name_str: name + }); + return [4 /*yield*/, api.GetConnectionInfo(in_rpc_connection_info)]; + case 1: + out_rpc_connection_info = _a.sent(); + console.log(out_rpc_connection_info); + console.log("End: Test_GetConnectionInfo"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetHubOnline', Make a hub on-line or off-line */ +function Test_SetHubOnline() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_set_hub_online, out_rpc_set_hub_online; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetHubOnline"); + in_rpc_set_hub_online = new VPN.VpnRpcSetHubOnline({ + HubName_str: hub_name, + Online_bool: true + }); + return [4 /*yield*/, api.SetHubOnline(in_rpc_set_hub_online)]; + case 1: + out_rpc_set_hub_online = _a.sent(); + console.log(out_rpc_set_hub_online); + console.log("End: Test_SetHubOnline"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetHubStatus', Get hub status */ +function Test_GetHubStatus() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_hub_status, out_rpc_hub_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetHubStatus"); + in_rpc_hub_status = new VPN.VpnRpcHubStatus({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetHubStatus(in_rpc_hub_status)]; + case 1: + out_rpc_hub_status = _a.sent(); + console.log(out_rpc_hub_status); + console.log("End: Test_GetHubStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetHubLog', Set logging configuration into the hub */ +function Test_SetHubLog(in_rpc_hub_log) { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_hub_log; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetHubLog"); + return [4 /*yield*/, api.SetHubLog(in_rpc_hub_log)]; + case 1: + out_rpc_hub_log = _a.sent(); + console.log(out_rpc_hub_log); + console.log("End: Test_SetHubLog"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetHubLog', Get logging configuration of the hub */ +function Test_GetHubLog() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_hub_log, out_rpc_hub_log; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetHubLog"); + in_rpc_hub_log = new VPN.VpnRpcHubLog({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetHubLog(in_rpc_hub_log)]; + case 1: + out_rpc_hub_log = _a.sent(); + console.log(out_rpc_hub_log); + console.log("End: Test_GetHubLog"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_hub_log]; + } + }); + }); +} +/** API test for 'AddCa', Add CA(Certificate Authority) into the hub */ +function Test_AddCa() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_hub_add_ca, out_rpc_hub_add_ca; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_AddCa"); + in_rpc_hub_add_ca = new VPN.VpnRpcHubAddCA({ + HubName_str: hub_name, + Cert_bin: new Uint8Array([0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x72, 0x6a, 0x43, 0x43, 0x41, 0x70, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x0a, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x0a, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4e, 0x4d, 0x54, 0x67, 0x78, 0x4d, 0x44, 0x45, 0x78, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x68, 0x63, 0x4e, 0x4e, 0x44, 0x49, 0x78, 0x4d, 0x44, 0x41, 0x31, 0x0a, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x6a, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x0a, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x0a, 0x67, 0x67, 0x45, 0x69, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4b, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x0a, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x0a, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x0a, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x0a, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x0a, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x0a, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, 0x67, 0x59, 0x59, 0x77, 0x67, 0x59, 0x4d, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2f, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2f, 0x7a, 0x41, 0x4c, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4d, 0x43, 0x41, 0x66, 0x59, 0x77, 0x59, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6c, 0x0a, 0x42, 0x46, 0x77, 0x77, 0x57, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x45, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x43, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x41, 0x77, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x51, 0x47, 0x43, 0x43, 0x73, 0x47, 0x0a, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x46, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x42, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x63, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x49, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x43, 0x54, 0x41, 0x4e, 0x0a, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x45, 0x41, 0x46, 0x6d, 0x34, 0x37, 0x47, 0x55, 0x70, 0x50, 0x57, 0x35, 0x2b, 0x37, 0x69, 0x46, 0x74, 0x69, 0x6c, 0x6f, 0x6b, 0x35, 0x32, 0x49, 0x6f, 0x54, 0x57, 0x72, 0x74, 0x46, 0x67, 0x32, 0x79, 0x69, 0x36, 0x6b, 0x49, 0x32, 0x69, 0x52, 0x4e, 0x51, 0x0a, 0x4b, 0x75, 0x67, 0x48, 0x55, 0x49, 0x4f, 0x34, 0x4b, 0x53, 0x71, 0x4a, 0x56, 0x42, 0x50, 0x38, 0x61, 0x4b, 0x4f, 0x61, 0x54, 0x5a, 0x47, 0x45, 0x31, 0x4b, 0x4d, 0x68, 0x2f, 0x59, 0x6a, 0x68, 0x36, 0x71, 0x2f, 0x67, 0x50, 0x61, 0x6c, 0x67, 0x64, 0x2f, 0x38, 0x44, 0x6d, 0x72, 0x78, 0x53, 0x4a, 0x6d, 0x55, 0x78, 0x33, 0x62, 0x4e, 0x62, 0x38, 0x52, 0x59, 0x36, 0x70, 0x4b, 0x7a, 0x74, 0x0a, 0x5a, 0x64, 0x75, 0x53, 0x61, 0x53, 0x2b, 0x57, 0x55, 0x30, 0x59, 0x74, 0x2b, 0x6c, 0x47, 0x35, 0x76, 0x56, 0x67, 0x61, 0x70, 0x48, 0x45, 0x71, 0x36, 0x79, 0x71, 0x4c, 0x62, 0x65, 0x56, 0x78, 0x51, 0x4c, 0x75, 0x62, 0x54, 0x69, 0x6e, 0x4f, 0x66, 0x56, 0x56, 0x5a, 0x58, 0x79, 0x45, 0x43, 0x59, 0x47, 0x4d, 0x73, 0x59, 0x71, 0x65, 0x6e, 0x4a, 0x6a, 0x4e, 0x63, 0x62, 0x49, 0x5a, 0x4e, 0x0a, 0x79, 0x4d, 0x75, 0x72, 0x46, 0x63, 0x67, 0x30, 0x34, 0x36, 0x4f, 0x34, 0x59, 0x79, 0x68, 0x56, 0x79, 0x71, 0x53, 0x69, 0x74, 0x43, 0x59, 0x37, 0x68, 0x2f, 0x65, 0x71, 0x67, 0x6b, 0x50, 0x4a, 0x51, 0x30, 0x68, 0x6b, 0x70, 0x39, 0x45, 0x64, 0x51, 0x77, 0x62, 0x6e, 0x38, 0x56, 0x6c, 0x66, 0x78, 0x64, 0x42, 0x58, 0x77, 0x51, 0x34, 0x4e, 0x48, 0x4b, 0x30, 0x4a, 0x56, 0x46, 0x2f, 0x33, 0x0a, 0x71, 0x48, 0x61, 0x68, 0x4e, 0x48, 0x4f, 0x35, 0x64, 0x62, 0x4a, 0x5a, 0x57, 0x59, 0x41, 0x62, 0x42, 0x44, 0x70, 0x32, 0x51, 0x45, 0x53, 0x70, 0x76, 0x6f, 0x2b, 0x38, 0x33, 0x6c, 0x68, 0x34, 0x64, 0x6e, 0x58, 0x6a, 0x46, 0x58, 0x4d, 0x43, 0x48, 0x76, 0x52, 0x68, 0x35, 0x31, 0x79, 0x2f, 0x54, 0x71, 0x79, 0x42, 0x34, 0x56, 0x76, 0x72, 0x52, 0x4b, 0x49, 0x4b, 0x74, 0x54, 0x6f, 0x7a, 0x0a, 0x5a, 0x6a, 0x48, 0x59, 0x49, 0x63, 0x62, 0x6a, 0x76, 0x53, 0x58, 0x4d, 0x7a, 0x61, 0x44, 0x50, 0x6a, 0x50, 0x63, 0x5a, 0x47, 0x6a, 0x42, 0x4a, 0x6c, 0x47, 0x36, 0x43, 0x76, 0x44, 0x34, 0x4c, 0x6d, 0x59, 0x7a, 0x72, 0x6b, 0x48, 0x34, 0x31, 0x63, 0x7a, 0x72, 0x34, 0x57, 0x41, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a,]) + }); + return [4 /*yield*/, api.AddCa(in_rpc_hub_add_ca)]; + case 1: + out_rpc_hub_add_ca = _a.sent(); + console.log(out_rpc_hub_add_ca); + console.log("End: Test_AddCa"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumCa', Enumerate CA(Certificate Authority) in the hub */ +function Test_EnumCa() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_hub_enum_ca, out_rpc_hub_enum_ca; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumCa"); + in_rpc_hub_enum_ca = new VPN.VpnRpcHubEnumCA({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumCa(in_rpc_hub_enum_ca)]; + case 1: + out_rpc_hub_enum_ca = _a.sent(); + console.log(out_rpc_hub_enum_ca); + console.log("End: Test_EnumCa"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_hub_enum_ca]; + } + }); + }); +} +/** API test for 'GetCa', Get CA(Certificate Authority) setting from the hub */ +function Test_GetCa(key) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_hub_get_ca, out_rpc_hub_get_ca; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetCa"); + in_rpc_hub_get_ca = new VPN.VpnRpcHubGetCA({ + HubName_str: hub_name, + Key_u32: key + }); + return [4 /*yield*/, api.GetCa(in_rpc_hub_get_ca)]; + case 1: + out_rpc_hub_get_ca = _a.sent(); + console.log(out_rpc_hub_get_ca); + console.log("End: Test_GetCa"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteCa', Delete a CA(Certificate Authority) setting from the hub */ +function Test_DeleteCa(key) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_hub_delete_ca, out_rpc_hub_delete_ca; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteCa"); + in_rpc_hub_delete_ca = new VPN.VpnRpcHubDeleteCA({ + HubName_str: hub_name, + Key_u32: key + }); + return [4 /*yield*/, api.DeleteCa(in_rpc_hub_delete_ca)]; + case 1: + out_rpc_hub_delete_ca = _a.sent(); + console.log(out_rpc_hub_delete_ca); + console.log("End: Test_DeleteCa"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetLinkOnline', Make a link into on-line */ +function Test_SetLinkOnline() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_link, out_rpc_link; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetLinkOnline"); + in_rpc_link = new VPN.VpnRpcLink({ + HubName_str: hub_name, + AccountName_utf: "linktest" + }); + return [4 /*yield*/, api.SetLinkOnline(in_rpc_link)]; + case 1: + out_rpc_link = _a.sent(); + console.log(out_rpc_link); + console.log("End: Test_SetLinkOnline"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetLinkOffline', Make a link into off-line */ +function Test_SetLinkOffline() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_link, out_rpc_link; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetLinkOffline"); + in_rpc_link = new VPN.VpnRpcLink({ + HubName_str: hub_name, + AccountName_utf: "linktest" + }); + return [4 /*yield*/, api.SetLinkOffline(in_rpc_link)]; + case 1: + out_rpc_link = _a.sent(); + console.log(out_rpc_link); + console.log("End: Test_SetLinkOffline"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteLink', Delete a link */ +function Test_DeleteLink() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_link, out_rpc_link; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteLink"); + in_rpc_link = new VPN.VpnRpcLink({ + HubName_str: hub_name, + AccountName_utf: "linktest2" + }); + return [4 /*yield*/, api.DeleteLink(in_rpc_link)]; + case 1: + out_rpc_link = _a.sent(); + console.log(out_rpc_link); + console.log("End: Test_DeleteLink"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'RenameLink', Rename link (cascade connection) */ +function Test_RenameLink() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_rename_link, out_rpc_rename_link; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_RenameLink"); + in_rpc_rename_link = new VPN.VpnRpcRenameLink({ + HubName_str: hub_name, + OldAccountName_utf: "linktest", + NewAccountName_utf: "linktest2" + }); + return [4 /*yield*/, api.RenameLink(in_rpc_rename_link)]; + case 1: + out_rpc_rename_link = _a.sent(); + console.log(out_rpc_rename_link); + console.log("End: Test_RenameLink"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'CreateLink', Create a new link(cascade) */ +function Test_CreateLink() { + return __awaiter(this, void 0, void 0, function () { + var _a, in_rpc_create_link, out_rpc_create_link; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + console.log("Begin: Test_CreateLink"); + in_rpc_create_link = new VPN.VpnRpcCreateLink((_a = { + HubName_Ex_str: hub_name, + CheckServerCert_bool: false, + AccountName_utf: "linktest", + Hostname_str: "1.2.3.4", + Port_u32: 443, + ProxyType_u32: 0, + HubName_str: "ABC", + MaxConnection_u32: 16, + UseEncrypt_bool: true, + UseCompress_bool: false, + HalfConnection_bool: true, + AdditionalConnectionInterval_u32: 2, + ConnectionDisconnectSpan_u32: 24, + AuthType_u32: VPN.VpnRpcClientAuthType.PlainPassword, + Username_str: "181012", + PlainPassword_str: "microsoft", + HashedPassword_bin: new Uint8Array([]), + ClientX_bin: new Uint8Array([]), + ClientK_bin: new Uint8Array([]) + }, + _a["policy:DHCPFilter_bool"] = true, + _a["policy:DHCPNoServer_bool"] = true, + _a["policy:DHCPForce_bool"] = true, + _a.SecPol_CheckMac_bool = true, + _a.SecPol_CheckIP_bool = true, + _a["policy:ArpDhcpOnly_bool"] = true, + _a["policy:PrivacyFilter_bool"] = true, + _a["policy:NoServer_bool"] = true, + _a["policy:NoBroadcastLimiter_bool"] = true, + _a["policy:MaxMac_u32"] = 32, + _a["policy:MaxIP_u32"] = 64, + _a["policy:MaxUpload_u32"] = 960000, + _a["policy:MaxDownload_u32"] = 1280000, + _a["policy:RSandRAFilter_bool"] = true, + _a.SecPol_RAFilter_bool = true, + _a["policy:DHCPv6Filter_bool"] = true, + _a["policy:DHCPv6NoServer_bool"] = true, + _a.SecPol_CheckIPv6_bool = true, + _a["policy:NoServerV6_bool"] = true, + _a["policy:MaxIPv6_u32"] = 127, + _a["policy:FilterIPv4_bool"] = true, + _a["policy:FilterIPv6_bool"] = true, + _a["policy:FilterNonIP_bool"] = true, + _a["policy:NoIPv6DefaultRouterInRA_bool"] = true, + _a["policy:VLanId_u32"] = 123, + _a["policy:Ver3_bool"] = true, + _a)); + return [4 /*yield*/, api.CreateLink(in_rpc_create_link)]; + case 1: + out_rpc_create_link = _b.sent(); + console.log(out_rpc_create_link); + console.log("End: Test_CreateLink"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetLink', Get link configuration */ +function Test_GetLink() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_create_link, out_rpc_create_link; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetLink"); + in_rpc_create_link = new VPN.VpnRpcCreateLink({ + HubName_Ex_str: hub_name, + AccountName_utf: "linktest" + }); + return [4 /*yield*/, api.GetLink(in_rpc_create_link)]; + case 1: + out_rpc_create_link = _a.sent(); + console.log(out_rpc_create_link); + console.log("End: Test_GetLink"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetLink', Set link configuration */ +function Test_SetLink() { + return __awaiter(this, void 0, void 0, function () { + var _a, in_rpc_create_link, out_rpc_create_link; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + console.log("Begin: Test_SetLink"); + in_rpc_create_link = new VPN.VpnRpcCreateLink((_a = { + HubName_Ex_str: hub_name, + CheckServerCert_bool: false, + AccountName_utf: "linktest", + Hostname_str: "1.2.3.4", + Port_u32: 443, + ProxyType_u32: 0, + HubName_str: "ABC", + MaxConnection_u32: 16, + UseEncrypt_bool: true, + UseCompress_bool: false, + HalfConnection_bool: true, + AdditionalConnectionInterval_u32: 2, + ConnectionDisconnectSpan_u32: 24, + AuthType_u32: VPN.VpnRpcClientAuthType.PlainPassword, + Username_str: "181012", + PlainPassword_str: "microsoft", + HashedPassword_bin: new Uint8Array([]), + ClientX_bin: new Uint8Array([]), + ClientK_bin: new Uint8Array([]) + }, + _a["policy:DHCPFilter_bool"] = true, + _a["policy:DHCPNoServer_bool"] = true, + _a["policy:DHCPForce_bool"] = true, + _a.SecPol_CheckMac_bool = true, + _a.SecPol_CheckIP_bool = true, + _a["policy:ArpDhcpOnly_bool"] = true, + _a["policy:PrivacyFilter_bool"] = true, + _a["policy:NoServer_bool"] = true, + _a["policy:NoBroadcastLimiter_bool"] = true, + _a["policy:MaxMac_u32"] = 32, + _a["policy:MaxIP_u32"] = 64, + _a["policy:MaxUpload_u32"] = 960000, + _a["policy:MaxDownload_u32"] = 1280000, + _a["policy:RSandRAFilter_bool"] = true, + _a.SecPol_RAFilter_bool = true, + _a["policy:DHCPv6Filter_bool"] = true, + _a["policy:DHCPv6NoServer_bool"] = true, + _a.SecPol_CheckIPv6_bool = true, + _a["policy:NoServerV6_bool"] = true, + _a["policy:MaxIPv6_u32"] = 127, + _a["policy:FilterIPv4_bool"] = true, + _a["policy:FilterIPv6_bool"] = true, + _a["policy:FilterNonIP_bool"] = true, + _a["policy:NoIPv6DefaultRouterInRA_bool"] = true, + _a["policy:VLanId_u32"] = 123, + _a["policy:Ver3_bool"] = true, + _a)); + return [4 /*yield*/, api.SetLink(in_rpc_create_link)]; + case 1: + out_rpc_create_link = _b.sent(); + console.log(out_rpc_create_link); + console.log("End: Test_SetLink"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumLink', Enumerate links */ +function Test_EnumLink() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_link, out_rpc_enum_link; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumLink"); + in_rpc_enum_link = new VPN.VpnRpcEnumLink({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumLink(in_rpc_enum_link)]; + case 1: + out_rpc_enum_link = _a.sent(); + console.log(out_rpc_enum_link); + console.log("End: Test_EnumLink"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_link]; + } + }); + }); +} +/** API test for 'GetLinkStatus', Get link status */ +function Test_GetLinkStatus(name) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_link_status, out_rpc_link_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetLinkStatus"); + in_rpc_link_status = new VPN.VpnRpcLinkStatus({ + HubName_Ex_str: hub_name, + AccountName_utf: name + }); + return [4 /*yield*/, api.GetLinkStatus(in_rpc_link_status)]; + case 1: + out_rpc_link_status = _a.sent(); + console.log(out_rpc_link_status); + console.log("End: Test_GetLinkStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'AddAccess', Add access list entry */ +function Test_AddAccess() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_add_access_ipv4, out_rpc_add_access_ipv4, in_rpc_add_access_ipv6, out_rpc_add_access_ipv6; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_AddAccess"); + in_rpc_add_access_ipv4 = new VPN.VpnRpcAddAccess({ + HubName_str: hub_name, + AccessListSingle: [new VPN.VpnAccess({ + Note_utf: "IPv4 Test", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: false, + SrcIpAddress_ip: "192.168.0.0", + SrcSubnetMask_ip: "255.255.255.0", + DestIpAddress_ip: "10.0.0.0", + DestSubnetMask_ip: "255.255.0.0", + Protocol_u32: VPN.VpnIpProtocolNumber.TCP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([1, 2, 3, 0, 0, 0,]), + SrcMacMask_bin: new Uint8Array([255, 255, 255, 0, 0, 0,]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho" + }),] + }); + return [4 /*yield*/, api.AddAccess(in_rpc_add_access_ipv4)]; + case 1: + out_rpc_add_access_ipv4 = _a.sent(); + in_rpc_add_access_ipv6 = new VPN.VpnRpcAddAccess({ + HubName_str: hub_name, + AccessListSingle: [new VPN.VpnAccess({ + Note_utf: "IPv6 Test", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: true, + SrcIpAddress6_bin: new Uint8Array([0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,]), + SrcSubnetMask6_bin: new Uint8Array([0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,]), + Protocol_u32: VPN.VpnIpProtocolNumber.UDP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([1, 2, 3, 0, 0, 0,]), + SrcMacMask_bin: new Uint8Array([255, 255, 255, 0, 0, 0,]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho" + }),] + }); + return [4 /*yield*/, api.AddAccess(in_rpc_add_access_ipv6)]; + case 2: + out_rpc_add_access_ipv6 = _a.sent(); + console.log("End: Test_AddAccess"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteAccess', Delete access list entry */ +function Test_DeleteAccess() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_delete_access, out_rpc_delete_access; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteAccess"); + in_rpc_delete_access = new VPN.VpnRpcDeleteAccess({ + HubName_str: hub_name, + Id_u32: 1 + }); + return [4 /*yield*/, api.DeleteAccess(in_rpc_delete_access)]; + case 1: + out_rpc_delete_access = _a.sent(); + console.log(out_rpc_delete_access); + console.log("End: Test_DeleteAccess"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumAccess', Get access list */ +function Test_EnumAccess() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_access_list, out_rpc_enum_access_list; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumAccess"); + in_rpc_enum_access_list = new VPN.VpnRpcEnumAccessList({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumAccess(in_rpc_enum_access_list)]; + case 1: + out_rpc_enum_access_list = _a.sent(); + console.log(out_rpc_enum_access_list); + console.log("End: Test_EnumAccess"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetAccessList', Set access list */ +function Test_SetAccessList() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_access_list, out_rpc_enum_access_list; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetAccessList"); + in_rpc_enum_access_list = new VPN.VpnRpcEnumAccessList({ + HubName_str: hub_name, + AccessList: [new VPN.VpnAccess({ + Note_utf: "IPv4 Test 2", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: false, + SrcIpAddress_ip: "192.168.0.0", + SrcSubnetMask_ip: "255.255.255.0", + DestIpAddress_ip: "10.0.0.0", + DestSubnetMask_ip: "255.255.0.0", + Protocol_u32: VPN.VpnIpProtocolNumber.TCP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([1, 2, 3, 0, 0, 0,]), + SrcMacMask_bin: new Uint8Array([255, 255, 255, 0, 0, 0,]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho" + }), new VPN.VpnAccess({ + Note_utf: "IPv6 Test 2", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: true, + SrcIpAddress6_bin: new Uint8Array([0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,]), + SrcSubnetMask6_bin: new Uint8Array([0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,]), + Protocol_u32: VPN.VpnIpProtocolNumber.UDP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([1, 2, 3, 0, 0, 0,]), + SrcMacMask_bin: new Uint8Array([255, 255, 255, 0, 0, 0,]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho" + }),] + }); + return [4 /*yield*/, api.SetAccessList(in_rpc_enum_access_list)]; + case 1: + out_rpc_enum_access_list = _a.sent(); + console.log(out_rpc_enum_access_list); + console.log("End: Test_SetAccessList"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'CreateUser', Create a user */ +function Test_CreateUser() { + return __awaiter(this, void 0, void 0, function () { + var _a, in_rpc_set_user, out_rpc_set_user; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + console.log("Begin: Test_CreateUser"); + in_rpc_set_user = new VPN.VpnRpcSetUser((_a = { + HubName_str: hub_name, + Name_str: "test1", + Realname_utf: "Cat man", + Note_utf: "Hey!!!", + AuthType_u32: VPN.VpnRpcUserAuthType.Password, + Auth_Password_str: "microsoft", + UserX_bin: new Uint8Array([]), + Serial_bin: new Uint8Array([]), + CommonName_utf: "", + RadiusUsername_utf: "", + NtUsername_utf: "", + ExpireTime_dt: new Date(2019, 1, 1), + UsePolicy_bool: true + }, + _a["policy:Access_bool"] = true, + _a["policy:DHCPFilter_bool"] = false, + _a["policy:DHCPNoServer_bool"] = true, + _a["policy:DHCPForce_bool"] = false, + _a["policy:NoBridge_bool"] = false, + _a["policy:NoRouting_bool"] = false, + _a["policy:CheckMac_bool"] = false, + _a["policy:CheckIP_bool"] = false, + _a["policy:ArpDhcpOnly_bool"] = false, + _a["policy:PrivacyFilter_bool"] = false, + _a["policy:NoServer_bool"] = false, + _a["policy:NoBroadcastLimiter_bool"] = false, + _a["policy:MonitorPort_bool"] = false, + _a["policy:MaxConnection_u32"] = 32, + _a["policy:TimeOut_u32"] = 15, + _a["policy:MaxMac_u32"] = 1000, + _a["policy:MaxIP_u32"] = 1000, + _a["policy:MaxUpload_u32"] = 1000000000, + _a["policy:MaxDownload_u32"] = 1000000000, + _a["policy:FixPassword_bool"] = false, + _a["policy:MultiLogins_u32"] = 1000, + _a["policy:NoQoS_bool"] = false, + _a["policy:RSandRAFilter_bool"] = false, + _a["policy:RAFilter_bool"] = false, + _a["policy:DHCPv6Filter_bool"] = false, + _a["policy:DHCPv6NoServer_bool"] = false, + _a["policy:NoRoutingV6_bool"] = false, + _a["policy:CheckIPv6_bool"] = false, + _a["policy:NoServerV6_bool"] = false, + _a["policy:MaxIPv6_u32"] = 1234, + _a["policy:NoSavePassword_bool"] = false, + _a["policy:AutoDisconnect_u32"] = 0, + _a["policy:FilterIPv4_bool"] = false, + _a["policy:FilterIPv6_bool"] = false, + _a["policy:FilterNonIP_bool"] = false, + _a["policy:NoIPv6DefaultRouterInRA_bool"] = false, + _a["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"] = false, + _a["policy:VLanId_u32"] = 0, + _a["policy:Ver3_bool"] = true, + _a)); + return [4 /*yield*/, api.CreateUser(in_rpc_set_user)]; + case 1: + out_rpc_set_user = _b.sent(); + console.log("End: Test_CreateUser"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetUser', Set user setting */ +function Test_SetUser() { + return __awaiter(this, void 0, void 0, function () { + var _a, in_rpc_set_user, out_rpc_set_user; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + console.log("Begin: Test_SetUser"); + in_rpc_set_user = new VPN.VpnRpcSetUser((_a = { + HubName_str: hub_name, + Name_str: "test1", + Realname_utf: "Cat man", + Note_utf: "Hey!!!", + GroupName_str: "group1", + AuthType_u32: VPN.VpnRpcUserAuthType.Anonymous, + Auth_Password_str: "", + UserX_bin: new Uint8Array([]), + Serial_bin: new Uint8Array([]), + CommonName_utf: "", + RadiusUsername_utf: "", + NtUsername_utf: "", + ExpireTime_dt: new Date(2019, 1, 1), + UsePolicy_bool: true + }, + _a["policy:Access_bool"] = true, + _a["policy:DHCPFilter_bool"] = false, + _a["policy:DHCPNoServer_bool"] = true, + _a["policy:DHCPForce_bool"] = false, + _a["policy:NoBridge_bool"] = false, + _a["policy:NoRouting_bool"] = false, + _a["policy:CheckMac_bool"] = false, + _a["policy:CheckIP_bool"] = false, + _a["policy:ArpDhcpOnly_bool"] = false, + _a["policy:PrivacyFilter_bool"] = false, + _a["policy:NoServer_bool"] = false, + _a["policy:NoBroadcastLimiter_bool"] = false, + _a["policy:MonitorPort_bool"] = false, + _a["policy:MaxConnection_u32"] = 32, + _a["policy:TimeOut_u32"] = 15, + _a["policy:MaxMac_u32"] = 1000, + _a["policy:MaxIP_u32"] = 1000, + _a["policy:MaxUpload_u32"] = 1000000000, + _a["policy:MaxDownload_u32"] = 1000000000, + _a["policy:FixPassword_bool"] = false, + _a["policy:MultiLogins_u32"] = 1000, + _a["policy:NoQoS_bool"] = false, + _a["policy:RSandRAFilter_bool"] = false, + _a["policy:RAFilter_bool"] = false, + _a["policy:DHCPv6Filter_bool"] = false, + _a["policy:DHCPv6NoServer_bool"] = false, + _a["policy:NoRoutingV6_bool"] = false, + _a["policy:CheckIPv6_bool"] = false, + _a["policy:NoServerV6_bool"] = false, + _a["policy:MaxIPv6_u32"] = 1234, + _a["policy:NoSavePassword_bool"] = false, + _a["policy:AutoDisconnect_u32"] = 0, + _a["policy:FilterIPv4_bool"] = false, + _a["policy:FilterIPv6_bool"] = false, + _a["policy:FilterNonIP_bool"] = false, + _a["policy:NoIPv6DefaultRouterInRA_bool"] = false, + _a["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"] = false, + _a["policy:VLanId_u32"] = 0, + _a["policy:Ver3_bool"] = true, + _a)); + return [4 /*yield*/, api.SetUser(in_rpc_set_user)]; + case 1: + out_rpc_set_user = _b.sent(); + console.log("End: Test_SetUser"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetUser', Get user setting */ +function Test_GetUser() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_set_user, out_rpc_set_user; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetUser"); + in_rpc_set_user = new VPN.VpnRpcSetUser({ + HubName_str: hub_name, + Name_str: "test1" + }); + return [4 /*yield*/, api.GetUser(in_rpc_set_user)]; + case 1: + out_rpc_set_user = _a.sent(); + console.log(out_rpc_set_user); + console.log("End: Test_GetUser"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteUser', Delete a user */ +function Test_DeleteUser() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_delete_user, out_rpc_delete_user; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteUser"); + in_rpc_delete_user = new VPN.VpnRpcDeleteUser({ + HubName_str: hub_name, + Name_str: "test1" + }); + return [4 /*yield*/, api.DeleteUser(in_rpc_delete_user)]; + case 1: + out_rpc_delete_user = _a.sent(); + console.log("End: Test_DeleteUser"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumUser', Enumerate users */ +function Test_EnumUser() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_user, out_rpc_enum_user; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumUser"); + in_rpc_enum_user = new VPN.VpnRpcEnumUser({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumUser(in_rpc_enum_user)]; + case 1: + out_rpc_enum_user = _a.sent(); + console.log(out_rpc_enum_user); + console.log("End: Test_EnumUser"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'CreateGroup', Create a group */ +function Test_CreateGroup() { + return __awaiter(this, void 0, void 0, function () { + var _a, in_rpc_set_group, out_rpc_set_group; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + console.log("Begin: Test_CreateGroup"); + in_rpc_set_group = new VPN.VpnRpcSetGroup((_a = { + HubName_str: hub_name, + Name_str: "group1", + Realname_utf: "Cat group", + Note_utf: "This is it! This is it!!", + UsePolicy_bool: true + }, + _a["policy:Access_bool"] = true, + _a["policy:DHCPFilter_bool"] = false, + _a["policy:DHCPNoServer_bool"] = true, + _a["policy:DHCPForce_bool"] = false, + _a["policy:NoBridge_bool"] = false, + _a["policy:NoRouting_bool"] = false, + _a["policy:CheckMac_bool"] = false, + _a["policy:CheckIP_bool"] = false, + _a["policy:ArpDhcpOnly_bool"] = false, + _a["policy:PrivacyFilter_bool"] = false, + _a["policy:NoServer_bool"] = false, + _a["policy:NoBroadcastLimiter_bool"] = false, + _a["policy:MonitorPort_bool"] = false, + _a["policy:MaxConnection_u32"] = 32, + _a["policy:TimeOut_u32"] = 15, + _a["policy:MaxMac_u32"] = 1000, + _a["policy:MaxIP_u32"] = 1000, + _a["policy:MaxUpload_u32"] = 1000000000, + _a["policy:MaxDownload_u32"] = 1000000000, + _a["policy:FixPassword_bool"] = false, + _a["policy:MultiLogins_u32"] = 1000, + _a["policy:NoQoS_bool"] = false, + _a["policy:RSandRAFilter_bool"] = false, + _a["policy:RAFilter_bool"] = false, + _a["policy:DHCPv6Filter_bool"] = false, + _a["policy:DHCPv6NoServer_bool"] = false, + _a["policy:NoRoutingV6_bool"] = false, + _a["policy:CheckIPv6_bool"] = false, + _a["policy:NoServerV6_bool"] = false, + _a["policy:MaxIPv6_u32"] = 1234, + _a["policy:NoSavePassword_bool"] = false, + _a["policy:AutoDisconnect_u32"] = 0, + _a["policy:FilterIPv4_bool"] = false, + _a["policy:FilterIPv6_bool"] = false, + _a["policy:FilterNonIP_bool"] = false, + _a["policy:NoIPv6DefaultRouterInRA_bool"] = false, + _a["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"] = false, + _a["policy:VLanId_u32"] = 0, + _a["policy:Ver3_bool"] = true, + _a)); + return [4 /*yield*/, api.CreateGroup(in_rpc_set_group)]; + case 1: + out_rpc_set_group = _b.sent(); + console.log(out_rpc_set_group); + console.log("End: Test_CreateGroup"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetGroup', Set group setting */ +function Test_SetGroup() { + return __awaiter(this, void 0, void 0, function () { + var _a, in_rpc_set_group, out_rpc_set_group; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + console.log("Begin: Test_SetGroup"); + in_rpc_set_group = new VPN.VpnRpcSetGroup((_a = { + HubName_str: hub_name, + Name_str: "group1", + Realname_utf: "Cat group 2", + Note_utf: "This is it! This is it!! 2", + UsePolicy_bool: true + }, + _a["policy:Access_bool"] = true, + _a["policy:DHCPFilter_bool"] = false, + _a["policy:DHCPNoServer_bool"] = true, + _a["policy:DHCPForce_bool"] = false, + _a["policy:NoBridge_bool"] = false, + _a["policy:NoRouting_bool"] = false, + _a["policy:CheckMac_bool"] = false, + _a["policy:CheckIP_bool"] = false, + _a["policy:ArpDhcpOnly_bool"] = false, + _a["policy:PrivacyFilter_bool"] = false, + _a["policy:NoServer_bool"] = false, + _a["policy:NoBroadcastLimiter_bool"] = false, + _a["policy:MonitorPort_bool"] = false, + _a["policy:MaxConnection_u32"] = 32, + _a["policy:TimeOut_u32"] = 15, + _a["policy:MaxMac_u32"] = 1000, + _a["policy:MaxIP_u32"] = 1000, + _a["policy:MaxUpload_u32"] = 1000000000, + _a["policy:MaxDownload_u32"] = 1000000000, + _a["policy:FixPassword_bool"] = false, + _a["policy:MultiLogins_u32"] = 1000, + _a["policy:NoQoS_bool"] = false, + _a["policy:RSandRAFilter_bool"] = false, + _a["policy:RAFilter_bool"] = false, + _a["policy:DHCPv6Filter_bool"] = false, + _a["policy:DHCPv6NoServer_bool"] = false, + _a["policy:NoRoutingV6_bool"] = false, + _a["policy:CheckIPv6_bool"] = false, + _a["policy:NoServerV6_bool"] = false, + _a["policy:MaxIPv6_u32"] = 1234, + _a["policy:NoSavePassword_bool"] = false, + _a["policy:AutoDisconnect_u32"] = 0, + _a["policy:FilterIPv4_bool"] = false, + _a["policy:FilterIPv6_bool"] = false, + _a["policy:FilterNonIP_bool"] = false, + _a["policy:NoIPv6DefaultRouterInRA_bool"] = false, + _a["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"] = false, + _a["policy:VLanId_u32"] = 0, + _a["policy:Ver3_bool"] = true, + _a)); + return [4 /*yield*/, api.SetGroup(in_rpc_set_group)]; + case 1: + out_rpc_set_group = _b.sent(); + console.log(out_rpc_set_group); + console.log("End: Test_SetGroup"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetGroup', Get group information */ +function Test_GetGroup() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_set_group, out_rpc_set_group; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetGroup"); + in_rpc_set_group = new VPN.VpnRpcSetGroup({ + HubName_str: hub_name, + Name_str: "group1" + }); + return [4 /*yield*/, api.GetGroup(in_rpc_set_group)]; + case 1: + out_rpc_set_group = _a.sent(); + console.log(out_rpc_set_group); + console.log("End: Test_GetGroup"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteGroup', Delete a group */ +function Test_DeleteGroup() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_delete_user, out_rpc_delete_user; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteGroup"); + in_rpc_delete_user = new VPN.VpnRpcDeleteUser({ + HubName_str: hub_name, + Name_str: "group1" + }); + return [4 /*yield*/, api.DeleteGroup(in_rpc_delete_user)]; + case 1: + out_rpc_delete_user = _a.sent(); + console.log(out_rpc_delete_user); + console.log("End: Test_DeleteGroup"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumGroup', Enumerate groups */ +function Test_EnumGroup() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_group, out_rpc_enum_group; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumGroup"); + in_rpc_enum_group = new VPN.VpnRpcEnumGroup({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumGroup(in_rpc_enum_group)]; + case 1: + out_rpc_enum_group = _a.sent(); + console.log(out_rpc_enum_group); + console.log("End: Test_EnumGroup"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumSession', Enumerate sessions */ +function Test_EnumSession() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_session, out_rpc_enum_session; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumSession"); + in_rpc_enum_session = new VPN.VpnRpcEnumSession({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumSession(in_rpc_enum_session)]; + case 1: + out_rpc_enum_session = _a.sent(); + console.log(out_rpc_enum_session); + console.log("End: Test_EnumSession"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_session]; + } + }); + }); +} +/** API test for 'GetSessionStatus', Get session status */ +function Test_GetSessionStatus(session_name) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_session_status, out_rpc_session_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetSessionStatus"); + in_rpc_session_status = new VPN.VpnRpcSessionStatus({ + HubName_str: hub_name, + Name_str: session_name + }); + return [4 /*yield*/, api.GetSessionStatus(in_rpc_session_status)]; + case 1: + out_rpc_session_status = _a.sent(); + console.log(out_rpc_session_status); + console.log("End: Test_GetSessionStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteSession', Delete a session */ +function Test_DeleteSession(session_id) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_delete_session, out_rpc_delete_session; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteSession"); + in_rpc_delete_session = new VPN.VpnRpcDeleteSession({ + HubName_str: hub_name, + Name_str: session_id + }); + return [4 /*yield*/, api.DeleteSession(in_rpc_delete_session)]; + case 1: + out_rpc_delete_session = _a.sent(); + console.log(out_rpc_delete_session); + console.log("End: Test_DeleteSession"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumMacTable', Get MAC address table */ +function Test_EnumMacTable() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_mac_table, out_rpc_enum_mac_table; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumMacTable"); + in_rpc_enum_mac_table = new VPN.VpnRpcEnumMacTable({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumMacTable(in_rpc_enum_mac_table)]; + case 1: + out_rpc_enum_mac_table = _a.sent(); + console.log(out_rpc_enum_mac_table); + console.log("End: Test_EnumMacTable"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_mac_table]; + } + }); + }); +} +/** API test for 'DeleteMacTable', Delete MAC address table entry */ +function Test_DeleteMacTable(key32) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_delete_table, out_rpc_delete_table; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteMacTable"); + in_rpc_delete_table = new VPN.VpnRpcDeleteTable({ + HubName_str: hub_name, + Key_u32: key32 + }); + return [4 /*yield*/, api.DeleteMacTable(in_rpc_delete_table)]; + case 1: + out_rpc_delete_table = _a.sent(); + console.log("End: Test_DeleteMacTable"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumIpTable', Get IP address table */ +function Test_EnumIpTable() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_ip_table, out_rpc_enum_ip_table; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumIpTable"); + in_rpc_enum_ip_table = new VPN.VpnRpcEnumIpTable({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumIpTable(in_rpc_enum_ip_table)]; + case 1: + out_rpc_enum_ip_table = _a.sent(); + console.log(out_rpc_enum_ip_table); + console.log("End: Test_EnumIpTable"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_ip_table]; + } + }); + }); +} +/** API test for 'DeleteIpTable', Delete IP address table entry */ +function Test_DeleteIpTable(key32) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_delete_table, out_rpc_delete_table; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteIpTable"); + in_rpc_delete_table = new VPN.VpnRpcDeleteTable({ + HubName_str: hub_name, + Key_u32: key32 + }); + return [4 /*yield*/, api.DeleteIpTable(in_rpc_delete_table)]; + case 1: + out_rpc_delete_table = _a.sent(); + console.log(out_rpc_delete_table); + console.log("End: Test_DeleteIpTable"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetKeep', Set keep-alive function setting */ +function Test_SetKeep() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_keep, out_rpc_keep; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetKeep"); + in_rpc_keep = new VPN.VpnRpcKeep({ + UseKeepConnect_bool: true, + KeepConnectHost_str: "www.softether.org", + KeepConnectPort_u32: 123, + KeepConnectProtocol_u32: VPN.VpnRpcKeepAliveProtocol.UDP, + KeepConnectInterval_u32: 1 + }); + return [4 /*yield*/, api.SetKeep(in_rpc_keep)]; + case 1: + out_rpc_keep = _a.sent(); + console.log(out_rpc_keep); + console.log("End: Test_SetKeep"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetKeep', Get keep-alive function setting */ +function Test_GetKeep() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_keep, out_rpc_keep; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetKeep"); + in_rpc_keep = new VPN.VpnRpcKeep({}); + return [4 /*yield*/, api.GetKeep(in_rpc_keep)]; + case 1: + out_rpc_keep = _a.sent(); + console.log(out_rpc_keep); + console.log("End: Test_GetKeep"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnableSecureNAT', Enable SecureNAT function of the hub */ +function Test_EnableSecureNAT() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_hub, out_rpc_hub; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnableSecureNAT"); + in_rpc_hub = new VPN.VpnRpcHub({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnableSecureNAT(in_rpc_hub)]; + case 1: + out_rpc_hub = _a.sent(); + console.log(out_rpc_hub); + console.log("End: Test_EnableSecureNAT"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DisableSecureNAT', Disable the SecureNAT function of the hub */ +function Test_DisableSecureNAT() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_hub, out_rpc_hub; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DisableSecureNAT"); + in_rpc_hub = new VPN.VpnRpcHub({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.DisableSecureNAT(in_rpc_hub)]; + case 1: + out_rpc_hub = _a.sent(); + console.log(out_rpc_hub); + console.log("End: Test_DisableSecureNAT"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetSecureNATOption', Set SecureNAT options */ +function Test_SetSecureNATOption() { + return __awaiter(this, void 0, void 0, function () { + var in_vh_option, out_vh_option; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetSecureNATOption"); + in_vh_option = new VPN.VpnVhOption({ + RpcHubName_str: hub_name, + MacAddress_bin: new Uint8Array([0x00, 0xAC, 0x00, 0x11, 0x22, 0x33,]), + Ip_ip: "10.0.0.254", + Mask_ip: "255.255.255.0", + UseNat_bool: true, + Mtu_u32: 1200, + NatTcpTimeout_u32: 100, + NatUdpTimeout_u32: 50, + UseDhcp_bool: true, + DhcpLeaseIPStart_ip: "10.0.0.101", + DhcpLeaseIPEnd_ip: "10.0.0.199", + DhcpSubnetMask_ip: "255.255.255.0", + DhcpExpireTimeSpan_u32: 3600, + DhcpGatewayAddress_ip: "10.0.0.254", + DhcpDnsServerAddress_ip: "10.0.0.254", + DhcpDnsServerAddress2_ip: "8.8.8.8", + DhcpDomainName_str: "lab.coe.ad.jp", + SaveLog_bool: true, + ApplyDhcpPushRoutes_bool: false, + DhcpPushRoutes_str: "" + }); + return [4 /*yield*/, api.SetSecureNATOption(in_vh_option)]; + case 1: + out_vh_option = _a.sent(); + console.log(out_vh_option); + console.log("End: Test_SetSecureNATOption"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetSecureNATOption', Get SecureNAT options */ +function Test_GetSecureNATOption() { + return __awaiter(this, void 0, void 0, function () { + var in_vh_option, out_vh_option; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetSecureNATOption"); + in_vh_option = new VPN.VpnVhOption({ + RpcHubName_str: hub_name + }); + return [4 /*yield*/, api.GetSecureNATOption(in_vh_option)]; + case 1: + out_vh_option = _a.sent(); + console.log(out_vh_option); + console.log("End: Test_GetSecureNATOption"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumNAT', Enumerate NAT entries of the SecureNAT */ +function Test_EnumNAT() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_nat, out_rpc_enum_nat; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumNAT"); + in_rpc_enum_nat = new VPN.VpnRpcEnumNat({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumNAT(in_rpc_enum_nat)]; + case 1: + out_rpc_enum_nat = _a.sent(); + console.log(out_rpc_enum_nat); + console.log("End: Test_EnumNAT"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumDHCP', Enumerate DHCP entries */ +function Test_EnumDHCP() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_dhcp, out_rpc_enum_dhcp; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumDHCP"); + in_rpc_enum_dhcp = new VPN.VpnRpcEnumDhcp({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumDHCP(in_rpc_enum_dhcp)]; + case 1: + out_rpc_enum_dhcp = _a.sent(); + console.log(out_rpc_enum_dhcp); + console.log("End: Test_EnumDHCP"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetSecureNATStatus', Get status of the SecureNAT */ +function Test_GetSecureNATStatus() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_nat_status, out_rpc_nat_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetSecureNATStatus"); + in_rpc_nat_status = new VPN.VpnRpcNatStatus({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetSecureNATStatus(in_rpc_nat_status)]; + case 1: + out_rpc_nat_status = _a.sent(); + console.log(out_rpc_nat_status); + console.log("End: Test_GetSecureNATStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumEthernet', Enumerate Ethernet devices */ +function Test_EnumEthernet() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_enum_eth; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumEthernet"); + return [4 /*yield*/, api.EnumEthernet()]; + case 1: + out_rpc_enum_eth = _a.sent(); + console.log(out_rpc_enum_eth); + console.log("End: Test_EnumEthernet"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'AddLocalBridge', Add a new local bridge */ +function Test_AddLocalBridge() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_localbridge, out_rpc_localbridge; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_AddLocalBridge"); + in_rpc_localbridge = new VPN.VpnRpcLocalBridge({ + DeviceName_str: "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str: hub_name + }); + return [4 /*yield*/, api.AddLocalBridge(in_rpc_localbridge)]; + case 1: + out_rpc_localbridge = _a.sent(); + console.log(out_rpc_localbridge); + console.log("End: Test_AddLocalBridge"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteLocalBridge', Delete a local bridge */ +function Test_DeleteLocalBridge() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_localbridge, out_rpc_localbridge; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteLocalBridge"); + in_rpc_localbridge = new VPN.VpnRpcLocalBridge({ + DeviceName_str: "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str: hub_name + }); + return [4 /*yield*/, api.DeleteLocalBridge(in_rpc_localbridge)]; + case 1: + out_rpc_localbridge = _a.sent(); + console.log(out_rpc_localbridge); + console.log("End: Test_DeleteLocalBridge"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumLocalBridge', Enumerate local bridges */ +function Test_EnumLocalBridge() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_enum_localbridge; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumLocalBridge"); + return [4 /*yield*/, api.EnumLocalBridge()]; + case 1: + out_rpc_enum_localbridge = _a.sent(); + console.log(out_rpc_enum_localbridge); + console.log("End: Test_EnumLocalBridge"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetBridgeSupport', Get availability to localbridge function */ +function Test_GetBridgeSupport() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_bridge_support; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetBridgeSupport"); + return [4 /*yield*/, api.GetBridgeSupport()]; + case 1: + out_rpc_bridge_support = _a.sent(); + console.log(out_rpc_bridge_support); + console.log("End: Test_GetBridgeSupport"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'RebootServer', Reboot server itself */ +function Test_RebootServer() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_test, out_rpc_test; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_RebootServer"); + in_rpc_test = new VPN.VpnRpcTest({}); + return [4 /*yield*/, api.RebootServer(in_rpc_test)]; + case 1: + out_rpc_test = _a.sent(); + console.log(out_rpc_test); + console.log("End: Test_RebootServer"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetCaps', Get capabilities */ +function Test_GetCaps() { + return __awaiter(this, void 0, void 0, function () { + var out_capslist; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetCaps"); + return [4 /*yield*/, api.GetCaps()]; + case 1: + out_capslist = _a.sent(); + console.log(out_capslist); + console.log("End: Test_GetCaps"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetConfig', Get configuration file stream */ +function Test_GetConfig() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_config; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetConfig"); + return [4 /*yield*/, api.GetConfig()]; + case 1: + out_rpc_config = _a.sent(); + console.log(out_rpc_config); + console.log("End: Test_GetConfig"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetConfig', Overwrite configuration file by specified data */ +function Test_SetConfig() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_config, out_rpc_config; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetConfig"); + in_rpc_config = new VPN.VpnRpcConfig({ + FileData_bin: new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,]) + }); + return [4 /*yield*/, api.SetConfig(in_rpc_config)]; + case 1: + out_rpc_config = _a.sent(); + console.log("End: Test_SetConfig"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetDefaultHubAdminOptions', Get default hub administration options */ +function Test_GetDefaultHubAdminOptions() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_admin_option, out_rpc_admin_option; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetDefaultHubAdminOptions"); + in_rpc_admin_option = new VPN.VpnRpcAdminOption({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetDefaultHubAdminOptions(in_rpc_admin_option)]; + case 1: + out_rpc_admin_option = _a.sent(); + console.log(out_rpc_admin_option); + console.log("End: Test_GetDefaultHubAdminOptions"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetHubAdminOptions', Get hub administration options */ +function Test_GetHubAdminOptions() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_admin_option, out_rpc_admin_option; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetHubAdminOptions"); + in_rpc_admin_option = new VPN.VpnRpcAdminOption({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetHubAdminOptions(in_rpc_admin_option)]; + case 1: + out_rpc_admin_option = _a.sent(); + console.log(out_rpc_admin_option); + console.log("End: Test_GetHubAdminOptions"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetHubAdminOptions', Set hub administration options */ +function Test_SetHubAdminOptions() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_admin_option, out_rpc_admin_option; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetHubAdminOptions"); + in_rpc_admin_option = new VPN.VpnRpcAdminOption({ + HubName_str: hub_name, + AdminOptionList: [new VPN.VpnAdminOption({ + Name_str: "no_securenat_enablenat", + Value_u32: 1 + }),] + }); + return [4 /*yield*/, api.SetHubAdminOptions(in_rpc_admin_option)]; + case 1: + out_rpc_admin_option = _a.sent(); + console.log(out_rpc_admin_option); + console.log("End: Test_SetHubAdminOptions"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetHubExtOptions', Get hub extended options */ +function Test_GetHubExtOptions() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_admin_option, out_rpc_admin_option; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetHubExtOptions"); + in_rpc_admin_option = new VPN.VpnRpcAdminOption({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetHubExtOptions(in_rpc_admin_option)]; + case 1: + out_rpc_admin_option = _a.sent(); + console.log(out_rpc_admin_option); + console.log("End: Test_GetHubExtOptions"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetHubExtOptions', Set hub extended options */ +function Test_SetHubExtOptions() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_admin_option, out_rpc_admin_option; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetHubExtOptions"); + in_rpc_admin_option = new VPN.VpnRpcAdminOption({ + HubName_str: hub_name, + AdminOptionList: [new VPN.VpnAdminOption({ + Name_str: "SecureNAT_RandomizeAssignIp", + Value_u32: 1 + }),] + }); + return [4 /*yield*/, api.SetHubExtOptions(in_rpc_admin_option)]; + case 1: + out_rpc_admin_option = _a.sent(); + console.log(out_rpc_admin_option); + console.log("End: Test_SetHubExtOptions"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'AddL3Switch', Add a new virtual layer-3 switch */ +function Test_AddL3Switch() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_l3sw, out_rpc_l3sw; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_AddL3Switch"); + in_rpc_l3sw = new VPN.VpnRpcL3Sw({ + Name_str: "L3SW1" + }); + return [4 /*yield*/, api.AddL3Switch(in_rpc_l3sw)]; + case 1: + out_rpc_l3sw = _a.sent(); + console.log(out_rpc_l3sw); + console.log("End: Test_AddL3Switch"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DelL3Switch', Delete a virtual layer-3 switch */ +function Test_DelL3Switch() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_l3sw, out_rpc_l3sw; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DelL3Switch"); + in_rpc_l3sw = new VPN.VpnRpcL3Sw({ + Name_str: "L3SW1" + }); + return [4 /*yield*/, api.DelL3Switch(in_rpc_l3sw)]; + case 1: + out_rpc_l3sw = _a.sent(); + console.log(out_rpc_l3sw); + console.log("End: Test_DelL3Switch"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumL3Switch', Enumerate virtual layer-3 switches */ +function Test_EnumL3Switch() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_enum_l3sw; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumL3Switch"); + return [4 /*yield*/, api.EnumL3Switch()]; + case 1: + out_rpc_enum_l3sw = _a.sent(); + console.log(out_rpc_enum_l3sw); + console.log("End: Test_EnumL3Switch"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'StartL3Switch', Start a virtual layer-3 switch */ +function Test_StartL3Switch() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_l3sw, out_rpc_l3sw; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_StartL3Switch"); + in_rpc_l3sw = new VPN.VpnRpcL3Sw({ + Name_str: "L3SW1" + }); + return [4 /*yield*/, api.StartL3Switch(in_rpc_l3sw)]; + case 1: + out_rpc_l3sw = _a.sent(); + console.log(out_rpc_l3sw); + console.log("End: Test_StartL3Switch"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'StopL3Switch', Stop a virtual layer-3 switch */ +function Test_StopL3Switch() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_l3sw, out_rpc_l3sw; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_StopL3Switch"); + in_rpc_l3sw = new VPN.VpnRpcL3Sw({ + Name_str: "L3SW1" + }); + return [4 /*yield*/, api.StopL3Switch(in_rpc_l3sw)]; + case 1: + out_rpc_l3sw = _a.sent(); + console.log(out_rpc_l3sw); + console.log("End: Test_StopL3Switch"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'AddL3If', Add new virtual interface on virtual L3 switch */ +function Test_AddL3If() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_l3if, out_rpc_l3if; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_AddL3If"); + in_rpc_l3if = new VPN.VpnRpcL3If({ + Name_str: "L3SW1", + HubName_str: hub_name, + IpAddress_ip: "192.168.0.1", + SubnetMask_ip: "255.255.255.0" + }); + return [4 /*yield*/, api.AddL3If(in_rpc_l3if)]; + case 1: + out_rpc_l3if = _a.sent(); + console.log(out_rpc_l3if); + console.log("End: Test_AddL3If"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DelL3If', Delete a virtual interface on virtual L3 switch */ +function Test_DelL3If() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_l3if, out_rpc_l3if; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DelL3If"); + in_rpc_l3if = new VPN.VpnRpcL3If({ + Name_str: "L3SW1", + HubName_str: hub_name + }); + return [4 /*yield*/, api.DelL3If(in_rpc_l3if)]; + case 1: + out_rpc_l3if = _a.sent(); + console.log(out_rpc_l3if); + console.log("End: Test_DelL3If"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumL3If', Enumerate virtual interfaces on virtual L3 switch */ +function Test_EnumL3If() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_l3if, out_rpc_enum_l3if; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumL3If"); + in_rpc_enum_l3if = new VPN.VpnRpcEnumL3If({ + Name_str: "L3SW1" + }); + return [4 /*yield*/, api.EnumL3If(in_rpc_enum_l3if)]; + case 1: + out_rpc_enum_l3if = _a.sent(); + console.log(out_rpc_enum_l3if); + console.log("End: Test_EnumL3If"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'AddL3Table', Add new routing table entry on virtual L3 switch */ +function Test_AddL3Table() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_l3table, out_rpc_l3table; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_AddL3Table"); + in_rpc_l3table = new VPN.VpnRpcL3Table({ + Name_str: "L3SW1", + NetworkAddress_ip: "10.0.0.0", + SubnetMask_ip: "255.0.0.0", + GatewayAddress_ip: "192.168.7.1", + Metric_u32: 10 + }); + return [4 /*yield*/, api.AddL3Table(in_rpc_l3table)]; + case 1: + out_rpc_l3table = _a.sent(); + console.log(out_rpc_l3table); + console.log("End: Test_AddL3Table"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DelL3Table', Delete routing table entry on virtual L3 switch */ +function Test_DelL3Table() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_l3table, out_rpc_l3table; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DelL3Table"); + in_rpc_l3table = new VPN.VpnRpcL3Table({ + Name_str: "L3SW1", + NetworkAddress_ip: "10.0.0.0", + SubnetMask_ip: "255.0.0.0", + GatewayAddress_ip: "192.168.7.1", + Metric_u32: 10 + }); + return [4 /*yield*/, api.DelL3Table(in_rpc_l3table)]; + case 1: + out_rpc_l3table = _a.sent(); + console.log(out_rpc_l3table); + console.log("End: Test_DelL3Table"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumL3Table', Get routing table on virtual L3 switch */ +function Test_EnumL3Table() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_l3table, out_rpc_enum_l3table; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumL3Table"); + in_rpc_enum_l3table = new VPN.VpnRpcEnumL3Table({ + Name_str: "L3SW1" + }); + return [4 /*yield*/, api.EnumL3Table(in_rpc_enum_l3table)]; + case 1: + out_rpc_enum_l3table = _a.sent(); + console.log(out_rpc_enum_l3table); + console.log("End: Test_EnumL3Table"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumCrl', Get CRL (Certificate Revocation List) index */ +function Test_EnumCrl() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_enum_crl, out_rpc_enum_crl; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumCrl"); + in_rpc_enum_crl = new VPN.VpnRpcEnumCrl({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.EnumCrl(in_rpc_enum_crl)]; + case 1: + out_rpc_enum_crl = _a.sent(); + console.log(out_rpc_enum_crl); + console.log("End: Test_EnumCrl"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_crl]; + } + }); + }); +} +/** API test for 'AddCrl', Add new CRL (Certificate Revocation List) entry */ +function Test_AddCrl() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_crl, out_rpc_crl; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_AddCrl"); + in_rpc_crl = new VPN.VpnRpcCrl({ + HubName_str: hub_name, + CommonName_utf: "CN", + Organization_utf: "Org", + Unit_utf: "ICSCOE", + Country_utf: "JP", + State_utf: "Ibaraki", + Local_utf: "Tsukuba", + Serial_bin: new Uint8Array([1, 2, 3, 4, 5,]), + DigestMD5_bin: new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,]), + DigestSHA1_bin: new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,]) + }); + return [4 /*yield*/, api.AddCrl(in_rpc_crl)]; + case 1: + out_rpc_crl = _a.sent(); + console.log(out_rpc_crl); + console.log("End: Test_AddCrl"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DelCrl', Delete CRL (Certificate Revocation List) entry */ +function Test_DelCrl(key) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_crl, out_rpc_crl; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DelCrl"); + in_rpc_crl = new VPN.VpnRpcCrl({ + HubName_str: hub_name, + Key_u32: key + }); + return [4 /*yield*/, api.DelCrl(in_rpc_crl)]; + case 1: + out_rpc_crl = _a.sent(); + console.log(out_rpc_crl); + console.log("End: Test_DelCrl"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetCrl', Get CRL (Certificate Revocation List) entry */ +function Test_GetCrl(key) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_crl, out_rpc_crl; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetCrl"); + in_rpc_crl = new VPN.VpnRpcCrl({ + HubName_str: hub_name, + Key_u32: key + }); + return [4 /*yield*/, api.GetCrl(in_rpc_crl)]; + case 1: + out_rpc_crl = _a.sent(); + console.log(out_rpc_crl); + console.log("End: Test_GetCrl"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_crl]; + } + }); + }); +} +/** API test for 'SetCrl', Set CRL (Certificate Revocation List) entry */ +function Test_SetCrl(crl) { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_crl; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetCrl"); + return [4 /*yield*/, api.SetCrl(crl)]; + case 1: + out_rpc_crl = _a.sent(); + console.log(out_rpc_crl); + console.log("End: Test_SetCrl"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetAcList', Set access control list */ +function Test_SetAcList() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_ac_list, out_rpc_ac_list; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetAcList"); + in_rpc_ac_list = new VPN.VpnRpcAcList({ + HubName_str: hub_name, + ACList: [new VPN.VpnAc({ + Deny_bool: true, + IpAddress_ip: "192.168.0.0", + SubnetMask_ip: "255.255.0.0", + Masked_bool: true, + Priority_u32: 123 + }), new VPN.VpnAc({ + Deny_bool: false, + IpAddress_ip: "fe80::", + SubnetMask_ip: "8", + Masked_bool: true, + Priority_u32: 123 + }),] + }); + return [4 /*yield*/, api.SetAcList(in_rpc_ac_list)]; + case 1: + out_rpc_ac_list = _a.sent(); + console.log(out_rpc_ac_list); + console.log("End: Test_SetAcList"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetAcList', Get access control list */ +function Test_GetAcList() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_ac_list, out_rpc_ac_list; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetAcList"); + in_rpc_ac_list = new VPN.VpnRpcAcList({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetAcList(in_rpc_ac_list)]; + case 1: + out_rpc_ac_list = _a.sent(); + console.log(out_rpc_ac_list); + console.log("End: Test_GetAcList"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumLogFile', Enumerate log files */ +function Test_EnumLogFile() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_enum_log_file; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumLogFile"); + return [4 /*yield*/, api.EnumLogFile()]; + case 1: + out_rpc_enum_log_file = _a.sent(); + console.log(out_rpc_enum_log_file); + console.log("End: Test_EnumLogFile"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_log_file]; + } + }); + }); +} +/** API test for 'ReadLogFile', Read a log file */ +function Test_ReadLogFile(filename) { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_read_log_file, out_rpc_read_log_file; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_ReadLogFile"); + in_rpc_read_log_file = new VPN.VpnRpcReadLogFile({ + FilePath_str: filename + }); + return [4 /*yield*/, api.ReadLogFile(in_rpc_read_log_file)]; + case 1: + out_rpc_read_log_file = _a.sent(); + console.log(out_rpc_read_log_file); + console.log("End: Test_ReadLogFile"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetSysLog', Set syslog function setting */ +function Test_SetSysLog(flag) { + return __awaiter(this, void 0, void 0, function () { + var in_syslog_setting, out_syslog_setting; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetSysLog"); + in_syslog_setting = new VPN.VpnSyslogSetting({ + SaveType_u32: flag ? VPN.VpnSyslogSaveType.ServerAndHubAllLog : VPN.VpnSyslogSaveType.None, + Hostname_str: "1.2.3.4", + Port_u32: 123 + }); + return [4 /*yield*/, api.SetSysLog(in_syslog_setting)]; + case 1: + out_syslog_setting = _a.sent(); + console.log(out_syslog_setting); + console.log("End: Test_SetSysLog"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetSysLog', Get syslog function setting */ +function Test_GetSysLog() { + return __awaiter(this, void 0, void 0, function () { + var in_syslog_setting, out_syslog_setting; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetSysLog"); + in_syslog_setting = new VPN.VpnSyslogSetting({}); + return [4 /*yield*/, api.GetSysLog(in_syslog_setting)]; + case 1: + out_syslog_setting = _a.sent(); + console.log(out_syslog_setting); + console.log("End: Test_GetSysLog"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetHubMsg', Set message of today on hub */ +function Test_SetHubMsg() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_msg, out_rpc_msg; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetHubMsg"); + in_rpc_msg = new VPN.VpnRpcMsg({ + HubName_str: hub_name, + Msg_bin: new Uint8Array([0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x21, 0x20, 0xe4, 0xb8, 0x87, 0xe5, 0x9b, 0xbd, 0xe3, 0x81, 0xae, 0xe5, 0x8a, 0xb4, 0xe5, 0x83, 0x8d, 0xe8, 0x80, 0x85, 0xe3, 0x82, 0x88, 0xe3, 0x80, 0x81, 0xe5, 0x9b, 0xa3, 0xe7, 0xb5, 0x90, 0xe3, 0x81, 0x9b, 0xe3, 0x82, 0x88, 0x21, 0x20, 0xd7, 0x92, 0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x99, 0xd7, 0x9d, 0x20, 0xd7, 0xa2, 0xd7, 0x95, 0xd7, 0x91, 0xd7, 0x93, 0xd7, 0x99, 0xd7, 0x9d, 0x20, 0xd7, 0xa9, 0xd7, 0x9c, 0x20, 0xd7, 0x9b, 0xd7, 0x9c, 0x20, 0xd7, 0x94, 0xd7, 0x9e, 0xd7, 0x93, 0xd7, 0x99, 0xd7, 0xa0, 0xd7, 0x95, 0xd7, 0xaa, 0x2c, 0x20, 0xd7, 0x94, 0xd7, 0xaa, 0xd7, 0x90, 0xd7, 0x97, 0xd7, 0x93, 0xd7, 0x95, 0x21,]) + }); + return [4 /*yield*/, api.SetHubMsg(in_rpc_msg)]; + case 1: + out_rpc_msg = _a.sent(); + console.log(out_rpc_msg); + console.log("End: Test_SetHubMsg"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetHubMsg', Get message of today on hub */ +function Test_GetHubMsg() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_msg, out_rpc_msg; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetHubMsg"); + in_rpc_msg = new VPN.VpnRpcMsg({ + HubName_str: hub_name + }); + return [4 /*yield*/, api.GetHubMsg(in_rpc_msg)]; + case 1: + out_rpc_msg = _a.sent(); + console.log(out_rpc_msg); + console.log("End: Test_GetHubMsg"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'Crash', Do Crash */ +function Test_Crash() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_test, out_rpc_test; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_Crash"); + in_rpc_test = new VPN.VpnRpcTest({}); + return [4 /*yield*/, api.Crash(in_rpc_test)]; + case 1: + out_rpc_test = _a.sent(); + console.log(out_rpc_test); + console.log("End: Test_Crash"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetAdminMsg', Get message for administrators */ +function Test_GetAdminMsg() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_msg; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetAdminMsg"); + return [4 /*yield*/, api.GetAdminMsg()]; + case 1: + out_rpc_msg = _a.sent(); + console.log(out_rpc_msg); + console.log("End: Test_GetAdminMsg"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'Flush', Flush configuration file */ +function Test_Flush() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_test, out_rpc_test; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_Flush"); + in_rpc_test = new VPN.VpnRpcTest({}); + return [4 /*yield*/, api.Flush(in_rpc_test)]; + case 1: + out_rpc_test = _a.sent(); + console.log(out_rpc_test); + console.log("End: Test_Flush"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetIPsecServices', Set IPsec service configuration */ +function Test_SetIPsecServices() { + return __awaiter(this, void 0, void 0, function () { + var in_ipsec_services, out_ipsec_services; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetIPsecServices"); + in_ipsec_services = new VPN.VpnIPsecServices({ + L2TP_Raw_bool: false, + L2TP_IPsec_bool: false, + EtherIP_IPsec_bool: false, + IPsec_Secret_str: "vpn", + L2TP_DefaultHub_str: "HUB_ABC" + }); + return [4 /*yield*/, api.SetIPsecServices(in_ipsec_services)]; + case 1: + out_ipsec_services = _a.sent(); + console.log(out_ipsec_services); + console.log("End: Test_SetIPsecServices"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetIPsecServices', Get IPsec service configuration */ +function Test_GetIPsecServices() { + return __awaiter(this, void 0, void 0, function () { + var out_ipsec_services; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetIPsecServices"); + return [4 /*yield*/, api.GetIPsecServices()]; + case 1: + out_ipsec_services = _a.sent(); + console.log(out_ipsec_services); + console.log("End: Test_GetIPsecServices"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'AddEtherIpId', Add EtherIP ID setting */ +function Test_AddEtherIpId() { + return __awaiter(this, void 0, void 0, function () { + var in_etherip_id, out_etherip_id; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_AddEtherIpId"); + in_etherip_id = new VPN.VpnEtherIpId({ + Id_str: "testid", + HubName_str: hub_name, + UserName_str: "nekosan", + Password_str: "torisan" + }); + return [4 /*yield*/, api.AddEtherIpId(in_etherip_id)]; + case 1: + out_etherip_id = _a.sent(); + console.log(out_etherip_id); + console.log("End: Test_AddEtherIpId"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetEtherIpId', Get EtherIP ID setting */ +function Test_GetEtherIpId(id) { + return __awaiter(this, void 0, void 0, function () { + var in_etherip_id, out_etherip_id; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetEtherIpId"); + in_etherip_id = new VPN.VpnEtherIpId({ + Id_str: id + }); + return [4 /*yield*/, api.GetEtherIpId(in_etherip_id)]; + case 1: + out_etherip_id = _a.sent(); + console.log(out_etherip_id); + console.log("End: Test_GetEtherIpId"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'DeleteEtherIpId', Delete EtherIP ID setting */ +function Test_DeleteEtherIpId(id) { + return __awaiter(this, void 0, void 0, function () { + var in_etherip_id, out_etherip_id; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_DeleteEtherIpId"); + in_etherip_id = new VPN.VpnEtherIpId({ + Id_str: id + }); + return [4 /*yield*/, api.DeleteEtherIpId(in_etherip_id)]; + case 1: + out_etherip_id = _a.sent(); + console.log(out_etherip_id); + console.log("End: Test_DeleteEtherIpId"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'EnumEtherIpId', Enumerate EtherIP ID settings */ +function Test_EnumEtherIpId() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_enum_etherip_id; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_EnumEtherIpId"); + return [4 /*yield*/, api.EnumEtherIpId()]; + case 1: + out_rpc_enum_etherip_id = _a.sent(); + console.log(out_rpc_enum_etherip_id); + console.log("End: Test_EnumEtherIpId"); + console.log("-----"); + console.log(); + return [2 /*return*/, out_rpc_enum_etherip_id]; + } + }); + }); +} +/** API test for 'SetOpenVpnSstpConfig', Set configurations for OpenVPN and SSTP */ +function Test_SetOpenVpnSstpConfig() { + return __awaiter(this, void 0, void 0, function () { + var in_openvpn_sstp_config, out_openvpn_sstp_config; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetOpenVpnSstpConfig"); + in_openvpn_sstp_config = new VPN.VpnOpenVpnSstpConfig({ + EnableOpenVPN_bool: true, + OpenVPNPortList_str: "1 2 3 4 5", + EnableSSTP_bool: true + }); + return [4 /*yield*/, api.SetOpenVpnSstpConfig(in_openvpn_sstp_config)]; + case 1: + out_openvpn_sstp_config = _a.sent(); + console.log(out_openvpn_sstp_config); + console.log("End: Test_SetOpenVpnSstpConfig"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetOpenVpnSstpConfig', Get configurations for OpenVPN and SSTP */ +function Test_GetOpenVpnSstpConfig() { + return __awaiter(this, void 0, void 0, function () { + var out_openvpn_sstp_config; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetOpenVpnSstpConfig"); + return [4 /*yield*/, api.GetOpenVpnSstpConfig()]; + case 1: + out_openvpn_sstp_config = _a.sent(); + console.log(out_openvpn_sstp_config); + console.log("End: Test_GetOpenVpnSstpConfig"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetDDnsClientStatus', Get status of DDNS client */ +function Test_GetDDnsClientStatus() { + return __awaiter(this, void 0, void 0, function () { + var out_ddns_client_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetDDnsClientStatus"); + return [4 /*yield*/, api.GetDDnsClientStatus()]; + case 1: + out_ddns_client_status = _a.sent(); + console.log(out_ddns_client_status); + console.log("End: Test_GetDDnsClientStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'ChangeDDnsClientHostname', Change host-name for DDNS client */ +function Test_ChangeDDnsClientHostname() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_test, out_rpc_test; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_ChangeDDnsClientHostname"); + in_rpc_test = new VPN.VpnRpcTest({ + StrValue_str: "nekotest" + Math.floor((Math.random() * (2100000000 - 1000000000)) + 1000000000) + }); + return [4 /*yield*/, api.ChangeDDnsClientHostname(in_rpc_test)]; + case 1: + out_rpc_test = _a.sent(); + console.log(out_rpc_test); + console.log("End: Test_ChangeDDnsClientHostname"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'RegenerateServerCert', Regenerate server certification */ +function Test_RegenerateServerCert() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_test, out_rpc_test; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_RegenerateServerCert"); + in_rpc_test = new VPN.VpnRpcTest({ + StrValue_str: "abc.example.org" + }); + return [4 /*yield*/, api.RegenerateServerCert(in_rpc_test)]; + case 1: + out_rpc_test = _a.sent(); + console.log(out_rpc_test); + console.log("End: Test_RegenerateServerCert"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'MakeOpenVpnConfigFile', Generate OpenVPN configuration files */ +function Test_MakeOpenVpnConfigFile() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_read_log_file; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_MakeOpenVpnConfigFile"); + return [4 /*yield*/, api.MakeOpenVpnConfigFile()]; + case 1: + out_rpc_read_log_file = _a.sent(); + console.log(out_rpc_read_log_file); + console.log("End: Test_MakeOpenVpnConfigFile"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetSpecialListener', Set special listener status */ +function Test_SetSpecialListener() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_special_listener, out_rpc_special_listener; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetSpecialListener"); + in_rpc_special_listener = new VPN.VpnRpcSpecialListener({ + VpnOverDnsListener_bool: true, + VpnOverIcmpListener_bool: true + }); + return [4 /*yield*/, api.SetSpecialListener(in_rpc_special_listener)]; + case 1: + out_rpc_special_listener = _a.sent(); + console.log(out_rpc_special_listener); + console.log("End: Test_SetSpecialListener"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetSpecialListener', Get special listener status */ +function Test_GetSpecialListener() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_special_listener; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetSpecialListener"); + return [4 /*yield*/, api.GetSpecialListener()]; + case 1: + out_rpc_special_listener = _a.sent(); + console.log(out_rpc_special_listener); + console.log("End: Test_GetSpecialListener"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetAzureStatus', Get Azure status */ +function Test_GetAzureStatus() { + return __awaiter(this, void 0, void 0, function () { + var out_rpc_azure_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetAzureStatus"); + return [4 /*yield*/, api.GetAzureStatus()]; + case 1: + out_rpc_azure_status = _a.sent(); + console.log(out_rpc_azure_status); + console.log("End: Test_GetAzureStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetAzureStatus', Set Azure status */ +function Test_SetAzureStatus() { + return __awaiter(this, void 0, void 0, function () { + var in_rpc_azure_status, out_rpc_azure_status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetAzureStatus"); + in_rpc_azure_status = new VPN.VpnRpcAzureStatus({ + IsEnabled_bool: true + }); + return [4 /*yield*/, api.SetAzureStatus(in_rpc_azure_status)]; + case 1: + out_rpc_azure_status = _a.sent(); + console.log(out_rpc_azure_status); + console.log("End: Test_SetAzureStatus"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetDDnsInternetSettng', Get DDNS proxy configuration */ +function Test_GetDDnsInternetSettng() { + return __awaiter(this, void 0, void 0, function () { + var out_internet_setting; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetDDnsInternetSettng"); + return [4 /*yield*/, api.GetDDnsInternetSettng()]; + case 1: + out_internet_setting = _a.sent(); + console.log(out_internet_setting); + console.log("End: Test_GetDDnsInternetSettng"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetDDnsInternetSettng', Set DDNS proxy configuration */ +function Test_SetDDnsInternetSettng() { + return __awaiter(this, void 0, void 0, function () { + var in_internet_setting, out_internet_setting; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetDDnsInternetSettng"); + in_internet_setting = new VPN.VpnInternetSetting({ + ProxyType_u32: VPN.VpnRpcProxyType.Direct, + ProxyHostName_str: "1.2.3.4", + ProxyPort_u32: 1234, + ProxyUsername_str: "neko", + ProxyPassword_str: "dog" + }); + return [4 /*yield*/, api.SetDDnsInternetSettng(in_internet_setting)]; + case 1: + out_internet_setting = _a.sent(); + console.log(out_internet_setting); + console.log("End: Test_SetDDnsInternetSettng"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'SetVgsConfig', Setting VPN Gate Server Configuration */ +function Test_SetVgsConfig() { + return __awaiter(this, void 0, void 0, function () { + var in_vgs_config, out_vgs_config; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_SetVgsConfig"); + in_vgs_config = new VPN.VpnVgsConfig({ + IsEnabled_bool: false, + Message_utf: "Neko san!!!", + Owner_utf: "Go go go!!!", + Abuse_utf: "da.test@softether.co.jp", + NoLog_bool: false, + LogPermanent_bool: true, + EnableL2TP_bool: true + }); + return [4 /*yield*/, api.SetVgsConfig(in_vgs_config)]; + case 1: + out_vgs_config = _a.sent(); + console.log(out_vgs_config); + console.log("End: Test_SetVgsConfig"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +/** API test for 'GetVgsConfig', Get VPN Gate configuration */ +function Test_GetVgsConfig() { + return __awaiter(this, void 0, void 0, function () { + var out_vgs_config; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Begin: Test_GetVgsConfig"); + return [4 /*yield*/, api.GetVgsConfig()]; + case 1: + out_vgs_config = _a.sent(); + console.log(out_vgs_config); + console.log("End: Test_GetVgsConfig"); + console.log("-----"); + console.log(); + return [2 /*return*/]; + } + }); + }); +} +//# sourceMappingURL=sample.js.map \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js.map softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js.map --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js.map 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js.map 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1 @@ +{"version":3,"file":"sample.js","sourceRoot":"","sources":["../src/sample.ts"],"names":[],"mappings":"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,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAI,CAAC;wBAC33P,OAAO,EAAG,IAAI,UAAU,CAAC,CAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,I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AAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,I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"} \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,2721 @@ +/** VPN Server RPC Stubs */ +export declare class VpnServerRpc { + /** Determine if this JavaScript environment is on the Node.js or not. */ + static IsNodeJS(): boolean; + /** Set the debug mode flag */ + static SetDebugMode(flag: boolean): void; + private rpc_url; + private rpc_client; + /** + * Constructor of the VpnServerRpc class + * @param vpnserver_hostname The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param vpnserver_port The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param hubname The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. + * @param password Specify the administration password. This value is valid only if vpnserver_hostname is sepcified. + * @param nodejs_https_client_reject_untrusted_server_cert In Node.js set this true to check the SSL server certificate on the destination VPN Server. Set this false to ignore the SSL server certification. + */ + constructor(vpnserver_hostname?: string, vpnserver_port?: number, hubname?: string, password?: string, nodejs_https_client_reject_untrusted_server_cert?: boolean); + /** Test RPC function. Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. */ + Test: (in_param: VpnRpcTest) => Promise; + /** Get server information. This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. */ + GetServerInfo: () => Promise; + /** Get Current Server Status. This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. */ + GetServerStatus: () => Promise; + /** Create New TCP Listener. This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. */ + CreateListener: (in_param: VpnRpcListener) => Promise; + /** Get List of TCP Listeners. This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. */ + EnumListener: () => Promise; + /** Delete TCP Listener. This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. */ + DeleteListener: (in_param: VpnRpcListener) => Promise; + /** Enable / Disable TCP Listener. This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. */ + EnableListener: (in_param: VpnRpcListener) => Promise; + /** Set VPN Server Administrator Password. This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. */ + SetServerPassword: (in_param: VpnRpcSetPassword) => Promise; + /** Set the VPN Server clustering configuration. Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. */ + SetFarmSetting: (in_param: VpnRpcFarm) => Promise; + /** Get Clustering Configuration of Current VPN Server. You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. */ + GetFarmSetting: () => Promise; + /** Get Cluster Member Information. When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. */ + GetFarmInfo: (in_param: VpnRpcFarmInfo) => Promise; + /** Get List of Cluster Members. Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. */ + EnumFarmMember: () => Promise; + /** Get Connection Status to Cluster Controller. Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. */ + GetFarmConnectionStatus: () => Promise; + /** Set SSL Certificate and Private Key of VPN Server. You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. */ + SetServerCert: (in_param: VpnRpcKeyPair) => Promise; + /** Get SSL Certificate and Private Key of VPN Server. Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. */ + GetServerCert: () => Promise; + /** Get the Encrypted Algorithm Used for VPN Communication. Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. */ + GetServerCipher: () => Promise; + /** Set the Encrypted Algorithm Used for VPN Communication. Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. */ + SetServerCipher: (in_param: VpnRpcStr) => Promise; + /** Create New Virtual Hub. Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. */ + CreateHub: (in_param: VpnRpcCreateHub) => Promise; + /** Set the Virtual Hub configuration. You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. */ + SetHub: (in_param: VpnRpcCreateHub) => Promise; + /** Get the Virtual Hub configuration. You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. */ + GetHub: (in_param: VpnRpcCreateHub) => Promise; + /** Get List of Virtual Hubs. Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. */ + EnumHub: () => Promise; + /** Delete Virtual Hub. Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. */ + DeleteHub: (in_param: VpnRpcDeleteHub) => Promise; + /** Get Setting of RADIUS Server Used for User Authentication. Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetHubRadius: (in_param: VpnRpcRadius) => Promise; + /** Set RADIUS Server to use for User Authentication. To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetHubRadius: (in_param: VpnRpcRadius) => Promise; + /** Get List of TCP Connections Connecting to the VPN Server. Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. */ + EnumConnection: () => Promise; + /** Disconnect TCP Connections Connecting to the VPN Server. Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. */ + DisconnectConnection: (in_param: VpnRpcDisconnectConnection) => Promise; + /** Get Information of TCP Connections Connecting to the VPN Server. Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. */ + GetConnectionInfo: (in_param: VpnRpcConnectionInfo) => Promise; + /** Switch Virtual Hub to Online or Offline. Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetHubOnline: (in_param: VpnRpcSetHubOnline) => Promise; + /** Get Current Status of Virtual Hub. Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. */ + GetHubStatus: (in_param: VpnRpcHubStatus) => Promise; + /** Set the logging configuration of the Virtual Hub. Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. */ + SetHubLog: (in_param: VpnRpcHubLog) => Promise; + /** Get the logging configuration of the Virtual Hub. Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. */ + GetHubLog: (in_param: VpnRpcHubLog) => Promise; + /** Add Trusted CA Certificate. Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + AddCa: (in_param: VpnRpcHubAddCA) => Promise; + /** Get List of Trusted CA Certificates. Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + EnumCa: (in_param: VpnRpcHubEnumCA) => Promise; + /** Get Trusted CA Certificate. Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + GetCa: (in_param: VpnRpcHubGetCA) => Promise; + /** Delete Trusted CA Certificate. Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + DeleteCa: (in_param: VpnRpcHubDeleteCA) => Promise; + /** Create New Cascade Connection. Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + CreateLink: (in_param: VpnRpcCreateLink) => Promise; + /** Get the Cascade Connection Setting. Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetLink: (in_param: VpnRpcCreateLink) => Promise; + /** Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. */ + SetLink: (in_param: VpnRpcCreateLink) => Promise; + /** Get List of Cascade Connections. Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + EnumLink: (in_param: VpnRpcEnumLink) => Promise; + /** Switch Cascade Connection to Online Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetLinkOnline: (in_param: VpnRpcLink) => Promise; + /** Switch Cascade Connection to Offline Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetLinkOffline: (in_param: VpnRpcLink) => Promise; + /** Delete Cascade Connection Setting. Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + DeleteLink: (in_param: VpnRpcLink) => Promise; + /** Change Name of Cascade Connection. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + RenameLink: (in_param: VpnRpcRenameLink) => Promise; + /** Get Current Cascade Connection Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetLinkStatus: (in_param: VpnRpcLinkStatus) => Promise; + /** Add Access List Rule. Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + AddAccess: (in_param: VpnRpcAddAccess) => Promise; + /** Delete Rule from Access List. Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + DeleteAccess: (in_param: VpnRpcDeleteAccess) => Promise; + /** Get Access List Rule List. Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + EnumAccess: (in_param: VpnRpcEnumAccessList) => Promise; + /** Replace all access lists on a single bulk API call. This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. */ + SetAccessList: (in_param: VpnRpcEnumAccessList) => Promise; + /** Create a user. Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + CreateUser: (in_param: VpnRpcSetUser) => Promise; + /** Change User Settings. Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + SetUser: (in_param: VpnRpcSetUser) => Promise; + /** Get User Settings. Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + GetUser: (in_param: VpnRpcSetUser) => Promise; + /** Delete a user. Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + DeleteUser: (in_param: VpnRpcDeleteUser) => Promise; + /** Get List of Users. Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + EnumUser: (in_param: VpnRpcEnumUser) => Promise; + /** Create Group. Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + CreateGroup: (in_param: VpnRpcSetGroup) => Promise; + /** Set group settings. Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + SetGroup: (in_param: VpnRpcSetGroup) => Promise; + /** Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + GetGroup: (in_param: VpnRpcSetGroup) => Promise; + /** Delete User from Group. Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + DeleteGroup: (in_param: VpnRpcDeleteUser) => Promise; + /** Get List of Groups. Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + EnumGroup: (in_param: VpnRpcEnumGroup) => Promise; + /** Get List of Connected VPN Sessions. Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. */ + EnumSession: (in_param: VpnRpcEnumSession) => Promise; + /** Get Session Status. Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. */ + GetSessionStatus: (in_param: VpnRpcSessionStatus) => Promise; + /** Disconnect Session. Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. */ + DeleteSession: (in_param: VpnRpcDeleteSession) => Promise; + /** Get the MAC Address Table Database. Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. */ + EnumMacTable: (in_param: VpnRpcEnumMacTable) => Promise; + /** Delete MAC Address Table Entry. Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. */ + DeleteMacTable: (in_param: VpnRpcDeleteTable) => Promise; + /** Get the IP Address Table Database. Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. */ + EnumIpTable: (in_param: VpnRpcEnumIpTable) => Promise; + /** Delete IP Address Table Entry. Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. */ + DeleteIpTable: (in_param: VpnRpcDeleteTable) => Promise; + /** Set the Keep Alive Internet Connection Function. Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. */ + SetKeep: (in_param: VpnRpcKeep) => Promise; + /** Get the Keep Alive Internet Connection Function. Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. */ + GetKeep: (in_param: VpnRpcKeep) => Promise; + /** Enable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + EnableSecureNAT: (in_param: VpnRpcHub) => Promise; + /** Disable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + DisableSecureNAT: (in_param: VpnRpcHub) => Promise; + /** Change Settings of SecureNAT Function. Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetSecureNATOption: (in_param: VpnVhOption) => Promise; + /** Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. */ + GetSecureNATOption: (in_param: VpnVhOption) => Promise; + /** Get Virtual NAT Function Session Table of SecureNAT Function. Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + EnumNAT: (in_param: VpnRpcEnumNat) => Promise; + /** Get Virtual DHCP Server Function Lease Table of SecureNAT Function. Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + EnumDHCP: (in_param: VpnRpcEnumDhcp) => Promise; + /** Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetSecureNATStatus: (in_param: VpnRpcNatStatus) => Promise; + /** Get List of Network Adapters Usable as Local Bridge. Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. */ + EnumEthernet: () => Promise; + /** Create Local Bridge Connection. Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. */ + AddLocalBridge: (in_param: VpnRpcLocalBridge) => Promise; + /** Delete Local Bridge Connection. Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. */ + DeleteLocalBridge: (in_param: VpnRpcLocalBridge) => Promise; + /** Get List of Local Bridge Connection. Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. */ + EnumLocalBridge: () => Promise; + /** Get whether the localbridge function is supported on the current system. */ + GetBridgeSupport: () => Promise; + /** Reboot VPN Server Service. Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. */ + RebootServer: (in_param: VpnRpcTest) => Promise; + /** Get List of Server Functions / Capability. Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. */ + GetCaps: () => Promise; + /** Get the current configuration of the VPN Server. Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. */ + GetConfig: () => Promise; + /** Write Configuration File to VPN Server. Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. */ + SetConfig: (in_param: VpnRpcConfig) => Promise; + /** Get Virtual Hub Administration Option default values. */ + GetDefaultHubAdminOptions: (in_param: VpnRpcAdminOption) => Promise; + /** Get List of Virtual Hub Administration Options. Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + GetHubAdminOptions: (in_param: VpnRpcAdminOption) => Promise; + /** Set Values of Virtual Hub Administration Options. Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + SetHubAdminOptions: (in_param: VpnRpcAdminOption) => Promise; + /** Get List of Virtual Hub Extended Options. Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + GetHubExtOptions: (in_param: VpnRpcAdminOption) => Promise; + /** Set a Value of Virtual Hub Extended Options. Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + SetHubExtOptions: (in_param: VpnRpcAdminOption) => Promise; + /** Define New Virtual Layer 3 Switch. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + AddL3Switch: (in_param: VpnRpcL3Sw) => Promise; + /** Delete Virtual Layer 3 Switch. Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + DelL3Switch: (in_param: VpnRpcL3Sw) => Promise; + /** Get List of Virtual Layer 3 Switches. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + EnumL3Switch: () => Promise; + /** Start Virtual Layer 3 Switch Operation. Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + StartL3Switch: (in_param: VpnRpcL3Sw) => Promise; + /** Stop Virtual Layer 3 Switch Operation. Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. */ + StopL3Switch: (in_param: VpnRpcL3Sw) => Promise; + /** Add Virtual Interface to Virtual Layer 3 Switch. Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + AddL3If: (in_param: VpnRpcL3If) => Promise; + /** Delete Virtual Interface of Virtual Layer 3 Switch. Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + DelL3If: (in_param: VpnRpcL3If) => Promise; + /** Get List of Interfaces Registered on the Virtual Layer 3 Switch. Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + EnumL3If: (in_param: VpnRpcEnumL3If) => Promise; + /** Add Routing Table Entry for Virtual Layer 3 Switch. Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + AddL3Table: (in_param: VpnRpcL3Table) => Promise; + /** Delete Routing Table Entry of Virtual Layer 3 Switch. Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + DelL3Table: (in_param: VpnRpcL3Table) => Promise; + /** Get List of Routing Tables of Virtual Layer 3 Switch. Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + EnumL3Table: (in_param: VpnRpcEnumL3Table) => Promise; + /** Get List of Certificates Revocation List. Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + EnumCrl: (in_param: VpnRpcEnumCrl) => Promise; + /** Add a Revoked Certificate. Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + AddCrl: (in_param: VpnRpcCrl) => Promise; + /** Delete a Revoked Certificate. Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + DelCrl: (in_param: VpnRpcCrl) => Promise; + /** Get a Revoked Certificate. Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetCrl: (in_param: VpnRpcCrl) => Promise; + /** Change Existing CRL (Certificate Revocation List) Entry. Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetCrl: (in_param: VpnRpcCrl) => Promise; + /** Add Rule to Source IP Address Limit List. Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetAcList: (in_param: VpnRpcAcList) => Promise; + /** Get List of Rule Items of Source IP Address Limit List. Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetAcList: (in_param: VpnRpcAcList) => Promise; + /** Get List of Log Files. Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. */ + EnumLogFile: () => Promise; + /** Download a part of Log File. Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. */ + ReadLogFile: (in_param: VpnRpcReadLogFile) => Promise; + /** Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use. */ + SetSysLog: (in_param: VpnSyslogSetting) => Promise; + /** Get syslog Send Function. This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. */ + GetSysLog: (in_param: VpnSyslogSetting) => Promise; + /** Set Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. */ + SetHubMsg: (in_param: VpnRpcMsg) => Promise; + /** Get Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. */ + GetHubMsg: (in_param: VpnRpcMsg) => Promise; + /** Raise a vital error on the VPN Server / Bridge to terminate the process forcefully. This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. */ + Crash: (in_param: VpnRpcTest) => Promise; + /** Get the message for administrators. */ + GetAdminMsg: () => Promise; + /** Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. */ + Flush: (in_param: VpnRpcTest) => Promise; + /** Enable or Disable IPsec VPN Server Function. Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetIPsecServices: (in_param: VpnIPsecServices) => Promise; + /** Get the Current IPsec VPN Server Settings. Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetIPsecServices: () => Promise; + /** Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices. Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + AddEtherIpId: (in_param: VpnEtherIpId) => Promise; + /** Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetEtherIpId: (in_param: VpnEtherIpId) => Promise; + /** Delete an EtherIP / L2TPv3 over IPsec Client Setting. This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + DeleteEtherIpId: (in_param: VpnEtherIpId) => Promise; + /** Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + EnumEtherIpId: () => Promise; + /** Set Settings for OpenVPN Clone Server Function. The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetOpenVpnSstpConfig: (in_param: VpnOpenVpnSstpConfig) => Promise; + /** Get the Current Settings of OpenVPN Clone Server Function. Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetOpenVpnSstpConfig: () => Promise; + /** Show the Current Status of Dynamic DNS Function. Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + GetDDnsClientStatus: () => Promise; + /** Set the Dynamic DNS Hostname. You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + ChangeDDnsClientHostname: (in_param: VpnRpcTest) => Promise; + /** Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server. You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + RegenerateServerCert: (in_param: VpnRpcTest) => Promise; + /** Generate a Sample Setting File for OpenVPN Client. Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + MakeOpenVpnConfigFile: () => Promise; + /** Enable / Disable the VPN over ICMP / VPN over DNS Server Function. You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + SetSpecialListener: (in_param: VpnRpcSpecialListener) => Promise; + /** Get Current Setting of the VPN over ICMP / VPN over DNS Function. Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + GetSpecialListener: () => Promise; + /** Show the current status of VPN Azure function. Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + GetAzureStatus: () => Promise; + /** Enable / Disable VPN Azure Function. Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + SetAzureStatus: (in_param: VpnRpcAzureStatus) => Promise; + /** Get the Proxy Settings for Connecting to the DDNS server. */ + GetDDnsInternetSettng: () => Promise; + /** Set the Proxy Settings for Connecting to the DDNS server. */ + SetDDnsInternetSettng: (in_param: VpnInternetSetting) => Promise; + /** Set the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */ + SetVgsConfig: (in_param: VpnVgsConfig) => Promise; + /** Get the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */ + GetVgsConfig: () => Promise; + /** Call a RPC procedure */ + CallAsync(method_name: string, request: T): Promise; +} +/** IP Protocol Numbers */ +export declare enum VpnIpProtocolNumber { + /** ICMP for IPv4 */ + ICMPv4 = 1, + /** TCP */ + TCP = 6, + /** UDP */ + UDP = 17, + /** ICMP for IPv6 */ + ICMPv6 = 58 +} +/** The body of the Access list */ +export declare class VpnAccess { + /** ID */ + Id_u32: number; + /** Specify a description (note) for this rule */ + Note_utf: string; + /** Enabled flag (true: enabled, false: disabled) */ + Active_bool: boolean; + /** Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. */ + Priority_u32: number; + /** The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. */ + Discard_bool: boolean; + /** The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. */ + IsIPv6_bool: boolean; + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. */ + SrcIpAddress_ip: string; + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. */ + SrcSubnetMask_ip: string; + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. */ + DestIpAddress_ip: string; + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. */ + DestSubnetMask_ip: string; + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. */ + SrcIpAddress6_bin: Uint8Array; + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. */ + SrcSubnetMask6_bin: Uint8Array; + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. */ + DestIpAddress6_bin: Uint8Array; + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. */ + DestSubnetMask6_bin: Uint8Array; + /** The IP protocol number */ + Protocol_u32: VpnIpProtocolNumber; + /** The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + SrcPortStart_u32: number; + /** The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + SrcPortEnd_u32: number; + /** The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + DestPortStart_u32: number; + /** The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + DestPortEnd_u32: number; + /** Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. */ + SrcUsername_str: string; + /** Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. */ + DestUsername_str: string; + /** Specify true if you want to check the source MAC address. */ + CheckSrcMac_bool: boolean; + /** Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */ + SrcMacAddress_bin: Uint8Array; + /** Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */ + SrcMacMask_bin: Uint8Array; + /** Specify true if you want to check the destination MAC address. */ + CheckDstMac_bool: boolean; + /** Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */ + DstMacAddress_bin: Uint8Array; + /** Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */ + DstMacMask_bin: Uint8Array; + /** Specify true if you want to check the state of the TCP connection. */ + CheckTcpState_bool: boolean; + /** Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. */ + Established_bool: boolean; + /** Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. */ + Delay_u32: number; + /** Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. */ + Jitter_u32: number; + /** Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. */ + Loss_u32: number; + /** The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. */ + RedirectUrl_str: string; + /** Constructor for the 'VpnAccess' class: The body of the Access list */ + constructor(init?: Partial); +} +/** Add an item to Access List */ +export declare class VpnRpcAddAccess { + /** The Virtual Hub name */ + HubName_str: string; + /** Access list (Must be a single item) */ + AccessListSingle: VpnAccess[]; + /** Constructor for the 'VpnRpcAddAccess' class: Add an item to Access List */ + constructor(init?: Partial); +} +/** Add CA to HUB */ +export declare class VpnRpcHubAddCA { + /** The Virtual Hub name */ + HubName_str: string; + /** The body of the X.509 certificate */ + Cert_bin: Uint8Array; + /** Constructor for the 'VpnRpcHubAddCA' class: Add CA to HUB */ + constructor(init?: Partial); +} +/** CRL entry */ +export declare class VpnRpcCrl { + /** The Virtual Hub name */ + HubName_str: string; + /** Key ID */ + Key_u32: number; + /** CN, optional */ + CommonName_utf: string; + /** O, optional */ + Organization_utf: string; + /** OU, optional */ + Unit_utf: string; + /** C, optional */ + Country_utf: string; + /** ST, optional */ + State_utf: string; + /** L, optional */ + Local_utf: string; + /** Serial, optional */ + Serial_bin: Uint8Array; + /** MD5 Digest, optional */ + DigestMD5_bin: Uint8Array; + /** SHA1 Digest, optional */ + DigestSHA1_bin: Uint8Array; + /** Constructor for the 'VpnRpcCrl' class: CRL entry */ + constructor(init?: Partial); +} +/** EtherIP key list entry */ +export declare class VpnEtherIpId { + /** Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. */ + Id_str: string; + /** Specify the name of the Virtual Hub to connect. */ + HubName_str: string; + /** Specify the username to login to the destination Virtual Hub. */ + UserName_str: string; + /** Specify the password to login to the destination Virtual Hub. */ + Password_str: string; + /** Constructor for the 'VpnEtherIpId' class: EtherIP key list entry */ + constructor(init?: Partial); +} +/** Layer-3 virtual interface */ +export declare class VpnRpcL3If { + /** L3 switch name */ + Name_str: string; + /** Virtual HUB name */ + HubName_str: string; + /** IP address */ + IpAddress_ip: string; + /** Subnet mask */ + SubnetMask_ip: string; + /** Constructor for the 'VpnRpcL3If' class: Layer-3 virtual interface */ + constructor(init?: Partial); +} +/** Layer-3 switch */ +export declare class VpnRpcL3Sw { + /** Layer-3 Switch name */ + Name_str: string; + /** Constructor for the 'VpnRpcL3Sw' class: Layer-3 switch */ + constructor(init?: Partial); +} +/** Routing table */ +export declare class VpnRpcL3Table { + /** L3 switch name */ + Name_str: string; + /** Network address */ + NetworkAddress_ip: string; + /** Subnet mask */ + SubnetMask_ip: string; + /** Gateway address */ + GatewayAddress_ip: string; + /** Metric */ + Metric_u32: number; + /** Constructor for the 'VpnRpcL3Table' class: Routing table */ + constructor(init?: Partial); +} +/** Generic parameter to contain u32, u64, ascii_string and unicode string */ +export declare class VpnRpcTest { + /** A 32-bit integer field */ + IntValue_u32: number; + /** A 64-bit integer field */ + Int64Value_u64: number; + /** An Ascii string field */ + StrValue_str: string; + /** An UTF-8 string field */ + UniStrValue_utf: string; + /** Constructor for the 'VpnRpcTest' class: Generic parameter to contain u32, u64, ascii_string and unicode string */ + constructor(init?: Partial); +} +/** Local Bridge list item */ +export declare class VpnRpcLocalBridge { + /** Physical Ethernet device name */ + DeviceName_str: string; + /** The Virtual Hub name */ + HubNameLB_str: string; + /** Online flag */ + Online_bool: boolean; + /** Running flag */ + Active_bool: boolean; + /** Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). */ + TapMode_bool: boolean; + /** Constructor for the 'VpnRpcLocalBridge' class: Local Bridge list item */ + constructor(init?: Partial); +} +/** Create, configure, and get the group */ +export declare class VpnRpcSetGroup { + /** The Virtual Hub name */ + HubName_str: string; + /** The group name */ + Name_str: string; + /** Optional real name (full name) of the group, allow using any Unicode characters */ + Realname_utf: string; + /** Optional, specify a description of the group */ + Note_utf: string; + /** Number of broadcast packets (Recv) */ + ["Recv.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Recv) */ + ["Recv.BroadcastCount_u64"]: number; + /** Unicast count (Recv) */ + ["Recv.UnicastBytes_u64"]: number; + /** Unicast bytes (Recv) */ + ["Recv.UnicastCount_u64"]: number; + /** Number of broadcast packets (Send) */ + ["Send.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Send) */ + ["Send.BroadcastCount_u64"]: number; + /** Unicast bytes (Send) */ + ["Send.UnicastBytes_u64"]: number; + /** Unicast bytes (Send) */ + ["Send.UnicastCount_u64"]: number; + /** The flag whether to use security policy */ + UsePolicy_bool: boolean; + /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */ + ["policy:Access_bool"]: boolean; + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + ["policy:DHCPFilter_bool"]: boolean; + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + ["policy:DHCPNoServer_bool"]: boolean; + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + ["policy:DHCPForce_bool"]: boolean; + /** Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. */ + ["policy:NoBridge_bool"]: boolean; + /** Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + ["policy:NoRouting_bool"]: boolean; + /** Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + ["policy:CheckMac_bool"]: boolean; + /** Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + ["policy:CheckIP_bool"]: boolean; + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + ["policy:ArpDhcpOnly_bool"]: boolean; + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + ["policy:PrivacyFilter_bool"]: boolean; + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + ["policy:NoServer_bool"]: boolean; + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + ["policy:NoBroadcastLimiter_bool"]: boolean; + /** Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. */ + ["policy:MonitorPort_bool"]: boolean; + /** Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. */ + ["policy:MaxConnection_u32"]: number; + /** Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. */ + ["policy:TimeOut_u32"]: number; + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + ["policy:MaxMac_u32"]: number; + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + ["policy:MaxIP_u32"]: number; + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + ["policy:MaxUpload_u32"]: number; + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + ["policy:MaxDownload_u32"]: number; + /** Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. */ + ["policy:FixPassword_bool"]: boolean; + /** Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. */ + ["policy:MultiLogins_u32"]: number; + /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */ + ["policy:NoQoS_bool"]: boolean; + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + ["policy:RSandRAFilter_bool"]: boolean; + /** Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. */ + ["policy:RAFilter_bool"]: boolean; + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + ["policy:DHCPv6Filter_bool"]: boolean; + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + ["policy:DHCPv6NoServer_bool"]: boolean; + /** Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + ["policy:NoRoutingV6_bool"]: boolean; + /** Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + ["policy:CheckIPv6_bool"]: boolean; + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + ["policy:NoServerV6_bool"]: boolean; + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + ["policy:MaxIPv6_u32"]: number; + /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + ["policy:NoSavePassword_bool"]: boolean; + /** Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + ["policy:AutoDisconnect_u32"]: number; + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + ["policy:FilterIPv4_bool"]: boolean; + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + ["policy:FilterIPv6_bool"]: boolean; + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + ["policy:FilterNonIP_bool"]: boolean; + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean; + /** Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: boolean; + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + ["policy:VLanId_u32"]: number; + /** Security policy: Whether version 3.0 (must be true) */ + ["policy:Ver3_bool"]: boolean; + /** Constructor for the 'VpnRpcSetGroup' class: Create, configure, and get the group */ + constructor(init?: Partial); +} +/** Hub types */ +export declare enum VpnRpcHubType { + /** Stand-alone HUB */ + Standalone = 0, + /** Static HUB */ + FarmStatic = 1, + /** Dynamic HUB */ + FarmDynamic = 2 +} +/** Create a HUB */ +export declare class VpnRpcCreateHub { + /** Specify the name of the Virtual Hub to create / update. */ + HubName_str: string; + /** Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. */ + AdminPasswordPlainText_str: string; + /** Online flag */ + Online_bool: boolean; + /** Maximum number of VPN sessions */ + MaxSession_u32: number; + /** No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. */ + NoEnum_bool: boolean; + /** Type of the Virtual Hub (Valid only for Clustered VPN Servers) */ + HubType_u32: VpnRpcHubType; + /** Constructor for the 'VpnRpcCreateHub' class: Create a HUB */ + constructor(init?: Partial); +} +export declare enum VpnRpcClientAuthType { + /** Anonymous authentication */ + Anonymous = 0, + /** SHA-0 hashed password authentication */ + SHA0_Hashed_Password = 1, + /** Plain password authentication */ + PlainPassword = 2, + /** Certificate authentication */ + Cert = 3 +} +/** Create and set of link */ +export declare class VpnRpcCreateLink { + /** The Virtual Hub name */ + HubName_Ex_str: string; + /** Online flag */ + Online_bool: boolean; + /** The flag to enable validation for the server certificate */ + CheckServerCert_bool: boolean; + /** The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. */ + ServerCert_bin: Uint8Array; + /** Client Option Parameters: Specify the name of the Cascade Connection */ + AccountName_utf: string; + /** Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. */ + Hostname_str: string; + /** Client Option Parameters: Specify the port number of the destination VPN Server. */ + Port_u32: number; + /** Client Option Parameters: The type of the proxy server */ + ProxyType_u32: VpnRpcProxyType; + /** Client Option Parameters: The hostname or IP address of the proxy server name */ + ProxyName_str: string; + /** Client Option Parameters: The port number of the proxy server */ + ProxyPort_u32: number; + /** Client Option Parameters: The username to connect to the proxy server */ + ProxyUsername_str: string; + /** Client Option Parameters: The password to connect to the proxy server */ + ProxyPassword_str: string; + /** Client Option Parameters: The Virtual Hub on the destination VPN Server */ + HubName_str: string; + /** Client Option Parameters: Number of TCP Connections to Use in VPN Communication */ + MaxConnection_u32: number; + /** Client Option Parameters: The flag to enable the encryption on the communication */ + UseEncrypt_bool: boolean; + /** Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection */ + UseCompress_bool: boolean; + /** Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. */ + HalfConnection_bool: boolean; + /** Client Option Parameters: Connection attempt interval when additional connection will be established */ + AdditionalConnectionInterval_u32: number; + /** Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) */ + ConnectionDisconnectSpan_u32: number; + /** Client Option Parameters: Disable QoS Control Function if the value is true */ + DisableQoS_bool: boolean; + /** Client Option Parameters: Do not use TLS 1.x of the value is true */ + NoTls1_bool: boolean; + /** Client Option Parameters: Do not use UDP acceleration mode if the value is true */ + NoUdpAcceleration_bool: boolean; + /** Authentication type */ + AuthType_u32: VpnRpcClientAuthType; + /** User name */ + Username_str: string; + /** SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). */ + HashedPassword_bin: Uint8Array; + /** Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). */ + PlainPassword_str: string; + /** Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */ + ClientX_bin: Uint8Array; + /** Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */ + ClientK_bin: Uint8Array; + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + ["policy:DHCPFilter_bool"]: boolean; + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + ["policy:DHCPNoServer_bool"]: boolean; + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + ["policy:DHCPForce_bool"]: boolean; + /** Security policy: Prohibit the duplicate MAC address */ + SecPol_CheckMac_bool: boolean; + /** Security policy: Prohibit a duplicate IP address (IPv4) */ + SecPol_CheckIP_bool: boolean; + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + ["policy:ArpDhcpOnly_bool"]: boolean; + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + ["policy:PrivacyFilter_bool"]: boolean; + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + ["policy:NoServer_bool"]: boolean; + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + ["policy:NoBroadcastLimiter_bool"]: boolean; + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + ["policy:MaxMac_u32"]: number; + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + ["policy:MaxIP_u32"]: number; + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + ["policy:MaxUpload_u32"]: number; + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + ["policy:MaxDownload_u32"]: number; + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + ["policy:RSandRAFilter_bool"]: boolean; + /** Security policy: Filter the router advertisement packet (IPv6) */ + SecPol_RAFilter_bool: boolean; + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + ["policy:DHCPv6Filter_bool"]: boolean; + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + ["policy:DHCPv6NoServer_bool"]: boolean; + /** Security policy: Prohibit the duplicate IP address (IPv6) */ + SecPol_CheckIPv6_bool: boolean; + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + ["policy:NoServerV6_bool"]: boolean; + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + ["policy:MaxIPv6_u32"]: number; + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + ["policy:FilterIPv4_bool"]: boolean; + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + ["policy:FilterIPv6_bool"]: boolean; + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + ["policy:FilterNonIP_bool"]: boolean; + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean; + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + ["policy:VLanId_u32"]: number; + /** Security policy: Whether version 3.0 (must be true) */ + ["policy:Ver3_bool"]: boolean; + /** Constructor for the 'VpnRpcCreateLink' class: Create and set of link */ + constructor(init?: Partial); +} +/** Listener */ +export declare class VpnRpcListener { + /** Port number (Range: 1 - 65535) */ + Port_u32: number; + /** Active state */ + Enable_bool: boolean; + /** Constructor for the 'VpnRpcListener' class: Listener */ + constructor(init?: Partial); +} +/** User authentication type (server side) */ +export declare enum VpnRpcUserAuthType { + /** Anonymous authentication */ + Anonymous = 0, + /** Password authentication */ + Password = 1, + /** User certificate authentication */ + UserCert = 2, + /** Root certificate which is issued by trusted Certificate Authority */ + RootCert = 3, + /** Radius authentication */ + Radius = 4, + /** Windows NT authentication */ + NTDomain = 5 +} +/** Create, configure, and get the user */ +export declare class VpnRpcSetUser { + /** The Virtual Hub name */ + HubName_str: string; + /** Specify the user name of the user */ + Name_str: string; + /** Assigned group name for the user */ + GroupName_str: string; + /** Optional real name (full name) of the user, allow using any Unicode characters */ + Realname_utf: string; + /** Optional User Description */ + Note_utf: string; + /** Creation date and time */ + CreatedTime_dt: Date; + /** Last modified date and time */ + UpdatedTime_dt: Date; + /** Expiration date and time */ + ExpireTime_dt: Date; + /** Authentication method of the user */ + AuthType_u32: VpnRpcUserAuthType; + /** User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. */ + Auth_Password_str: string; + /** User certificate, valid only if AuthType_u32 == UserCert(2). */ + UserX_bin: Uint8Array; + /** Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). */ + Serial_bin: Uint8Array; + /** Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). */ + CommonName_utf: string; + /** Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). */ + RadiusUsername_utf: string; + /** Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). */ + NtUsername_utf: string; + /** Number of total logins of the user */ + NumLogin_u32: number; + /** Number of broadcast packets (Recv) */ + ["Recv.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Recv) */ + ["Recv.BroadcastCount_u64"]: number; + /** Unicast count (Recv) */ + ["Recv.UnicastBytes_u64"]: number; + /** Unicast bytes (Recv) */ + ["Recv.UnicastCount_u64"]: number; + /** Number of broadcast packets (Send) */ + ["Send.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Send) */ + ["Send.BroadcastCount_u64"]: number; + /** Unicast bytes (Send) */ + ["Send.UnicastBytes_u64"]: number; + /** Unicast bytes (Send) */ + ["Send.UnicastCount_u64"]: number; + /** The flag whether to use security policy */ + UsePolicy_bool: boolean; + /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */ + ["policy:Access_bool"]: boolean; + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + ["policy:DHCPFilter_bool"]: boolean; + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + ["policy:DHCPNoServer_bool"]: boolean; + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + ["policy:DHCPForce_bool"]: boolean; + /** Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. */ + ["policy:NoBridge_bool"]: boolean; + /** Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + ["policy:NoRouting_bool"]: boolean; + /** Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + ["policy:CheckMac_bool"]: boolean; + /** Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + ["policy:CheckIP_bool"]: boolean; + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + ["policy:ArpDhcpOnly_bool"]: boolean; + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + ["policy:PrivacyFilter_bool"]: boolean; + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + ["policy:NoServer_bool"]: boolean; + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + ["policy:NoBroadcastLimiter_bool"]: boolean; + /** Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. */ + ["policy:MonitorPort_bool"]: boolean; + /** Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. */ + ["policy:MaxConnection_u32"]: number; + /** Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. */ + ["policy:TimeOut_u32"]: number; + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + ["policy:MaxMac_u32"]: number; + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + ["policy:MaxIP_u32"]: number; + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + ["policy:MaxUpload_u32"]: number; + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + ["policy:MaxDownload_u32"]: number; + /** Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. */ + ["policy:FixPassword_bool"]: boolean; + /** Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. */ + ["policy:MultiLogins_u32"]: number; + /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */ + ["policy:NoQoS_bool"]: boolean; + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + ["policy:RSandRAFilter_bool"]: boolean; + /** Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. */ + ["policy:RAFilter_bool"]: boolean; + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + ["policy:DHCPv6Filter_bool"]: boolean; + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + ["policy:DHCPv6NoServer_bool"]: boolean; + /** Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + ["policy:NoRoutingV6_bool"]: boolean; + /** Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + ["policy:CheckIPv6_bool"]: boolean; + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + ["policy:NoServerV6_bool"]: boolean; + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + ["policy:MaxIPv6_u32"]: number; + /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + ["policy:NoSavePassword_bool"]: boolean; + /** Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + ["policy:AutoDisconnect_u32"]: number; + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + ["policy:FilterIPv4_bool"]: boolean; + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + ["policy:FilterIPv6_bool"]: boolean; + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + ["policy:FilterNonIP_bool"]: boolean; + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean; + /** Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: boolean; + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + ["policy:VLanId_u32"]: number; + /** Security policy: Whether version 3.0 (must be true) */ + ["policy:Ver3_bool"]: boolean; + /** Constructor for the 'VpnRpcSetUser' class: Create, configure, and get the user */ + constructor(init?: Partial); +} +/** Delete the access list */ +export declare class VpnRpcDeleteAccess { + /** The Virtual Hub name */ + HubName_str: string; + /** ID */ + Id_u32: number; + /** Constructor for the 'VpnRpcDeleteAccess' class: Delete the access list */ + constructor(init?: Partial); +} +/** Delete the CA of HUB */ +export declare class VpnRpcHubDeleteCA { + /** The Virtual Hub name */ + HubName_str: string; + /** Certificate key id to be deleted */ + Key_u32: number; + /** Constructor for the 'VpnRpcHubDeleteCA' class: Delete the CA of HUB */ + constructor(init?: Partial); +} +/** Deleting a user or group */ +export declare class VpnRpcDeleteUser { + /** The Virtual Hub name */ + HubName_str: string; + /** User or group name */ + Name_str: string; + /** Constructor for the 'VpnRpcDeleteUser' class: Deleting a user or group */ + constructor(init?: Partial); +} +/** Delete the HUB */ +export declare class VpnRpcDeleteHub { + /** The Virtual Hub name */ + HubName_str: string; + /** Constructor for the 'VpnRpcDeleteHub' class: Delete the HUB */ + constructor(init?: Partial); +} +/** Delete the table */ +export declare class VpnRpcDeleteTable { + /** The Virtual Hub name */ + HubName_str: string; + /** Key ID */ + Key_u32: number; + /** Constructor for the 'VpnRpcDeleteTable' class: Delete the table */ + constructor(init?: Partial); +} +/** Specify the Link */ +export declare class VpnRpcLink { + /** The Virtual Hub name */ + HubName_str: string; + /** The name of the cascade connection */ + AccountName_utf: string; + /** Constructor for the 'VpnRpcLink' class: Specify the Link */ + constructor(init?: Partial); +} +/** Disconnect the session */ +export declare class VpnRpcDeleteSession { + /** The Virtual Hub name */ + HubName_str: string; + /** Session name */ + Name_str: string; + /** Constructor for the 'VpnRpcDeleteSession' class: Disconnect the session */ + constructor(init?: Partial); +} +/** Specify the HUB */ +export declare class VpnRpcHub { + /** The Virtual Hub name */ + HubName_str: string; + /** Constructor for the 'VpnRpcHub' class: Specify the HUB */ + constructor(init?: Partial); +} +/** Disconnect a connection */ +export declare class VpnRpcDisconnectConnection { + /** Connection name */ + Name_str: string; + /** Constructor for the 'VpnRpcDisconnectConnection' class: Disconnect a connection */ + constructor(init?: Partial); +} +/** Enumeration of the access list */ +export declare class VpnRpcEnumAccessList { + /** The Virtual Hub name */ + HubName_str: string; + /** Access list */ + AccessList: VpnAccess[]; + /** Constructor for the 'VpnRpcEnumAccessList' class: Enumeration of the access list */ + constructor(init?: Partial); +} +/** CA enumeration items of HUB */ +export declare class VpnRpcHubEnumCAItem { + /** The key id of the item */ + Key_u32: number; + /** Subject */ + SubjectName_utf: string; + /** Issuer */ + IssuerName_utf: string; + /** Expiration date */ + Expires_dt: Date; + /** Constructor for the 'VpnRpcHubEnumCAItem' class: CA enumeration items of HUB */ + constructor(init?: Partial); +} +/** CA enumeration of HUB */ +export declare class VpnRpcHubEnumCA { + /** The Virtual Hub name */ + HubName_str: string; + /** The list of CA */ + CAList: VpnRpcHubEnumCAItem[]; + /** Constructor for the 'VpnRpcHubEnumCA' class: CA enumeration of HUB */ + constructor(init?: Partial); +} +/** Type of connection */ +export declare enum VpnRpcConnectionType { + /** VPN Client */ + Client = 0, + /** During initialization */ + Init = 1, + /** Login connection */ + Login = 2, + /** Additional connection */ + Additional = 3, + /** RPC for server farm */ + FarmRpc = 4, + /** RPC for Management */ + AdminRpc = 5, + /** HUB enumeration */ + EnumHub = 6, + /** Password change */ + Password = 7, + /** SSTP */ + SSTP = 8, + /** OpenVPN */ + OpenVPN = 9 +} +/** Connection enumeration items */ +export declare class VpnRpcEnumConnectionItem { + /** Connection name */ + Name_str: string; + /** Host name */ + Hostname_str: string; + /** IP address */ + Ip_ip: string; + /** Port number */ + Port_u32: number; + /** Connected time */ + ConnectedTime_dt: Date; + /** Connection type */ + Type_u32: VpnRpcConnectionType; + /** Constructor for the 'VpnRpcEnumConnectionItem' class: Connection enumeration items */ + constructor(init?: Partial); +} +/** Connection enumeration */ +export declare class VpnRpcEnumConnection { + /** Number of connections */ + NumConnection_u32: number; + /** Connection list */ + ConnectionList: VpnRpcEnumConnectionItem[]; + /** Constructor for the 'VpnRpcEnumConnection' class: Connection enumeration */ + constructor(init?: Partial); +} +/** Enum CRL Item */ +export declare class VpnRpcEnumCrlItem { + /** Key ID */ + Key_u32: number; + /** The contents of the CRL item */ + CrlInfo_utf: string; + /** Constructor for the 'VpnRpcEnumCrlItem' class: Enum CRL Item */ + constructor(init?: Partial); +} +/** Enum CRL */ +export declare class VpnRpcEnumCrl { + /** The Virtual Hub name */ + HubName_str: string; + /** CRL list */ + CRLList: VpnRpcEnumCrlItem[]; + /** Constructor for the 'VpnRpcEnumCrl' class: Enum CRL */ + constructor(init?: Partial); +} +/** RPC_ENUM_DHCP_ITEM */ +export declare class VpnRpcEnumDhcpItem { + /** ID */ + Id_u32: number; + /** Lease time */ + LeasedTime_dt: Date; + /** Expiration date */ + ExpireTime_dt: Date; + /** MAC address */ + MacAddress_bin: Uint8Array; + /** IP address */ + IpAddress_ip: string; + /** Subnet mask */ + Mask_u32: number; + /** Host name */ + Hostname_str: string; + /** Constructor for the 'VpnRpcEnumDhcpItem' class: RPC_ENUM_DHCP_ITEM */ + constructor(init?: Partial); +} +/** RPC_ENUM_DHCP */ +export declare class VpnRpcEnumDhcp { + /** Virtual Hub Name */ + HubName_str: string; + /** DHCP Item */ + DhcpTable: VpnRpcEnumDhcpItem[]; + /** Constructor for the 'VpnRpcEnumDhcp' class: RPC_ENUM_DHCP */ + constructor(init?: Partial); +} +/** EtherIP setting list */ +export declare class VpnRpcEnumEtherIpId { + /** Setting list */ + Settings: VpnEtherIpId[]; + /** Constructor for the 'VpnRpcEnumEtherIpId' class: EtherIP setting list */ + constructor(init?: Partial); +} +/** Ethernet Network Adapters list item */ +export declare class VpnRpcEnumEthItem { + /** Device name */ + DeviceName_str: string; + /** Network connection name (description) */ + NetworkConnectionName_utf: string; + /** Constructor for the 'VpnRpcEnumEthItem' class: Ethernet Network Adapters list item */ + constructor(init?: Partial); +} +/** Ethernet Network Adapters list */ +export declare class VpnRpcEnumEth { + /** Ethernet Network Adapters list */ + EthList: VpnRpcEnumEthItem[]; + /** Constructor for the 'VpnRpcEnumEth' class: Ethernet Network Adapters list */ + constructor(init?: Partial); +} +/** Server farm members enumeration items */ +export declare class VpnRpcEnumFarmItem { + /** ID */ + Id_u32: number; + /** Controller */ + Controller_bool: boolean; + /** Connection time */ + ConnectedTime_dt: Date; + /** IP address */ + Ip_ip: string; + /** Host name */ + Hostname_str: string; + /** Point */ + Point_u32: number; + /** Number of sessions */ + NumSessions_u32: number; + /** Number of TCP connections */ + NumTcpConnections_u32: number; + /** Number of HUBs */ + NumHubs_u32: number; + /** Number of assigned client licenses */ + AssignedClientLicense_u32: number; + /** Number of assigned bridge licenses */ + AssignedBridgeLicense_u32: number; + /** Constructor for the 'VpnRpcEnumFarmItem' class: Server farm members enumeration items */ + constructor(init?: Partial); +} +/** Server farm member enumeration */ +export declare class VpnRpcEnumFarm { + /** Number of Cluster Members */ + NumFarm_u32: number; + /** Cluster Members list */ + FarmMemberList: VpnRpcEnumFarmItem[]; + /** Constructor for the 'VpnRpcEnumFarm' class: Server farm member enumeration */ + constructor(init?: Partial); +} +/** Enumeration items in the group */ +export declare class VpnRpcEnumGroupItem { + /** User name */ + Name_str: string; + /** Real name */ + Realname_utf: string; + /** Note */ + Note_utf: string; + /** Number of users */ + NumUsers_u32: number; + /** Access denied */ + DenyAccess_bool: boolean; + /** Constructor for the 'VpnRpcEnumGroupItem' class: Enumeration items in the group */ + constructor(init?: Partial); +} +/** Group enumeration */ +export declare class VpnRpcEnumGroup { + /** The Virtual Hub name */ + HubName_str: string; + /** Group list */ + GroupList: VpnRpcEnumGroupItem[]; + /** Constructor for the 'VpnRpcEnumGroup' class: Group enumeration */ + constructor(init?: Partial); +} +/** Enumeration items of HUB */ +export declare class VpnRpcEnumHubItem { + /** The name of the Virtual Hub */ + HubName_str: string; + /** Online state */ + Online_bool: boolean; + /** Type of HUB (Valid only for Clustered VPN Servers) */ + HubType_u32: VpnRpcHubType; + /** Number of users */ + NumUsers_u32: number; + /** Number of registered groups */ + NumGroups_u32: number; + /** Number of registered sessions */ + NumSessions_u32: number; + /** Number of current MAC table entries */ + NumMacTables_u32: number; + /** Number of current IP table entries */ + NumIpTables_u32: number; + /** Last communication date and time */ + LastCommTime_dt: Date; + /** Last login date and time */ + LastLoginTime_dt: Date; + /** Creation date and time */ + CreatedTime_dt: Date; + /** Number of accumulated logins */ + NumLogin_u32: number; + /** Whether the traffic information is provided */ + IsTrafficFilled_bool: boolean; + /** Number of broadcast packets (Recv) */ + ["Ex.Recv.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Recv) */ + ["Ex.Recv.BroadcastCount_u64"]: number; + /** Unicast count (Recv) */ + ["Ex.Recv.UnicastBytes_u64"]: number; + /** Unicast bytes (Recv) */ + ["Ex.Recv.UnicastCount_u64"]: number; + /** Number of broadcast packets (Send) */ + ["Ex.Send.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Send) */ + ["Ex.Send.BroadcastCount_u64"]: number; + /** Unicast bytes (Send) */ + ["Ex.Send.UnicastBytes_u64"]: number; + /** Unicast bytes (Send) */ + ["Ex.Send.UnicastCount_u64"]: number; + /** Constructor for the 'VpnRpcEnumHubItem' class: Enumeration items of HUB */ + constructor(init?: Partial); +} +/** Enumeration of HUB */ +export declare class VpnRpcEnumHub { + /** Number of Virtual Hubs */ + NumHub_u32: number; + /** Virtual Hubs */ + HubList: VpnRpcEnumHubItem[]; + /** Constructor for the 'VpnRpcEnumHub' class: Enumeration of HUB */ + constructor(init?: Partial); +} +/** Enumeration items of IP table */ +export declare class VpnRpcEnumIpTableItem { + /** Key ID */ + Key_u32: number; + /** Session name */ + SessionName_str: string; + /** IP address */ + IpAddress_ip: string; + /** Assigned by the DHCP */ + DhcpAllocated_bool: boolean; + /** Creation date and time */ + CreatedTime_dt: Date; + /** Updating date */ + UpdatedTime_dt: Date; + /** Remote items */ + RemoteItem_bool: boolean; + /** Remote host name */ + RemoteHostname_str: string; + /** Constructor for the 'VpnRpcEnumIpTableItem' class: Enumeration items of IP table */ + constructor(init?: Partial); +} +/** Enumeration of IP table */ +export declare class VpnRpcEnumIpTable { + /** The Virtual Hub name */ + HubName_str: string; + /** MAC table */ + IpTable: VpnRpcEnumIpTableItem[]; + /** Constructor for the 'VpnRpcEnumIpTable' class: Enumeration of IP table */ + constructor(init?: Partial); +} +/** Layer-3 interface enumeration */ +export declare class VpnRpcEnumL3If { + /** Layer-3 switch name */ + Name_str: string; + /** Layer-3 interface list */ + L3IFList: VpnRpcL3If[]; + /** Constructor for the 'VpnRpcEnumL3If' class: Layer-3 interface enumeration */ + constructor(init?: Partial); +} +/** Layer-3 switch enumeration item */ +export declare class VpnRpcEnumL3SwItem { + /** Name of the layer-3 switch */ + Name_str: string; + /** Number of layer-3 switch virtual interfaces */ + NumInterfaces_u32: number; + /** Number of routing tables */ + NumTables_u32: number; + /** Activated flag */ + Active_bool: boolean; + /** Online flag */ + Online_bool: boolean; + /** Constructor for the 'VpnRpcEnumL3SwItem' class: Layer-3 switch enumeration item */ + constructor(init?: Partial); +} +/** Layer-3 switch enumeration */ +export declare class VpnRpcEnumL3Sw { + /** Layer-3 switch list */ + L3SWList: VpnRpcEnumL3SwItem[]; + /** Constructor for the 'VpnRpcEnumL3Sw' class: Layer-3 switch enumeration */ + constructor(init?: Partial); +} +/** Routing table enumeration */ +export declare class VpnRpcEnumL3Table { + /** L3 switch name */ + Name_str: string; + /** Routing table item list */ + L3Table: VpnRpcL3Table[]; + /** Constructor for the 'VpnRpcEnumL3Table' class: Routing table enumeration */ + constructor(init?: Partial); +} +/** Cascade Connection Enumeration */ +export declare class VpnRpcEnumLinkItem { + /** The name of cascade connection */ + AccountName_utf: string; + /** Online flag */ + Online_bool: boolean; + /** The flag indicates whether the cascade connection is established */ + Connected_bool: boolean; + /** The error last occurred if the cascade connection is in the fail state */ + LastError_u32: number; + /** Connection completion time */ + ConnectedTime_dt: Date; + /** Host name of the destination VPN server */ + Hostname_str: string; + /** The Virtual Hub name */ + TargetHubName_str: string; + /** Constructor for the 'VpnRpcEnumLinkItem' class: Cascade Connection Enumeration */ + constructor(init?: Partial); +} +/** Enumeration of the link */ +export declare class VpnRpcEnumLink { + /** The Virtual Hub name */ + HubName_str: string; + /** Number of cascade connections */ + NumLink_u32: number; + /** The list of cascade connections */ + LinkList: VpnRpcEnumLinkItem[]; + /** Constructor for the 'VpnRpcEnumLink' class: Enumeration of the link */ + constructor(init?: Partial); +} +/** List of listeners item */ +export declare class VpnRpcListenerListItem { + /** TCP port number (range: 1 - 65535) */ + Ports_u32: number; + /** Active state */ + Enables_bool: boolean; + /** The flag to indicate if the error occurred on the listener port */ + Errors_bool: boolean; + /** Constructor for the 'VpnRpcListenerListItem' class: List of listeners item */ + constructor(init?: Partial); +} +/** List of listeners */ +export declare class VpnRpcListenerList { + /** List of listener items */ + ListenerList: VpnRpcListenerListItem[]; + /** Constructor for the 'VpnRpcListenerList' class: List of listeners */ + constructor(init?: Partial); +} +/** Local Bridge enumeration */ +export declare class VpnRpcEnumLocalBridge { + /** Local Bridge list */ + LocalBridgeList: VpnRpcLocalBridge[]; + /** Constructor for the 'VpnRpcEnumLocalBridge' class: Local Bridge enumeration */ + constructor(init?: Partial); +} +/** Log file enumeration */ +export declare class VpnRpcEnumLogFileItem { + /** Server name */ + ServerName_str: string; + /** File path */ + FilePath_str: string; + /** File size */ + FileSize_u32: number; + /** Last write date */ + UpdatedTime_dt: Date; + /** Constructor for the 'VpnRpcEnumLogFileItem' class: Log file enumeration */ + constructor(init?: Partial); +} +/** Log file enumeration */ +export declare class VpnRpcEnumLogFile { + /** Log file list */ + LogFiles: VpnRpcEnumLogFileItem[]; + /** Constructor for the 'VpnRpcEnumLogFile' class: Log file enumeration */ + constructor(init?: Partial); +} +/** Enumeration items of the MAC table */ +export declare class VpnRpcEnumMacTableItem { + /** Key ID */ + Key_u32: number; + /** Session name */ + SessionName_str: string; + /** MAC address */ + MacAddress_bin: Uint8Array; + /** Creation date and time */ + CreatedTime_dt: Date; + /** Updating date */ + UpdatedTime_dt: Date; + /** Remote items */ + RemoteItem_bool: boolean; + /** Remote host name */ + RemoteHostname_str: string; + /** VLAN ID */ + VlanId_u32: number; + /** Constructor for the 'VpnRpcEnumMacTableItem' class: Enumeration items of the MAC table */ + constructor(init?: Partial); +} +/** Enumeration of the MAC table */ +export declare class VpnRpcEnumMacTable { + /** The Virtual Hub name */ + HubName_str: string; + /** MAC table */ + MacTable: VpnRpcEnumMacTableItem[]; + /** Constructor for the 'VpnRpcEnumMacTable' class: Enumeration of the MAC table */ + constructor(init?: Partial); +} +/** NAT Entry Protocol Number */ +export declare enum VpnRpcNatProtocol { + /** TCP */ + TCP = 0, + /** UDP */ + UDP = 1, + /** DNS */ + DNS = 2, + /** ICMP */ + ICMP = 3 +} +/** State of NAT session (TCP) */ +export declare enum VpnRpcNatTcpState { + /** Connecting */ + Connecting = 0, + /** Send the RST (Connection failure or disconnected) */ + SendReset = 1, + /** Connection complete */ + Connected = 2, + /** Connection established */ + Established = 3, + /** Wait for socket disconnection */ + WaitDisconnect = 4 +} +/** VpnRpcEnumNat List Item */ +export declare class VpnRpcEnumNatItem { + /** ID */ + Id_u32: number; + /** Protocol */ + Protocol_u32: VpnRpcNatProtocol; + /** Source IP address */ + SrcIp_ip: string; + /** Source host name */ + SrcHost_str: string; + /** Source port number */ + SrcPort_u32: number; + /** Destination IP address */ + DestIp_ip: string; + /** Destination host name */ + DestHost_str: string; + /** Destination port number */ + DestPort_u32: number; + /** Connection time */ + CreatedTime_dt: Date; + /** Last communication time */ + LastCommTime_dt: Date; + /** Transmission size */ + SendSize_u64: number; + /** Receive size */ + RecvSize_u64: number; + /** TCP state */ + TcpStatus_u32: VpnRpcNatTcpState; + /** Constructor for the 'VpnRpcEnumNatItem' class: VpnRpcEnumNat List Item */ + constructor(init?: Partial); +} +/** RPC_ENUM_NAT */ +export declare class VpnRpcEnumNat { + /** Virtual Hub Name */ + HubName_str: string; + /** NAT item */ + NatTable: VpnRpcEnumNatItem[]; + /** Constructor for the 'VpnRpcEnumNat' class: RPC_ENUM_NAT */ + constructor(init?: Partial); +} +/** Enumeration item of VPN session */ +export declare class VpnRpcEnumSessionItem { + /** Session name */ + Name_str: string; + /** Remote session */ + RemoteSession_bool: boolean; + /** Remote server name */ + RemoteHostname_str: string; + /** User name */ + Username_str: string; + /** IP address */ + ClientIP_ip: string; + /** Host name */ + Hostname_str: string; + /** Maximum number of underlying TCP connections */ + MaxNumTcp_u32: number; + /** Number of current underlying TCP connections */ + CurrentNumTcp_u32: number; + /** Packet size transmitted */ + PacketSize_u64: number; + /** Number of packets transmitted */ + PacketNum_u64: number; + /** Is a Cascade VPN session */ + LinkMode_bool: boolean; + /** Is a SecureNAT VPN session */ + SecureNATMode_bool: boolean; + /** Is the VPN session for Local Bridge */ + BridgeMode_bool: boolean; + /** Is a Layer-3 Switch VPN session */ + Layer3Mode_bool: boolean; + /** Is in Bridge Mode */ + Client_BridgeMode_bool: boolean; + /** Is in Monitor Mode */ + Client_MonitorMode_bool: boolean; + /** VLAN ID */ + VLanId_u32: number; + /** Unique ID of the VPN Session */ + UniqueId_bin: Uint8Array; + /** Creation date and time */ + CreatedTime_dt: Date; + /** Last communication date and time */ + LastCommTime_dt: Date; + /** Constructor for the 'VpnRpcEnumSessionItem' class: Enumeration item of VPN session */ + constructor(init?: Partial); +} +/** Enumerate VPN sessions */ +export declare class VpnRpcEnumSession { + /** The Virtual Hub name */ + HubName_str: string; + /** VPN sessions list */ + SessionList: VpnRpcEnumSessionItem[]; + /** Constructor for the 'VpnRpcEnumSession' class: Enumerate VPN sessions */ + constructor(init?: Partial); +} +/** Enumeration item of user */ +export declare class VpnRpcEnumUserItem { + /** User name */ + Name_str: string; + /** Group name */ + GroupName_str: string; + /** Real name */ + Realname_utf: string; + /** Note */ + Note_utf: string; + /** Authentication method */ + AuthType_u32: VpnRpcUserAuthType; + /** Number of logins */ + NumLogin_u32: number; + /** Last login date and time */ + LastLoginTime_dt: Date; + /** Access denied */ + DenyAccess_bool: boolean; + /** Flag of whether the traffic variable is set */ + IsTrafficFilled_bool: boolean; + /** Flag of whether expiration date variable is set */ + IsExpiresFilled_bool: boolean; + /** Expiration date */ + Expires_dt: Date; + /** Number of broadcast packets (Recv) */ + ["Ex.Recv.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Recv) */ + ["Ex.Recv.BroadcastCount_u64"]: number; + /** Unicast count (Recv) */ + ["Ex.Recv.UnicastBytes_u64"]: number; + /** Unicast bytes (Recv) */ + ["Ex.Recv.UnicastCount_u64"]: number; + /** Number of broadcast packets (Send) */ + ["Ex.Send.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Send) */ + ["Ex.Send.BroadcastCount_u64"]: number; + /** Unicast bytes (Send) */ + ["Ex.Send.UnicastBytes_u64"]: number; + /** Unicast bytes (Send) */ + ["Ex.Send.UnicastCount_u64"]: number; + /** Constructor for the 'VpnRpcEnumUserItem' class: Enumeration item of user */ + constructor(init?: Partial); +} +/** Enumeration of user */ +export declare class VpnRpcEnumUser { + /** The Virtual Hub name */ + HubName_str: string; + /** User list */ + UserList: VpnRpcEnumUserItem[]; + /** Constructor for the 'VpnRpcEnumUser' class: Enumeration of user */ + constructor(init?: Partial); +} +/** Source IP Address Limit List Item */ +export declare class VpnAc { + /** ID */ + Id_u32: number; + /** Priority */ + Priority_u32: number; + /** Deny access */ + Deny_bool: boolean; + /** Set true if you want to specify the SubnetMask_ip item. */ + Masked_bool: boolean; + /** IP address */ + IpAddress_ip: string; + /** Subnet mask, valid only if Masked_bool == true */ + SubnetMask_ip: string; + /** Constructor for the 'VpnAc' class: Source IP Address Limit List Item */ + constructor(init?: Partial); +} +/** Source IP Address Limit List */ +export declare class VpnRpcAcList { + /** The Virtual Hub name */ + HubName_str: string; + /** Source IP Address Limit List */ + ACList: VpnAc[]; + /** Constructor for the 'VpnRpcAcList' class: Source IP Address Limit List */ + constructor(init?: Partial); +} +/** Message */ +export declare class VpnRpcMsg { + /** The Virtual Hub name */ + HubName_str: string; + /** Message (Unicode strings acceptable) */ + Msg_bin: Uint8Array; + /** Constructor for the 'VpnRpcMsg' class: Message */ + constructor(init?: Partial); +} +/** Get / Set the Azure state */ +export declare class VpnRpcAzureStatus { + /** Whether VPN Azure Function is Enabled */ + IsEnabled_bool: boolean; + /** Whether connection to VPN Azure Cloud Server is established */ + IsConnected_bool: boolean; + /** Constructor for the 'VpnRpcAzureStatus' class: Get / Set the Azure state */ + constructor(init?: Partial); +} +/** Local Bridge support information */ +export declare class VpnRpcBridgeSupport { + /** Whether the OS supports the Local Bridge function */ + IsBridgeSupportedOs_bool: boolean; + /** Whether WinPcap is necessary to install */ + IsWinPcapNeeded_bool: boolean; + /** Constructor for the 'VpnRpcBridgeSupport' class: Local Bridge support information */ + constructor(init?: Partial); +} +/** Get the CA of HUB */ +export declare class VpnRpcHubGetCA { + /** The Virtual Hub name */ + HubName_str: string; + /** The key id of the certificate */ + Key_u32: number; + /** The body of the X.509 certificate */ + Cert_bin: Uint8Array; + /** Constructor for the 'VpnRpcHubGetCA' class: Get the CA of HUB */ + constructor(init?: Partial); +} +/** Caps item of the VPN Server */ +export declare class VpnCaps { + /** Name */ + CapsName_str: string; + /** Value */ + CapsValue_u32: number; + /** Descrption */ + CapsDescrption_utf: string; + /** Constructor for the 'VpnCaps' class: Caps item of the VPN Server */ + constructor(init?: Partial); +} +/** Caps list of the VPN Server */ +export declare class VpnCapslist { + /** Caps list of the VPN Server */ + CapsList: VpnCaps[]; + /** Constructor for the 'VpnCapslist' class: Caps list of the VPN Server */ + constructor(init?: Partial); +} +/** Config operation */ +export declare class VpnRpcConfig { + /** File name (valid only for returning from the server) */ + FileName_str: string; + /** File data */ + FileData_bin: Uint8Array; + /** Constructor for the 'VpnRpcConfig' class: Config operation */ + constructor(init?: Partial); +} +/** Connection information */ +export declare class VpnRpcConnectionInfo { + /** Connection name */ + Name_str: string; + /** Type */ + Type_u32: VpnRpcConnectionType; + /** Host name */ + Hostname_str: string; + /** IP address */ + Ip_ip: string; + /** Port number */ + Port_u32: number; + /** Connected time */ + ConnectedTime_dt: Date; + /** Server string */ + ServerStr_str: string; + /** Server version */ + ServerVer_u32: number; + /** Server build number */ + ServerBuild_u32: number; + /** Client string */ + ClientStr_str: string; + /** Client version */ + ClientVer_u32: number; + /** Client build number */ + ClientBuild_u32: number; + /** Constructor for the 'VpnRpcConnectionInfo' class: Connection information */ + constructor(init?: Partial); +} +/** Proxy type */ +export declare enum VpnRpcProxyType { + /** Direct TCP connection */ + Direct = 0, + /** Connection via HTTP proxy server */ + HTTP = 1, + /** Connection via SOCKS proxy server */ + SOCKS = 2 +} +/** The current status of the DDNS */ +export declare class VpnDDnsClientStatus { + /** Last error code (IPv4) */ + Err_IPv4_u32: number; + /** Last error string (IPv4) */ + ErrStr_IPv4_utf: string; + /** Last error code (IPv6) */ + Err_IPv6_u32: number; + /** Last error string (IPv6) */ + ErrStr_IPv6_utf: string; + /** Current DDNS host name */ + CurrentHostName_str: string; + /** Current FQDN of the DDNS hostname */ + CurrentFqdn_str: string; + /** DDNS suffix */ + DnsSuffix_str: string; + /** Current IPv4 address of the VPN Server */ + CurrentIPv4_str: string; + /** Current IPv6 address of the VPN Server */ + CurrentIPv6_str: string; + /** Constructor for the 'VpnDDnsClientStatus' class: The current status of the DDNS */ + constructor(init?: Partial); +} +/** Internet connection settings */ +export declare class VpnInternetSetting { + /** Type of proxy server */ + ProxyType_u32: VpnRpcProxyType; + /** Proxy server host name */ + ProxyHostName_str: string; + /** Proxy server port number */ + ProxyPort_u32: number; + /** Proxy server user name */ + ProxyUsername_str: string; + /** Proxy server password */ + ProxyPassword_str: string; + /** Constructor for the 'VpnInternetSetting' class: Internet connection settings */ + constructor(init?: Partial); +} +/** Administration options */ +export declare class VpnAdminOption { + /** Name */ + Name_str: string; + /** Data */ + Value_u32: number; + /** Descrption */ + Descrption_utf: string; + /** Constructor for the 'VpnAdminOption' class: Administration options */ + constructor(init?: Partial); +} +/** Administration options list */ +export declare class VpnRpcAdminOption { + /** Virtual HUB name */ + HubName_str: string; + /** List data */ + AdminOptionList: VpnAdminOption[]; + /** Constructor for the 'VpnRpcAdminOption' class: Administration options list */ + constructor(init?: Partial); +} +/** Connection state to the controller */ +export declare class VpnRpcFarmConnectionStatus { + /** IP address */ + Ip_ip: string; + /** Port number */ + Port_u32: number; + /** Online state */ + Online_bool: boolean; + /** Last error code */ + LastError_u32: number; + /** Connection start time */ + StartedTime_dt: Date; + /** First connection time */ + FirstConnectedTime_dt: Date; + /** Connection time of this time */ + CurrentConnectedTime_dt: Date; + /** Number of retries */ + NumTry_u32: number; + /** Number of connection count */ + NumConnected_u32: number; + /** Connection failure count */ + NumFailed_u32: number; + /** Constructor for the 'VpnRpcFarmConnectionStatus' class: Connection state to the controller */ + constructor(init?: Partial); +} +/** HUB item of each farm member */ +export declare class VpnRpcFarmHub { + /** The Virtual Hub name */ + HubName_str: string; + /** Dynamic HUB */ + DynamicHub_bool: boolean; + /** Constructor for the 'VpnRpcFarmHub' class: HUB item of each farm member */ + constructor(init?: Partial); +} +/** Server farm member information acquisition */ +export declare class VpnRpcFarmInfo { + /** ID */ + Id_u32: number; + /** The flag if the server is Cluster Controller (false: Cluster Member servers) */ + Controller_bool: boolean; + /** Connection Established Time */ + ConnectedTime_dt: Date; + /** IP address */ + Ip_ip: string; + /** Host name */ + Hostname_str: string; + /** Point */ + Point_u32: number; + /** Number of Public Ports */ + NumPort_u32: number; + /** Public Ports */ + Ports_u32: number[]; + /** Server certificate */ + ServerCert_bin: Uint8Array; + /** Number of farm HUB */ + NumFarmHub_u32: number; + /** The hosted Virtual Hub list */ + HubsList: VpnRpcFarmHub[]; + /** Number of hosted VPN sessions */ + NumSessions_u32: number; + /** Number of TCP connections */ + NumTcpConnections_u32: number; + /** Performance Standard Ratio */ + Weight_u32: number; + /** Constructor for the 'VpnRpcFarmInfo' class: Server farm member information acquisition */ + constructor(init?: Partial); +} +/** Server farm configuration */ +export declare class VpnRpcFarm { + /** Type of server */ + ServerType_u32: VpnRpcServerType; + /** Valid only for Cluster Member servers. Number of the Ports_u32 element. */ + NumPort_u32: number; + /** Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers. */ + Ports_u32: number[]; + /** Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used. */ + PublicIp_ip: string; + /** Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. */ + ControllerName_str: string; + /** Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. */ + ControllerPort_u32: number; + /** Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller. */ + MemberPasswordPlaintext_str: string; + /** This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used. */ + Weight_u32: number; + /** Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments. */ + ControllerOnly_bool: boolean; + /** Constructor for the 'VpnRpcFarm' class: Server farm configuration */ + constructor(init?: Partial); +} +/** Log switch type */ +export declare enum VpnRpcLogSwitchType { + /** No switching */ + No = 0, + /** Secondly basis */ + Second = 1, + /** Minutely basis */ + Minute = 2, + /** Hourly basis */ + Hour = 3, + /** Daily basis */ + Day = 4, + /** Monthly basis */ + Month = 5 +} +/** Packet log settings */ +export declare enum VpnRpcPacketLogSetting { + /** Not save */ + None = 0, + /** Only header */ + Header = 1, + /** All payloads */ + All = 2 +} +/** Packet log settings array index */ +export declare enum VpnRpcPacketLogSettingIndex { + /** TCP connection log */ + TcpConnection = 0, + /** TCP packet log */ + TcpAll = 1, + /** DHCP Log */ + Dhcp = 2, + /** UDP log */ + Udp = 3, + /** ICMP log */ + Icmp = 4, + /** IP log */ + Ip = 5, + /** ARP log */ + Arp = 6, + /** Ethernet log */ + Ethernet = 7 +} +/** HUB log settings */ +export declare class VpnRpcHubLog { + /** The Virtual Hub name */ + HubName_str: string; + /** The flag to enable / disable saving the security log */ + SaveSecurityLog_bool: boolean; + /** The log filename switching setting of the security log */ + SecurityLogSwitchType_u32: VpnRpcLogSwitchType; + /** The flag to enable / disable saving the security log */ + SavePacketLog_bool: boolean; + /** The log filename switching settings of the packet logs */ + PacketLogSwitchType_u32: VpnRpcLogSwitchType; + /** Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7. */ + PacketLogConfig_u32: VpnRpcPacketLogSetting[]; + /** Constructor for the 'VpnRpcHubLog' class: HUB log settings */ + constructor(init?: Partial); +} +/** RADIUS server options */ +export declare class VpnRpcRadius { + /** The Virtual Hub name */ + HubName_str: string; + /** RADIUS server name */ + RadiusServerName_str: string; + /** RADIUS port number */ + RadiusPort_u32: number; + /** Secret key */ + RadiusSecret_str: string; + /** Radius retry interval */ + RadiusRetryInterval_u32: number; + /** Constructor for the 'VpnRpcRadius' class: RADIUS server options */ + constructor(init?: Partial); +} +/** Get the state HUB */ +export declare class VpnRpcHubStatus { + /** The Virtual Hub name */ + HubName_str: string; + /** Online */ + Online_bool: boolean; + /** Type of HUB */ + HubType_u32: VpnRpcHubType; + /** Number of sessions */ + NumSessions_u32: number; + /** Number of sessions (client mode) */ + NumSessionsClient_u32: number; + /** Number of sessions (bridge mode) */ + NumSessionsBridge_u32: number; + /** Number of Access list entries */ + NumAccessLists_u32: number; + /** Number of users */ + NumUsers_u32: number; + /** Number of groups */ + NumGroups_u32: number; + /** Number of MAC table entries */ + NumMacTables_u32: number; + /** Number of IP table entries */ + NumIpTables_u32: number; + /** Number of broadcast packets (Recv) */ + ["Recv.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Recv) */ + ["Recv.BroadcastCount_u64"]: number; + /** Unicast count (Recv) */ + ["Recv.UnicastBytes_u64"]: number; + /** Unicast bytes (Recv) */ + ["Recv.UnicastCount_u64"]: number; + /** Number of broadcast packets (Send) */ + ["Send.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Send) */ + ["Send.BroadcastCount_u64"]: number; + /** Unicast bytes (Send) */ + ["Send.UnicastBytes_u64"]: number; + /** Unicast bytes (Send) */ + ["Send.UnicastCount_u64"]: number; + /** Whether SecureNAT is enabled */ + SecureNATEnabled_bool: boolean; + /** Last communication date and time */ + LastCommTime_dt: Date; + /** Last login date and time */ + LastLoginTime_dt: Date; + /** Creation date and time */ + CreatedTime_dt: Date; + /** Number of logins */ + NumLogin_u32: number; + /** Constructor for the 'VpnRpcHubStatus' class: Get the state HUB */ + constructor(init?: Partial); +} +/** List of services provided by IPsec server */ +export declare class VpnIPsecServices { + /** Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. */ + L2TP_Raw_bool: boolean; + /** Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option. */ + L2TP_IPsec_bool: boolean; + /** Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging. */ + EtherIP_IPsec_bool: boolean; + /** Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters. */ + IPsec_Secret_str: string; + /** Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. */ + L2TP_DefaultHub_str: string; + /** Constructor for the 'VpnIPsecServices' class: List of services provided by IPsec server */ + constructor(init?: Partial); +} +/** Keep alive protocol */ +export declare enum VpnRpcKeepAliveProtocol { + /** TCP */ + TCP = 0, + /** UDP */ + UDP = 1 +} +/** Keep Alive settings */ +export declare class VpnRpcKeep { + /** The flag to enable keep-alive to the Internet */ + UseKeepConnect_bool: boolean; + /** Specify the host name or IP address of the destination */ + KeepConnectHost_str: string; + /** Specify the port number of the destination */ + KeepConnectPort_u32: number; + /** Protocol type */ + KeepConnectProtocol_u32: VpnRpcKeepAliveProtocol; + /** Interval Between Packets Sends (Seconds) */ + KeepConnectInterval_u32: number; + /** Constructor for the 'VpnRpcKeep' class: Keep Alive settings */ + constructor(init?: Partial); +} +/** State of the client session */ +export declare enum VpnRpcClientSessionStatus { + /** Connecting */ + Connecting = 0, + /** Negotiating */ + Negotiation = 1, + /** During user authentication */ + Auth = 2, + /** Connection complete */ + Established = 3, + /** Wait to retry */ + Retry = 4, + /** Idle state */ + Idle = 5 +} +/** Get the link state */ +export declare class VpnRpcLinkStatus { + /** The Virtual Hub name */ + HubName_Ex_str: string; + /** The name of the cascade connection */ + AccountName_utf: string; + /** The flag whether the cascade connection is enabled */ + Active_bool: boolean; + /** The flag whether the cascade connection is established */ + Connected_bool: boolean; + /** The session status */ + SessionStatus_u32: VpnRpcClientSessionStatus; + /** The destination VPN server name */ + ServerName_str: string; + /** The port number of the server */ + ServerPort_u32: number; + /** Server product name */ + ServerProductName_str: string; + /** Server product version */ + ServerProductVer_u32: number; + /** Server product build number */ + ServerProductBuild_u32: number; + /** Server's X.509 certificate */ + ServerX_bin: Uint8Array; + /** Client certificate */ + ClientX_bin: Uint8Array; + /** Connection start time */ + StartTime_dt: Date; + /** Connection completion time of the first connection */ + FirstConnectionEstablisiedTime_dt: Date; + /** Connection completion time of this connection */ + CurrentConnectionEstablishTime_dt: Date; + /** Number of connections have been established so far */ + NumConnectionsEatablished_u32: number; + /** Half-connection */ + HalfConnection_bool: boolean; + /** VoIP / QoS */ + QoS_bool: boolean; + /** Maximum number of the underlying TCP connections */ + MaxTcpConnections_u32: number; + /** Number of current underlying TCP connections */ + NumTcpConnections_u32: number; + /** Number of underlying inbound TCP connections */ + NumTcpConnectionsUpload_u32: number; + /** Number of underlying outbound TCP connections */ + NumTcpConnectionsDownload_u32: number; + /** Use of encryption */ + UseEncrypt_bool: boolean; + /** Cipher algorithm name */ + CipherName_str: string; + /** Use of compression */ + UseCompress_bool: boolean; + /** The flag whether this is a R-UDP session */ + IsRUDPSession_bool: boolean; + /** Underlying physical communication protocol */ + UnderlayProtocol_str: string; + /** The UDP acceleration is enabled */ + IsUdpAccelerationEnabled_bool: boolean; + /** The UDP acceleration is being actually used */ + IsUsingUdpAcceleration_bool: boolean; + /** Session name */ + SessionName_str: string; + /** Connection name */ + ConnectionName_str: string; + /** Session key */ + SessionKey_bin: Uint8Array; + /** Total transmitted data size */ + TotalSendSize_u64: number; + /** Total received data size */ + TotalRecvSize_u64: number; + /** Total transmitted data size (no compression) */ + TotalSendSizeReal_u64: number; + /** Total received data size (no compression) */ + TotalRecvSizeReal_u64: number; + /** The flag whether the VPN session is Bridge Mode */ + IsBridgeMode_bool: boolean; + /** The flag whether the VPN session is Monitor mode */ + IsMonitorMode_bool: boolean; + /** VLAN ID */ + VLanId_u32: number; + /** Constructor for the 'VpnRpcLinkStatus' class: Get the link state */ + constructor(init?: Partial); +} +/** Setting of SSTP and OpenVPN */ +export declare class VpnOpenVpnSstpConfig { + /** Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. */ + EnableOpenVPN_bool: boolean; + /** Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. */ + OpenVPNPortList_str: string; + /** pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. */ + EnableSSTP_bool: boolean; + /** Constructor for the 'VpnOpenVpnSstpConfig' class: Setting of SSTP and OpenVPN */ + constructor(init?: Partial); +} +/** Virtual host option */ +export declare class VpnVhOption { + /** Target Virtual HUB name */ + RpcHubName_str: string; + /** MAC address */ + MacAddress_bin: Uint8Array; + /** IP address */ + Ip_ip: string; + /** Subnet mask */ + Mask_ip: string; + /** Use flag of the Virtual NAT function */ + UseNat_bool: boolean; + /** MTU value (Standard: 1500) */ + Mtu_u32: number; + /** NAT TCP timeout in seconds */ + NatTcpTimeout_u32: number; + /** NAT UDP timeout in seconds */ + NatUdpTimeout_u32: number; + /** Using flag of DHCP function */ + UseDhcp_bool: boolean; + /** Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) */ + DhcpLeaseIPStart_ip: string; + /** Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) */ + DhcpLeaseIPEnd_ip: string; + /** Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) */ + DhcpSubnetMask_ip: string; + /** Specify the expiration date in second units for leasing an IP address to a client. */ + DhcpExpireTimeSpan_u32: number; + /** Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway. */ + DhcpGatewayAddress_ip: string; + /** Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. */ + DhcpDnsServerAddress_ip: string; + /** Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. */ + DhcpDnsServerAddress2_ip: string; + /** Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name. */ + DhcpDomainName_str: string; + /** Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting. */ + SaveLog_bool: boolean; + /** The flag to enable the DhcpPushRoutes_str field. */ + ApplyDhcpPushRoutes_bool: boolean; + /** Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes. */ + DhcpPushRoutes_str: string; + /** Constructor for the 'VpnVhOption' class: Virtual host option */ + constructor(init?: Partial); +} +/** RPC_NAT_STATUS */ +export declare class VpnRpcNatStatus { + /** Virtual Hub Name */ + HubName_str: string; + /** Number of TCP sessions */ + NumTcpSessions_u32: number; + /** Ntmber of UDP sessions */ + NumUdpSessions_u32: number; + /** Nymber of ICMP sessions */ + NumIcmpSessions_u32: number; + /** Number of DNS sessions */ + NumDnsSessions_u32: number; + /** Number of DHCP clients */ + NumDhcpClients_u32: number; + /** Whether the NAT is operating in the Kernel Mode */ + IsKernelMode_bool: boolean; + /** Whether the NAT is operating in the Raw IP Mode */ + IsRawIpMode_bool: boolean; + /** Constructor for the 'VpnRpcNatStatus' class: RPC_NAT_STATUS */ + constructor(init?: Partial); +} +/** Key pair */ +export declare class VpnRpcKeyPair { + /** The body of the certificate */ + Cert_bin: Uint8Array; + /** The body of the private key */ + Key_bin: Uint8Array; + /** Constructor for the 'VpnRpcKeyPair' class: Key pair */ + constructor(init?: Partial); +} +/** Single string value */ +export declare class VpnRpcStr { + /** A string value */ + String_str: string; + /** Constructor for the 'VpnRpcStr' class: Single string value */ + constructor(init?: Partial); +} +/** Type of VPN Server */ +export declare enum VpnRpcServerType { + /** Stand-alone server */ + Standalone = 0, + /** Farm controller server */ + FarmController = 1, + /** Farm member server */ + FarmMember = 2 +} +/** Operating system type */ +export declare enum VpnRpcOsType { + /** Windows 95 */ + WINDOWS_95 = 1100, + /** Windows 98 */ + WINDOWS_98 = 1200, + /** Windows Me */ + WINDOWS_ME = 1300, + /** Windows (unknown) */ + WINDOWS_UNKNOWN = 1400, + /** Windows NT 4.0 Workstation */ + WINDOWS_NT_4_WORKSTATION = 2100, + /** Windows NT 4.0 Server */ + WINDOWS_NT_4_SERVER = 2110, + /** Windows NT 4.0 Server, Enterprise Edition */ + WINDOWS_NT_4_SERVER_ENTERPRISE = 2111, + /** Windows NT 4.0 Terminal Server */ + WINDOWS_NT_4_TERMINAL_SERVER = 2112, + /** BackOffice Server 4.5 */ + WINDOWS_NT_4_BACKOFFICE = 2113, + /** Small Business Server 4.5 */ + WINDOWS_NT_4_SMS = 2114, + /** Windows 2000 Professional */ + WINDOWS_2000_PROFESSIONAL = 2200, + /** Windows 2000 Server */ + WINDOWS_2000_SERVER = 2211, + /** Windows 2000 Advanced Server */ + WINDOWS_2000_ADVANCED_SERVER = 2212, + /** Windows 2000 Datacenter Server */ + WINDOWS_2000_DATACENTER_SERVER = 2213, + /** BackOffice Server 2000 */ + WINDOWS_2000_BACKOFFICE = 2214, + /** Small Business Server 2000 */ + WINDOWS_2000_SBS = 2215, + /** Windows XP Home Edition */ + WINDOWS_XP_HOME = 2300, + /** Windows XP Professional */ + WINDOWS_XP_PROFESSIONAL = 2301, + /** Windows Server 2003 Web Edition */ + WINDOWS_2003_WEB = 2410, + /** Windows Server 2003 Standard Edition */ + WINDOWS_2003_STANDARD = 2411, + /** Windows Server 2003 Enterprise Edition */ + WINDOWS_2003_ENTERPRISE = 2412, + /** Windows Server 2003 DataCenter Edition */ + WINDOWS_2003_DATACENTER = 2413, + /** BackOffice Server 2003 */ + WINDOWS_2003_BACKOFFICE = 2414, + /** Small Business Server 2003 */ + WINDOWS_2003_SBS = 2415, + /** Windows Vista */ + WINDOWS_LONGHORN_PROFESSIONAL = 2500, + /** Windows Server 2008 */ + WINDOWS_LONGHORN_SERVER = 2510, + /** Windows 7 */ + WINDOWS_7 = 2600, + /** Windows Server 2008 R2 */ + WINDOWS_SERVER_2008_R2 = 2610, + /** Windows 8 */ + WINDOWS_8 = 2700, + /** Windows Server 2012 */ + WINDOWS_SERVER_8 = 2710, + /** Windows 8.1 */ + WINDOWS_81 = 2701, + /** Windows Server 2012 R2 */ + WINDOWS_SERVER_81 = 2711, + /** Windows 10 */ + WINDOWS_10 = 2702, + /** Windows Server 10 */ + WINDOWS_SERVER_10 = 2712, + /** Windows 11 or later */ + WINDOWS_11 = 2800, + /** Windows Server 11 or later */ + WINDOWS_SERVER_11 = 2810, + /** Unknown UNIX */ + UNIX_UNKNOWN = 3000, + /** Linux */ + LINUX = 3100, + /** Solaris */ + SOLARIS = 3200, + /** Cygwin */ + CYGWIN = 3300, + /** BSD */ + BSD = 3400, + /** MacOS X */ + MACOS_X = 3500 +} +/** VPN Server Information */ +export declare class VpnRpcServerInfo { + /** Server product name */ + ServerProductName_str: string; + /** Server version string */ + ServerVersionString_str: string; + /** Server build information string */ + ServerBuildInfoString_str: string; + /** Server version integer value */ + ServerVerInt_u32: number; + /** Server build number integer value */ + ServerBuildInt_u32: number; + /** Server host name */ + ServerHostName_str: string; + /** Type of server */ + ServerType_u32: VpnRpcServerType; + /** Build date and time of the server */ + ServerBuildDate_dt: Date; + /** Family name */ + ServerFamilyName_str: string; + /** OS type */ + OsType_u32: VpnRpcOsType; + /** Service pack number */ + OsServicePack_u32: number; + /** OS system name */ + OsSystemName_str: string; + /** OS product name */ + OsProductName_str: string; + /** OS vendor name */ + OsVendorName_str: string; + /** OS version */ + OsVersion_str: string; + /** Kernel name */ + KernelName_str: string; + /** Kernel version */ + KernelVersion_str: string; + /** Constructor for the 'VpnRpcServerInfo' class: VPN Server Information */ + constructor(init?: Partial); +} +/** Server status */ +export declare class VpnRpcServerStatus { + /** Type of server */ + ServerType_u32: VpnRpcServerType; + /** Total number of TCP connections */ + NumTcpConnections_u32: number; + /** Number of Local TCP connections */ + NumTcpConnectionsLocal_u32: number; + /** Number of remote TCP connections */ + NumTcpConnectionsRemote_u32: number; + /** Total number of HUBs */ + NumHubTotal_u32: number; + /** Nymber of stand-alone HUB */ + NumHubStandalone_u32: number; + /** Number of static HUBs */ + NumHubStatic_u32: number; + /** Number of Dynamic HUBs */ + NumHubDynamic_u32: number; + /** Total number of sessions */ + NumSessionsTotal_u32: number; + /** Number of local VPN sessions */ + NumSessionsLocal_u32: number; + /** The number of remote sessions */ + NumSessionsRemote_u32: number; + /** Number of MAC table entries (total sum of all Virtual Hubs) */ + NumMacTables_u32: number; + /** Number of IP table entries (total sum of all Virtual Hubs) */ + NumIpTables_u32: number; + /** Number of users (total sum of all Virtual Hubs) */ + NumUsers_u32: number; + /** Number of groups (total sum of all Virtual Hubs) */ + NumGroups_u32: number; + /** Number of assigned bridge licenses (Useful to make a commercial version) */ + AssignedBridgeLicenses_u32: number; + /** Number of assigned client licenses (Useful to make a commercial version) */ + AssignedClientLicenses_u32: number; + /** Number of Assigned bridge license (cluster-wide), useful to make a commercial version */ + AssignedBridgeLicensesTotal_u32: number; + /** Number of assigned client licenses (cluster-wide), useful to make a commercial version */ + AssignedClientLicensesTotal_u32: number; + /** Number of broadcast packets (Recv) */ + ["Recv.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Recv) */ + ["Recv.BroadcastCount_u64"]: number; + /** Unicast count (Recv) */ + ["Recv.UnicastBytes_u64"]: number; + /** Unicast bytes (Recv) */ + ["Recv.UnicastCount_u64"]: number; + /** Number of broadcast packets (Send) */ + ["Send.BroadcastBytes_u64"]: number; + /** Broadcast bytes (Send) */ + ["Send.BroadcastCount_u64"]: number; + /** Unicast bytes (Send) */ + ["Send.UnicastBytes_u64"]: number; + /** Unicast bytes (Send) */ + ["Send.UnicastCount_u64"]: number; + /** Current time */ + CurrentTime_dt: Date; + /** 64 bit High-Precision Logical System Clock */ + CurrentTick_u64: number; + /** VPN Server Start-up time */ + StartTime_dt: Date; + /** Memory information: Total Memory */ + TotalMemory_u64: number; + /** Memory information: Used Memory */ + UsedMemory_u64: number; + /** Memory information: Free Memory */ + FreeMemory_u64: number; + /** Memory information: Total Phys */ + TotalPhys_u64: number; + /** Memory information: Used Phys */ + UsedPhys_u64: number; + /** Memory information: Free Phys */ + FreePhys_u64: number; + /** Constructor for the 'VpnRpcServerStatus' class: Server status */ + constructor(init?: Partial); +} +/** VPN Session status */ +export declare class VpnRpcSessionStatus { + /** The Virtual Hub name */ + HubName_str: string; + /** VPN session name */ + Name_str: string; + /** User name */ + Username_str: string; + /** Real user name which was used for the authentication */ + RealUsername_str: string; + /** Group name */ + GroupName_str: string; + /** Is Cascade Session */ + LinkMode_bool: boolean; + /** Client IP address */ + Client_Ip_Address_ip: string; + /** Client host name */ + SessionStatus_ClientHostName_str: string; + /** Operation flag */ + Active_bool: boolean; + /** Connected flag */ + Connected_bool: boolean; + /** State of the client session */ + SessionStatus_u32: VpnRpcClientSessionStatus; + /** Server name */ + ServerName_str: string; + /** Port number of the server */ + ServerPort_u32: number; + /** Server product name */ + ServerProductName_str: string; + /** Server product version */ + ServerProductVer_u32: number; + /** Server product build number */ + ServerProductBuild_u32: number; + /** Connection start time */ + StartTime_dt: Date; + /** Connection completion time of the first connection */ + FirstConnectionEstablisiedTime_dt: Date; + /** Connection completion time of this connection */ + CurrentConnectionEstablishTime_dt: Date; + /** Number of connections have been established so far */ + NumConnectionsEatablished_u32: number; + /** Half-connection */ + HalfConnection_bool: boolean; + /** VoIP / QoS */ + QoS_bool: boolean; + /** Maximum number of the underlying TCP connections */ + MaxTcpConnections_u32: number; + /** Number of current underlying TCP connections */ + NumTcpConnections_u32: number; + /** Number of inbound underlying connections */ + NumTcpConnectionsUpload_u32: number; + /** Number of outbound underlying connections */ + NumTcpConnectionsDownload_u32: number; + /** Use of encryption */ + UseEncrypt_bool: boolean; + /** Cipher algorithm name */ + CipherName_str: string; + /** Use of compression */ + UseCompress_bool: boolean; + /** Is R-UDP session */ + IsRUDPSession_bool: boolean; + /** Physical underlying communication protocol */ + UnderlayProtocol_str: string; + /** The UDP acceleration is enabled */ + IsUdpAccelerationEnabled_bool: boolean; + /** Using the UDP acceleration function */ + IsUsingUdpAcceleration_bool: boolean; + /** VPN session name */ + SessionName_str: string; + /** Connection name */ + ConnectionName_str: string; + /** Session key */ + SessionKey_bin: Uint8Array; + /** Total transmitted data size */ + TotalSendSize_u64: number; + /** Total received data size */ + TotalRecvSize_u64: number; + /** Total transmitted data size (no compression) */ + TotalSendSizeReal_u64: number; + /** Total received data size (no compression) */ + TotalRecvSizeReal_u64: number; + /** Is Bridge Mode */ + IsBridgeMode_bool: boolean; + /** Is Monitor mode */ + IsMonitorMode_bool: boolean; + /** VLAN ID */ + VLanId_u32: number; + /** Client product name */ + ClientProductName_str: string; + /** Client version */ + ClientProductVer_u32: number; + /** Client build number */ + ClientProductBuild_u32: number; + /** Client OS name */ + ClientOsName_str: string; + /** Client OS version */ + ClientOsVer_str: string; + /** Client OS Product ID */ + ClientOsProductId_str: string; + /** Client host name */ + ClientHostname_str: string; + /** Unique ID */ + UniqueId_bin: Uint8Array; + /** Constructor for the 'VpnRpcSessionStatus' class: VPN Session status */ + constructor(init?: Partial); +} +/** Set the special listener */ +export declare class VpnRpcSpecialListener { + /** The flag to activate the VPN over ICMP server function */ + VpnOverIcmpListener_bool: boolean; + /** The flag to activate the VPN over DNS function */ + VpnOverDnsListener_bool: boolean; + /** Constructor for the 'VpnRpcSpecialListener' class: Set the special listener */ + constructor(init?: Partial); +} +/** Syslog configuration */ +export declare enum VpnSyslogSaveType { + /** Do not use syslog */ + None = 0, + /** Only server log */ + ServerLog = 1, + /** Server and Virtual HUB security log */ + ServerAndHubSecurityLog = 2, + /** Server, Virtual HUB security, and packet log */ + ServerAndHubAllLog = 3 +} +/** Syslog configuration */ +export declare class VpnSyslogSetting { + /** The behavior of the syslog function */ + SaveType_u32: VpnSyslogSaveType; + /** Specify the host name or IP address of the syslog server */ + Hostname_str: string; + /** Specify the port number of the syslog server */ + Port_u32: number; + /** Constructor for the 'VpnSyslogSetting' class: Syslog configuration */ + constructor(init?: Partial); +} +/** VPN Gate Server Config */ +export declare class VpnVgsConfig { + /** Active flag */ + IsEnabled_bool: boolean; + /** Message */ + Message_utf: string; + /** Owner name */ + Owner_utf: string; + /** Abuse email */ + Abuse_utf: string; + /** Log save flag */ + NoLog_bool: boolean; + /** Save log permanently */ + LogPermanent_bool: boolean; + /** Enable the L2TP VPN function */ + EnableL2TP_bool: boolean; + /** Constructor for the 'VpnVgsConfig' class: VPN Gate Server Config */ + constructor(init?: Partial); +} +/** Read a Log file */ +export declare class VpnRpcReadLogFile { + /** Server name */ + ServerName_str: string; + /** File Path */ + FilePath_str: string; + /** Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field. */ + Offset_u32: number; + /** Received buffer */ + Buffer_bin: Uint8Array; + /** Constructor for the 'VpnRpcReadLogFile' class: Read a Log file */ + constructor(init?: Partial); +} +/** Rename link */ +export declare class VpnRpcRenameLink { + /** The Virtual Hub name */ + HubName_str: string; + /** The old name of the cascade connection */ + OldAccountName_utf: string; + /** The new name of the cascade connection */ + NewAccountName_utf: string; + /** Constructor for the 'VpnRpcRenameLink' class: Rename link */ + constructor(init?: Partial); +} +/** Online or offline the HUB */ +export declare class VpnRpcSetHubOnline { + /** The Virtual Hub name */ + HubName_str: string; + /** Online / offline flag */ + Online_bool: boolean; + /** Constructor for the 'VpnRpcSetHubOnline' class: Online or offline the HUB */ + constructor(init?: Partial); +} +/** Set Password */ +export declare class VpnRpcSetPassword { + /** The plaintext password */ + PlainTextPassword_str: string; + /** Constructor for the 'VpnRpcSetPassword' class: Set Password */ + constructor(init?: Partial); +} +/** JSON-RPC request class. See https://www.jsonrpc.org/specification */ +export declare class JsonRpcRequest { + jsonrpc: string; + method: string; + params: any; + id: string; + constructor(method?: string, param?: any, id?: string); +} +/** JSON-RPC error class. See https://www.jsonrpc.org/specification */ +export declare class JsonRpcError { + code: number; + message: string; + data: any; + constructor(code?: number, message?: string, data?: any); +} +/** JSON-RPC response class with generics */ +export declare class JsonRpcResponse { + jsonrpc: string; + result: TResult; + error: JsonRpcError; + id: string; +} +/** JSON-RPC client class. See https://www.jsonrpc.org/specification */ +export declare class JsonRpcClient { + /** A utility function to convert any object to JSON string */ + static ObjectToJson(obj: any): string; + /** A utility function to convert JSON string to object */ + static JsonToObject(str: string): any; + /** Base URL */ + BaseUrl: string; + /** The instance of HTTP client */ + private client; + /** Additional HTTP headers */ + private headers; + /** + * JSON-RPC client class constructor + * @param url The URL + * @param headers Additional HTTP headers + * @param send_credential Set true to use the same credential with the browsing web site. Valid only if the code is running on the web browser. + */ + constructor(url: string, headers: { + [name: string]: string; + }, send_credential: boolean, nodejs_https_client_reject_untrusted_server_cert: boolean); + /** + * Call a single RPC call (without error check). You can wait for the response with Promise or await statement. + * @param method_name The name of RPC method + * @param param The parameters + */ + CallInternalAsync(method_name: string, param: any): Promise; + /** + * Call a single RPC call (with error check). You can wait for the response with Promise or await statement. In the case of error, it will be thrown. + * @param method_name The name of RPC method + * @param param The parameters + */ + CallAsync(method_name: string, param: any): Promise; +} +/** JSON-RPC exception class */ +export declare class JsonRpcException extends Error { + Error: JsonRpcError; + constructor(error: JsonRpcError); +} +/** HTTP client exception class */ +export declare class HttpClientException extends Error { + constructor(message: string); +} +/** HTTP client response class */ +export declare class HttpClientResponse { + Body: string; +} +/** An HTTP client which can be used in both web browsers and Node.js */ +export declare class HttpClient { + TimeoutMsecs: number; + SendCredential: boolean; + NodeJS_HTTPS_Client_Reject_Unauthorized: boolean; + /** Post method. In web browsers this function will process the request by itself. In Node.js this function will call PostAsync_NodeJS() instead. */ + PostAsync(url: string, headers: { + [name: string]: string; + }, req_body: string, req_media_type: string): Promise; + /** Post method for Node.js. */ + PostAsync_NodeJS(url: string, headers: { + [name: string]: string; + }, req_body: string, req_media_type: string): Promise; +} +export declare function Util_Base64_Decode(b64: any): Uint8Array; +export declare function Util_Base64_Encode(uint8: any): string; +//# sourceMappingURL=vpnrpc.d.ts.map \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts.map softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts.map --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts.map 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts.map 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1 @@ +{"version":3,"file":"vpnrpc.d.ts","sourceRoot":"","sources":["../src/vpnrpc.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,3825 @@ +"use strict"; +// SoftEther VPN Server JSON-RPC Stub code for TypeScript +// +// vpnrpc.ts +// Automatically generated at 2019-05-29 18:21:39 by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +exports.__esModule = true; +// Trivial utility codes +var is_node_js = (typeof navigator === "undefined") || navigator.userAgent.indexOf("Node.js") !== -1 || navigator.userAgent.indexOf("jsdom") !== -1; +function is_null(obj) { + return (typeof obj === "undefined") || (obj === null); +} +var debug_mode = false; +/** VPN Server RPC Stubs */ +var VpnServerRpc = /** @class */ (function () { + /** + * Constructor of the VpnServerRpc class + * @param vpnserver_hostname The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param vpnserver_port The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param hubname The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. + * @param password Specify the administration password. This value is valid only if vpnserver_hostname is sepcified. + * @param nodejs_https_client_reject_untrusted_server_cert In Node.js set this true to check the SSL server certificate on the destination VPN Server. Set this false to ignore the SSL server certification. + */ + function VpnServerRpc(vpnserver_hostname, vpnserver_port, hubname, password, nodejs_https_client_reject_untrusted_server_cert) { + var _this = this; + // --- Stubs --- + /** Test RPC function. Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. */ + this.Test = function (in_param) { + return _this.CallAsync("Test", in_param); + }; + /** Get server information. This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. */ + this.GetServerInfo = function () { + return _this.CallAsync("GetServerInfo", new VpnRpcServerInfo()); + }; + /** Get Current Server Status. This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. */ + this.GetServerStatus = function () { + return _this.CallAsync("GetServerStatus", new VpnRpcServerStatus()); + }; + /** Create New TCP Listener. This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. */ + this.CreateListener = function (in_param) { + return _this.CallAsync("CreateListener", in_param); + }; + /** Get List of TCP Listeners. This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. */ + this.EnumListener = function () { + return _this.CallAsync("EnumListener", new VpnRpcListenerList()); + }; + /** Delete TCP Listener. This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. */ + this.DeleteListener = function (in_param) { + return _this.CallAsync("DeleteListener", in_param); + }; + /** Enable / Disable TCP Listener. This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. */ + this.EnableListener = function (in_param) { + return _this.CallAsync("EnableListener", in_param); + }; + /** Set VPN Server Administrator Password. This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. */ + this.SetServerPassword = function (in_param) { + return _this.CallAsync("SetServerPassword", in_param); + }; + /** Set the VPN Server clustering configuration. Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. */ + this.SetFarmSetting = function (in_param) { + return _this.CallAsync("SetFarmSetting", in_param); + }; + /** Get Clustering Configuration of Current VPN Server. You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. */ + this.GetFarmSetting = function () { + return _this.CallAsync("GetFarmSetting", new VpnRpcFarm()); + }; + /** Get Cluster Member Information. When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. */ + this.GetFarmInfo = function (in_param) { + return _this.CallAsync("GetFarmInfo", in_param); + }; + /** Get List of Cluster Members. Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. */ + this.EnumFarmMember = function () { + return _this.CallAsync("EnumFarmMember", new VpnRpcEnumFarm()); + }; + /** Get Connection Status to Cluster Controller. Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. */ + this.GetFarmConnectionStatus = function () { + return _this.CallAsync("GetFarmConnectionStatus", new VpnRpcFarmConnectionStatus()); + }; + /** Set SSL Certificate and Private Key of VPN Server. You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. */ + this.SetServerCert = function (in_param) { + return _this.CallAsync("SetServerCert", in_param); + }; + /** Get SSL Certificate and Private Key of VPN Server. Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. */ + this.GetServerCert = function () { + return _this.CallAsync("GetServerCert", new VpnRpcKeyPair()); + }; + /** Get the Encrypted Algorithm Used for VPN Communication. Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. */ + this.GetServerCipher = function () { + return _this.CallAsync("GetServerCipher", new VpnRpcStr()); + }; + /** Set the Encrypted Algorithm Used for VPN Communication. Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. */ + this.SetServerCipher = function (in_param) { + return _this.CallAsync("SetServerCipher", in_param); + }; + /** Create New Virtual Hub. Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. */ + this.CreateHub = function (in_param) { + return _this.CallAsync("CreateHub", in_param); + }; + /** Set the Virtual Hub configuration. You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. */ + this.SetHub = function (in_param) { + return _this.CallAsync("SetHub", in_param); + }; + /** Get the Virtual Hub configuration. You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. */ + this.GetHub = function (in_param) { + return _this.CallAsync("GetHub", in_param); + }; + /** Get List of Virtual Hubs. Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. */ + this.EnumHub = function () { + return _this.CallAsync("EnumHub", new VpnRpcEnumHub()); + }; + /** Delete Virtual Hub. Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. */ + this.DeleteHub = function (in_param) { + return _this.CallAsync("DeleteHub", in_param); + }; + /** Get Setting of RADIUS Server Used for User Authentication. Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetHubRadius = function (in_param) { + return _this.CallAsync("GetHubRadius", in_param); + }; + /** Set RADIUS Server to use for User Authentication. To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetHubRadius = function (in_param) { + return _this.CallAsync("SetHubRadius", in_param); + }; + /** Get List of TCP Connections Connecting to the VPN Server. Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. */ + this.EnumConnection = function () { + return _this.CallAsync("EnumConnection", new VpnRpcEnumConnection()); + }; + /** Disconnect TCP Connections Connecting to the VPN Server. Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. */ + this.DisconnectConnection = function (in_param) { + return _this.CallAsync("DisconnectConnection", in_param); + }; + /** Get Information of TCP Connections Connecting to the VPN Server. Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. */ + this.GetConnectionInfo = function (in_param) { + return _this.CallAsync("GetConnectionInfo", in_param); + }; + /** Switch Virtual Hub to Online or Offline. Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetHubOnline = function (in_param) { + return _this.CallAsync("SetHubOnline", in_param); + }; + /** Get Current Status of Virtual Hub. Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. */ + this.GetHubStatus = function (in_param) { + return _this.CallAsync("GetHubStatus", in_param); + }; + /** Set the logging configuration of the Virtual Hub. Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. */ + this.SetHubLog = function (in_param) { + return _this.CallAsync("SetHubLog", in_param); + }; + /** Get the logging configuration of the Virtual Hub. Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. */ + this.GetHubLog = function (in_param) { + return _this.CallAsync("GetHubLog", in_param); + }; + /** Add Trusted CA Certificate. Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.AddCa = function (in_param) { + return _this.CallAsync("AddCa", in_param); + }; + /** Get List of Trusted CA Certificates. Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.EnumCa = function (in_param) { + return _this.CallAsync("EnumCa", in_param); + }; + /** Get Trusted CA Certificate. Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.GetCa = function (in_param) { + return _this.CallAsync("GetCa", in_param); + }; + /** Delete Trusted CA Certificate. Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.DeleteCa = function (in_param) { + return _this.CallAsync("DeleteCa", in_param); + }; + /** Create New Cascade Connection. Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.CreateLink = function (in_param) { + return _this.CallAsync("CreateLink", in_param); + }; + /** Get the Cascade Connection Setting. Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetLink = function (in_param) { + return _this.CallAsync("GetLink", in_param); + }; + /** Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. */ + this.SetLink = function (in_param) { + return _this.CallAsync("SetLink", in_param); + }; + /** Get List of Cascade Connections. Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.EnumLink = function (in_param) { + return _this.CallAsync("EnumLink", in_param); + }; + /** Switch Cascade Connection to Online Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetLinkOnline = function (in_param) { + return _this.CallAsync("SetLinkOnline", in_param); + }; + /** Switch Cascade Connection to Offline Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetLinkOffline = function (in_param) { + return _this.CallAsync("SetLinkOffline", in_param); + }; + /** Delete Cascade Connection Setting. Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.DeleteLink = function (in_param) { + return _this.CallAsync("DeleteLink", in_param); + }; + /** Change Name of Cascade Connection. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.RenameLink = function (in_param) { + return _this.CallAsync("RenameLink", in_param); + }; + /** Get Current Cascade Connection Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetLinkStatus = function (in_param) { + return _this.CallAsync("GetLinkStatus", in_param); + }; + /** Add Access List Rule. Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.AddAccess = function (in_param) { + return _this.CallAsync("AddAccess", in_param); + }; + /** Delete Rule from Access List. Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.DeleteAccess = function (in_param) { + return _this.CallAsync("DeleteAccess", in_param); + }; + /** Get Access List Rule List. Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.EnumAccess = function (in_param) { + return _this.CallAsync("EnumAccess", in_param); + }; + /** Replace all access lists on a single bulk API call. This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. */ + this.SetAccessList = function (in_param) { + return _this.CallAsync("SetAccessList", in_param); + }; + /** Create a user. Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.CreateUser = function (in_param) { + return _this.CallAsync("CreateUser", in_param); + }; + /** Change User Settings. Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.SetUser = function (in_param) { + return _this.CallAsync("SetUser", in_param); + }; + /** Get User Settings. Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.GetUser = function (in_param) { + return _this.CallAsync("GetUser", in_param); + }; + /** Delete a user. Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.DeleteUser = function (in_param) { + return _this.CallAsync("DeleteUser", in_param); + }; + /** Get List of Users. Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.EnumUser = function (in_param) { + return _this.CallAsync("EnumUser", in_param); + }; + /** Create Group. Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.CreateGroup = function (in_param) { + return _this.CallAsync("CreateGroup", in_param); + }; + /** Set group settings. Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.SetGroup = function (in_param) { + return _this.CallAsync("SetGroup", in_param); + }; + /** Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.GetGroup = function (in_param) { + return _this.CallAsync("GetGroup", in_param); + }; + /** Delete User from Group. Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.DeleteGroup = function (in_param) { + return _this.CallAsync("DeleteGroup", in_param); + }; + /** Get List of Groups. Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + this.EnumGroup = function (in_param) { + return _this.CallAsync("EnumGroup", in_param); + }; + /** Get List of Connected VPN Sessions. Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. */ + this.EnumSession = function (in_param) { + return _this.CallAsync("EnumSession", in_param); + }; + /** Get Session Status. Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. */ + this.GetSessionStatus = function (in_param) { + return _this.CallAsync("GetSessionStatus", in_param); + }; + /** Disconnect Session. Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. */ + this.DeleteSession = function (in_param) { + return _this.CallAsync("DeleteSession", in_param); + }; + /** Get the MAC Address Table Database. Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. */ + this.EnumMacTable = function (in_param) { + return _this.CallAsync("EnumMacTable", in_param); + }; + /** Delete MAC Address Table Entry. Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. */ + this.DeleteMacTable = function (in_param) { + return _this.CallAsync("DeleteMacTable", in_param); + }; + /** Get the IP Address Table Database. Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. */ + this.EnumIpTable = function (in_param) { + return _this.CallAsync("EnumIpTable", in_param); + }; + /** Delete IP Address Table Entry. Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. */ + this.DeleteIpTable = function (in_param) { + return _this.CallAsync("DeleteIpTable", in_param); + }; + /** Set the Keep Alive Internet Connection Function. Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. */ + this.SetKeep = function (in_param) { + return _this.CallAsync("SetKeep", in_param); + }; + /** Get the Keep Alive Internet Connection Function. Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. */ + this.GetKeep = function (in_param) { + return _this.CallAsync("GetKeep", in_param); + }; + /** Enable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.EnableSecureNAT = function (in_param) { + return _this.CallAsync("EnableSecureNAT", in_param); + }; + /** Disable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.DisableSecureNAT = function (in_param) { + return _this.CallAsync("DisableSecureNAT", in_param); + }; + /** Change Settings of SecureNAT Function. Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetSecureNATOption = function (in_param) { + return _this.CallAsync("SetSecureNATOption", in_param); + }; + /** Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. */ + this.GetSecureNATOption = function (in_param) { + return _this.CallAsync("GetSecureNATOption", in_param); + }; + /** Get Virtual NAT Function Session Table of SecureNAT Function. Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.EnumNAT = function (in_param) { + return _this.CallAsync("EnumNAT", in_param); + }; + /** Get Virtual DHCP Server Function Lease Table of SecureNAT Function. Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.EnumDHCP = function (in_param) { + return _this.CallAsync("EnumDHCP", in_param); + }; + /** Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetSecureNATStatus = function (in_param) { + return _this.CallAsync("GetSecureNATStatus", in_param); + }; + /** Get List of Network Adapters Usable as Local Bridge. Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. */ + this.EnumEthernet = function () { + return _this.CallAsync("EnumEthernet", new VpnRpcEnumEth()); + }; + /** Create Local Bridge Connection. Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. */ + this.AddLocalBridge = function (in_param) { + return _this.CallAsync("AddLocalBridge", in_param); + }; + /** Delete Local Bridge Connection. Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. */ + this.DeleteLocalBridge = function (in_param) { + return _this.CallAsync("DeleteLocalBridge", in_param); + }; + /** Get List of Local Bridge Connection. Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. */ + this.EnumLocalBridge = function () { + return _this.CallAsync("EnumLocalBridge", new VpnRpcEnumLocalBridge()); + }; + /** Get whether the localbridge function is supported on the current system. */ + this.GetBridgeSupport = function () { + return _this.CallAsync("GetBridgeSupport", new VpnRpcBridgeSupport()); + }; + /** Reboot VPN Server Service. Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. */ + this.RebootServer = function (in_param) { + return _this.CallAsync("RebootServer", in_param); + }; + /** Get List of Server Functions / Capability. Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. */ + this.GetCaps = function () { + return _this.CallAsync("GetCaps", new VpnCapslist()); + }; + /** Get the current configuration of the VPN Server. Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. */ + this.GetConfig = function () { + return _this.CallAsync("GetConfig", new VpnRpcConfig()); + }; + /** Write Configuration File to VPN Server. Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. */ + this.SetConfig = function (in_param) { + return _this.CallAsync("SetConfig", in_param); + }; + /** Get Virtual Hub Administration Option default values. */ + this.GetDefaultHubAdminOptions = function (in_param) { + return _this.CallAsync("GetDefaultHubAdminOptions", in_param); + }; + /** Get List of Virtual Hub Administration Options. Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + this.GetHubAdminOptions = function (in_param) { + return _this.CallAsync("GetHubAdminOptions", in_param); + }; + /** Set Values of Virtual Hub Administration Options. Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + this.SetHubAdminOptions = function (in_param) { + return _this.CallAsync("SetHubAdminOptions", in_param); + }; + /** Get List of Virtual Hub Extended Options. Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + this.GetHubExtOptions = function (in_param) { + return _this.CallAsync("GetHubExtOptions", in_param); + }; + /** Set a Value of Virtual Hub Extended Options. Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + this.SetHubExtOptions = function (in_param) { + return _this.CallAsync("SetHubExtOptions", in_param); + }; + /** Define New Virtual Layer 3 Switch. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + this.AddL3Switch = function (in_param) { + return _this.CallAsync("AddL3Switch", in_param); + }; + /** Delete Virtual Layer 3 Switch. Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + this.DelL3Switch = function (in_param) { + return _this.CallAsync("DelL3Switch", in_param); + }; + /** Get List of Virtual Layer 3 Switches. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + this.EnumL3Switch = function () { + return _this.CallAsync("EnumL3Switch", new VpnRpcEnumL3Sw()); + }; + /** Start Virtual Layer 3 Switch Operation. Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + this.StartL3Switch = function (in_param) { + return _this.CallAsync("StartL3Switch", in_param); + }; + /** Stop Virtual Layer 3 Switch Operation. Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. */ + this.StopL3Switch = function (in_param) { + return _this.CallAsync("StopL3Switch", in_param); + }; + /** Add Virtual Interface to Virtual Layer 3 Switch. Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + this.AddL3If = function (in_param) { + return _this.CallAsync("AddL3If", in_param); + }; + /** Delete Virtual Interface of Virtual Layer 3 Switch. Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + this.DelL3If = function (in_param) { + return _this.CallAsync("DelL3If", in_param); + }; + /** Get List of Interfaces Registered on the Virtual Layer 3 Switch. Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + this.EnumL3If = function (in_param) { + return _this.CallAsync("EnumL3If", in_param); + }; + /** Add Routing Table Entry for Virtual Layer 3 Switch. Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + this.AddL3Table = function (in_param) { + return _this.CallAsync("AddL3Table", in_param); + }; + /** Delete Routing Table Entry of Virtual Layer 3 Switch. Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + this.DelL3Table = function (in_param) { + return _this.CallAsync("DelL3Table", in_param); + }; + /** Get List of Routing Tables of Virtual Layer 3 Switch. Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + this.EnumL3Table = function (in_param) { + return _this.CallAsync("EnumL3Table", in_param); + }; + /** Get List of Certificates Revocation List. Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.EnumCrl = function (in_param) { + return _this.CallAsync("EnumCrl", in_param); + }; + /** Add a Revoked Certificate. Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.AddCrl = function (in_param) { + return _this.CallAsync("AddCrl", in_param); + }; + /** Delete a Revoked Certificate. Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.DelCrl = function (in_param) { + return _this.CallAsync("DelCrl", in_param); + }; + /** Get a Revoked Certificate. Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetCrl = function (in_param) { + return _this.CallAsync("GetCrl", in_param); + }; + /** Change Existing CRL (Certificate Revocation List) Entry. Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetCrl = function (in_param) { + return _this.CallAsync("SetCrl", in_param); + }; + /** Add Rule to Source IP Address Limit List. Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetAcList = function (in_param) { + return _this.CallAsync("SetAcList", in_param); + }; + /** Get List of Rule Items of Source IP Address Limit List. Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetAcList = function (in_param) { + return _this.CallAsync("GetAcList", in_param); + }; + /** Get List of Log Files. Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. */ + this.EnumLogFile = function () { + return _this.CallAsync("EnumLogFile", new VpnRpcEnumLogFile()); + }; + /** Download a part of Log File. Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. */ + this.ReadLogFile = function (in_param) { + return _this.CallAsync("ReadLogFile", in_param); + }; + /** Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use. */ + this.SetSysLog = function (in_param) { + return _this.CallAsync("SetSysLog", in_param); + }; + /** Get syslog Send Function. This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. */ + this.GetSysLog = function (in_param) { + return _this.CallAsync("GetSysLog", in_param); + }; + /** Set Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. */ + this.SetHubMsg = function (in_param) { + return _this.CallAsync("SetHubMsg", in_param); + }; + /** Get Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. */ + this.GetHubMsg = function (in_param) { + return _this.CallAsync("GetHubMsg", in_param); + }; + /** Raise a vital error on the VPN Server / Bridge to terminate the process forcefully. This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. */ + this.Crash = function (in_param) { + return _this.CallAsync("Crash", in_param); + }; + /** Get the message for administrators. */ + this.GetAdminMsg = function () { + return _this.CallAsync("GetAdminMsg", new VpnRpcMsg()); + }; + /** Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. */ + this.Flush = function (in_param) { + return _this.CallAsync("Flush", in_param); + }; + /** Enable or Disable IPsec VPN Server Function. Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetIPsecServices = function (in_param) { + return _this.CallAsync("SetIPsecServices", in_param); + }; + /** Get the Current IPsec VPN Server Settings. Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetIPsecServices = function () { + return _this.CallAsync("GetIPsecServices", new VpnIPsecServices()); + }; + /** Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices. Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.AddEtherIpId = function (in_param) { + return _this.CallAsync("AddEtherIpId", in_param); + }; + /** Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetEtherIpId = function (in_param) { + return _this.CallAsync("GetEtherIpId", in_param); + }; + /** Delete an EtherIP / L2TPv3 over IPsec Client Setting. This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.DeleteEtherIpId = function (in_param) { + return _this.CallAsync("DeleteEtherIpId", in_param); + }; + /** Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.EnumEtherIpId = function () { + return _this.CallAsync("EnumEtherIpId", new VpnRpcEnumEtherIpId()); + }; + /** Set Settings for OpenVPN Clone Server Function. The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetOpenVpnSstpConfig = function (in_param) { + return _this.CallAsync("SetOpenVpnSstpConfig", in_param); + }; + /** Get the Current Settings of OpenVPN Clone Server Function. Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetOpenVpnSstpConfig = function () { + return _this.CallAsync("GetOpenVpnSstpConfig", new VpnOpenVpnSstpConfig()); + }; + /** Show the Current Status of Dynamic DNS Function. Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + this.GetDDnsClientStatus = function () { + return _this.CallAsync("GetDDnsClientStatus", new VpnDDnsClientStatus()); + }; + /** Set the Dynamic DNS Hostname. You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + this.ChangeDDnsClientHostname = function (in_param) { + return _this.CallAsync("ChangeDDnsClientHostname", in_param); + }; + /** Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server. You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.RegenerateServerCert = function (in_param) { + return _this.CallAsync("RegenerateServerCert", in_param); + }; + /** Generate a Sample Setting File for OpenVPN Client. Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.MakeOpenVpnConfigFile = function () { + return _this.CallAsync("MakeOpenVpnConfigFile", new VpnRpcReadLogFile()); + }; + /** Enable / Disable the VPN over ICMP / VPN over DNS Server Function. You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + this.SetSpecialListener = function (in_param) { + return _this.CallAsync("SetSpecialListener", in_param); + }; + /** Get Current Setting of the VPN over ICMP / VPN over DNS Function. Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + this.GetSpecialListener = function () { + return _this.CallAsync("GetSpecialListener", new VpnRpcSpecialListener()); + }; + /** Show the current status of VPN Azure function. Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.GetAzureStatus = function () { + return _this.CallAsync("GetAzureStatus", new VpnRpcAzureStatus()); + }; + /** Enable / Disable VPN Azure Function. Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + this.SetAzureStatus = function (in_param) { + return _this.CallAsync("SetAzureStatus", in_param); + }; + /** Get the Proxy Settings for Connecting to the DDNS server. */ + this.GetDDnsInternetSettng = function () { + return _this.CallAsync("GetDDnsInternetSettng", new VpnInternetSetting()); + }; + /** Set the Proxy Settings for Connecting to the DDNS server. */ + this.SetDDnsInternetSettng = function (in_param) { + return _this.CallAsync("SetDDnsInternetSettng", in_param); + }; + /** Set the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */ + this.SetVgsConfig = function (in_param) { + return _this.CallAsync("SetVgsConfig", in_param); + }; + /** Get the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */ + this.GetVgsConfig = function () { + return _this.CallAsync("GetVgsConfig", new VpnVgsConfig()); + }; + var headers = {}; + var send_credentials = false; + nodejs_https_client_reject_untrusted_server_cert = is_null(nodejs_https_client_reject_untrusted_server_cert) ? false : nodejs_https_client_reject_untrusted_server_cert; + if (is_null(vpnserver_hostname)) { + this.rpc_url = "/api/"; + send_credentials = true; + } + else { + if (is_null(vpnserver_port)) + vpnserver_port = 443; + this.rpc_url = "https://" + vpnserver_hostname + ":" + vpnserver_port + "/api/"; + headers["X-VPNADMIN-HUBNAME"] = is_null(hubname) ? "" : hubname; + headers["X-VPNADMIN-PASSWORD"] = is_null(password) ? "" : password; + } + if (is_null(nodejs_https_client_reject_untrusted_server_cert)) + nodejs_https_client_reject_untrusted_server_cert = false; + this.rpc_client = new JsonRpcClient(this.rpc_url, headers, send_credentials, nodejs_https_client_reject_untrusted_server_cert); + } + /** Determine if this JavaScript environment is on the Node.js or not. */ + VpnServerRpc.IsNodeJS = function () { + return is_node_js; + }; + /** Set the debug mode flag */ + VpnServerRpc.SetDebugMode = function (flag) { + debug_mode = flag; + }; + // -- Utility functions -- + /** Call a RPC procedure */ + VpnServerRpc.prototype.CallAsync = function (method_name, request) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.rpc_client.CallAsync(method_name, request)]; + case 1: + response = _a.sent(); + return [2 /*return*/, response]; + } + }); + }); + }; + return VpnServerRpc; +}()); +exports.VpnServerRpc = VpnServerRpc; +// --- Types --- +/** IP Protocol Numbers */ +var VpnIpProtocolNumber; +(function (VpnIpProtocolNumber) { + /** ICMP for IPv4 */ + VpnIpProtocolNumber[VpnIpProtocolNumber["ICMPv4"] = 1] = "ICMPv4"; + /** TCP */ + VpnIpProtocolNumber[VpnIpProtocolNumber["TCP"] = 6] = "TCP"; + /** UDP */ + VpnIpProtocolNumber[VpnIpProtocolNumber["UDP"] = 17] = "UDP"; + /** ICMP for IPv6 */ + VpnIpProtocolNumber[VpnIpProtocolNumber["ICMPv6"] = 58] = "ICMPv6"; +})(VpnIpProtocolNumber = exports.VpnIpProtocolNumber || (exports.VpnIpProtocolNumber = {})); +/** The body of the Access list */ +var VpnAccess = /** @class */ (function () { + /** Constructor for the 'VpnAccess' class: The body of the Access list */ + function VpnAccess(init) { + /** ID */ + this.Id_u32 = 0; + /** Specify a description (note) for this rule */ + this.Note_utf = ""; + /** Enabled flag (true: enabled, false: disabled) */ + this.Active_bool = false; + /** Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. */ + this.Priority_u32 = 0; + /** The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. */ + this.Discard_bool = false; + /** The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. */ + this.IsIPv6_bool = false; + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. */ + this.SrcIpAddress_ip = ""; + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. */ + this.SrcSubnetMask_ip = ""; + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. */ + this.DestIpAddress_ip = ""; + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. */ + this.DestSubnetMask_ip = ""; + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. */ + this.SrcIpAddress6_bin = new Uint8Array([]); + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. */ + this.SrcSubnetMask6_bin = new Uint8Array([]); + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. */ + this.DestIpAddress6_bin = new Uint8Array([]); + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. */ + this.DestSubnetMask6_bin = new Uint8Array([]); + /** The IP protocol number */ + this.Protocol_u32 = 0; + /** The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + this.SrcPortStart_u32 = 0; + /** The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + this.SrcPortEnd_u32 = 0; + /** The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + this.DestPortStart_u32 = 0; + /** The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + this.DestPortEnd_u32 = 0; + /** Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. */ + this.SrcUsername_str = ""; + /** Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. */ + this.DestUsername_str = ""; + /** Specify true if you want to check the source MAC address. */ + this.CheckSrcMac_bool = false; + /** Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */ + this.SrcMacAddress_bin = new Uint8Array([]); + /** Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */ + this.SrcMacMask_bin = new Uint8Array([]); + /** Specify true if you want to check the destination MAC address. */ + this.CheckDstMac_bool = false; + /** Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */ + this.DstMacAddress_bin = new Uint8Array([]); + /** Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */ + this.DstMacMask_bin = new Uint8Array([]); + /** Specify true if you want to check the state of the TCP connection. */ + this.CheckTcpState_bool = false; + /** Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. */ + this.Established_bool = false; + /** Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. */ + this.Delay_u32 = 0; + /** Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. */ + this.Jitter_u32 = 0; + /** Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. */ + this.Loss_u32 = 0; + /** The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. */ + this.RedirectUrl_str = ""; + Object.assign(this, init); + } + return VpnAccess; +}()); +exports.VpnAccess = VpnAccess; +/** Add an item to Access List */ +var VpnRpcAddAccess = /** @class */ (function () { + /** Constructor for the 'VpnRpcAddAccess' class: Add an item to Access List */ + function VpnRpcAddAccess(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Access list (Must be a single item) */ + this.AccessListSingle = []; + Object.assign(this, init); + } + return VpnRpcAddAccess; +}()); +exports.VpnRpcAddAccess = VpnRpcAddAccess; +/** Add CA to HUB */ +var VpnRpcHubAddCA = /** @class */ (function () { + /** Constructor for the 'VpnRpcHubAddCA' class: Add CA to HUB */ + function VpnRpcHubAddCA(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** The body of the X.509 certificate */ + this.Cert_bin = new Uint8Array([]); + Object.assign(this, init); + } + return VpnRpcHubAddCA; +}()); +exports.VpnRpcHubAddCA = VpnRpcHubAddCA; +/** CRL entry */ +var VpnRpcCrl = /** @class */ (function () { + /** Constructor for the 'VpnRpcCrl' class: CRL entry */ + function VpnRpcCrl(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Key ID */ + this.Key_u32 = 0; + /** CN, optional */ + this.CommonName_utf = ""; + /** O, optional */ + this.Organization_utf = ""; + /** OU, optional */ + this.Unit_utf = ""; + /** C, optional */ + this.Country_utf = ""; + /** ST, optional */ + this.State_utf = ""; + /** L, optional */ + this.Local_utf = ""; + /** Serial, optional */ + this.Serial_bin = new Uint8Array([]); + /** MD5 Digest, optional */ + this.DigestMD5_bin = new Uint8Array([]); + /** SHA1 Digest, optional */ + this.DigestSHA1_bin = new Uint8Array([]); + Object.assign(this, init); + } + return VpnRpcCrl; +}()); +exports.VpnRpcCrl = VpnRpcCrl; +/** EtherIP key list entry */ +var VpnEtherIpId = /** @class */ (function () { + /** Constructor for the 'VpnEtherIpId' class: EtherIP key list entry */ + function VpnEtherIpId(init) { + /** Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. */ + this.Id_str = ""; + /** Specify the name of the Virtual Hub to connect. */ + this.HubName_str = ""; + /** Specify the username to login to the destination Virtual Hub. */ + this.UserName_str = ""; + /** Specify the password to login to the destination Virtual Hub. */ + this.Password_str = ""; + Object.assign(this, init); + } + return VpnEtherIpId; +}()); +exports.VpnEtherIpId = VpnEtherIpId; +/** Layer-3 virtual interface */ +var VpnRpcL3If = /** @class */ (function () { + /** Constructor for the 'VpnRpcL3If' class: Layer-3 virtual interface */ + function VpnRpcL3If(init) { + /** L3 switch name */ + this.Name_str = ""; + /** Virtual HUB name */ + this.HubName_str = ""; + /** IP address */ + this.IpAddress_ip = ""; + /** Subnet mask */ + this.SubnetMask_ip = ""; + Object.assign(this, init); + } + return VpnRpcL3If; +}()); +exports.VpnRpcL3If = VpnRpcL3If; +/** Layer-3 switch */ +var VpnRpcL3Sw = /** @class */ (function () { + /** Constructor for the 'VpnRpcL3Sw' class: Layer-3 switch */ + function VpnRpcL3Sw(init) { + /** Layer-3 Switch name */ + this.Name_str = ""; + Object.assign(this, init); + } + return VpnRpcL3Sw; +}()); +exports.VpnRpcL3Sw = VpnRpcL3Sw; +/** Routing table */ +var VpnRpcL3Table = /** @class */ (function () { + /** Constructor for the 'VpnRpcL3Table' class: Routing table */ + function VpnRpcL3Table(init) { + /** L3 switch name */ + this.Name_str = ""; + /** Network address */ + this.NetworkAddress_ip = ""; + /** Subnet mask */ + this.SubnetMask_ip = ""; + /** Gateway address */ + this.GatewayAddress_ip = ""; + /** Metric */ + this.Metric_u32 = 0; + Object.assign(this, init); + } + return VpnRpcL3Table; +}()); +exports.VpnRpcL3Table = VpnRpcL3Table; +/** Generic parameter to contain u32, u64, ascii_string and unicode string */ +var VpnRpcTest = /** @class */ (function () { + /** Constructor for the 'VpnRpcTest' class: Generic parameter to contain u32, u64, ascii_string and unicode string */ + function VpnRpcTest(init) { + /** A 32-bit integer field */ + this.IntValue_u32 = 0; + /** A 64-bit integer field */ + this.Int64Value_u64 = 0; + /** An Ascii string field */ + this.StrValue_str = ""; + /** An UTF-8 string field */ + this.UniStrValue_utf = ""; + Object.assign(this, init); + } + return VpnRpcTest; +}()); +exports.VpnRpcTest = VpnRpcTest; +/** Local Bridge list item */ +var VpnRpcLocalBridge = /** @class */ (function () { + /** Constructor for the 'VpnRpcLocalBridge' class: Local Bridge list item */ + function VpnRpcLocalBridge(init) { + /** Physical Ethernet device name */ + this.DeviceName_str = ""; + /** The Virtual Hub name */ + this.HubNameLB_str = ""; + /** Online flag */ + this.Online_bool = false; + /** Running flag */ + this.Active_bool = false; + /** Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). */ + this.TapMode_bool = false; + Object.assign(this, init); + } + return VpnRpcLocalBridge; +}()); +exports.VpnRpcLocalBridge = VpnRpcLocalBridge; +/** Create, configure, and get the group */ +var VpnRpcSetGroup = /** @class */ (function () { + /** Constructor for the 'VpnRpcSetGroup' class: Create, configure, and get the group */ + function VpnRpcSetGroup(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** The group name */ + this.Name_str = ""; + /** Optional real name (full name) of the group, allow using any Unicode characters */ + this.Realname_utf = ""; + /** Optional, specify a description of the group */ + this.Note_utf = ""; + /** Number of broadcast packets (Recv) */ + this["Recv.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Recv) */ + this["Recv.BroadcastCount_u64"] = 0; + /** Unicast count (Recv) */ + this["Recv.UnicastBytes_u64"] = 0; + /** Unicast bytes (Recv) */ + this["Recv.UnicastCount_u64"] = 0; + /** Number of broadcast packets (Send) */ + this["Send.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Send) */ + this["Send.BroadcastCount_u64"] = 0; + /** Unicast bytes (Send) */ + this["Send.UnicastBytes_u64"] = 0; + /** Unicast bytes (Send) */ + this["Send.UnicastCount_u64"] = 0; + /** The flag whether to use security policy */ + this.UsePolicy_bool = false; + /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */ + this["policy:Access_bool"] = false; + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + this["policy:DHCPFilter_bool"] = false; + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + this["policy:DHCPNoServer_bool"] = false; + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + this["policy:DHCPForce_bool"] = false; + /** Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. */ + this["policy:NoBridge_bool"] = false; + /** Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + this["policy:NoRouting_bool"] = false; + /** Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + this["policy:CheckMac_bool"] = false; + /** Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + this["policy:CheckIP_bool"] = false; + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + this["policy:ArpDhcpOnly_bool"] = false; + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + this["policy:PrivacyFilter_bool"] = false; + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + this["policy:NoServer_bool"] = false; + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + this["policy:NoBroadcastLimiter_bool"] = false; + /** Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. */ + this["policy:MonitorPort_bool"] = false; + /** Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. */ + this["policy:MaxConnection_u32"] = 0; + /** Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. */ + this["policy:TimeOut_u32"] = 0; + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + this["policy:MaxMac_u32"] = 0; + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + this["policy:MaxIP_u32"] = 0; + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + this["policy:MaxUpload_u32"] = 0; + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + this["policy:MaxDownload_u32"] = 0; + /** Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. */ + this["policy:FixPassword_bool"] = false; + /** Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. */ + this["policy:MultiLogins_u32"] = 0; + /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */ + this["policy:NoQoS_bool"] = false; + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + this["policy:RSandRAFilter_bool"] = false; + /** Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. */ + this["policy:RAFilter_bool"] = false; + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + this["policy:DHCPv6Filter_bool"] = false; + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + this["policy:DHCPv6NoServer_bool"] = false; + /** Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + this["policy:NoRoutingV6_bool"] = false; + /** Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + this["policy:CheckIPv6_bool"] = false; + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + this["policy:NoServerV6_bool"] = false; + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + this["policy:MaxIPv6_u32"] = 0; + /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + this["policy:NoSavePassword_bool"] = false; + /** Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + this["policy:AutoDisconnect_u32"] = 0; + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + this["policy:FilterIPv4_bool"] = false; + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + this["policy:FilterIPv6_bool"] = false; + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + this["policy:FilterNonIP_bool"] = false; + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + this["policy:NoIPv6DefaultRouterInRA_bool"] = false; + /** Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + this["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"] = false; + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + this["policy:VLanId_u32"] = 0; + /** Security policy: Whether version 3.0 (must be true) */ + this["policy:Ver3_bool"] = false; + Object.assign(this, init); + } + return VpnRpcSetGroup; +}()); +exports.VpnRpcSetGroup = VpnRpcSetGroup; +/** Hub types */ +var VpnRpcHubType; +(function (VpnRpcHubType) { + /** Stand-alone HUB */ + VpnRpcHubType[VpnRpcHubType["Standalone"] = 0] = "Standalone"; + /** Static HUB */ + VpnRpcHubType[VpnRpcHubType["FarmStatic"] = 1] = "FarmStatic"; + /** Dynamic HUB */ + VpnRpcHubType[VpnRpcHubType["FarmDynamic"] = 2] = "FarmDynamic"; +})(VpnRpcHubType = exports.VpnRpcHubType || (exports.VpnRpcHubType = {})); +/** Create a HUB */ +var VpnRpcCreateHub = /** @class */ (function () { + /** Constructor for the 'VpnRpcCreateHub' class: Create a HUB */ + function VpnRpcCreateHub(init) { + /** Specify the name of the Virtual Hub to create / update. */ + this.HubName_str = ""; + /** Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. */ + this.AdminPasswordPlainText_str = ""; + /** Online flag */ + this.Online_bool = false; + /** Maximum number of VPN sessions */ + this.MaxSession_u32 = 0; + /** No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. */ + this.NoEnum_bool = false; + /** Type of the Virtual Hub (Valid only for Clustered VPN Servers) */ + this.HubType_u32 = 0; + Object.assign(this, init); + } + return VpnRpcCreateHub; +}()); +exports.VpnRpcCreateHub = VpnRpcCreateHub; +var VpnRpcClientAuthType; +(function (VpnRpcClientAuthType) { + /** Anonymous authentication */ + VpnRpcClientAuthType[VpnRpcClientAuthType["Anonymous"] = 0] = "Anonymous"; + /** SHA-0 hashed password authentication */ + VpnRpcClientAuthType[VpnRpcClientAuthType["SHA0_Hashed_Password"] = 1] = "SHA0_Hashed_Password"; + /** Plain password authentication */ + VpnRpcClientAuthType[VpnRpcClientAuthType["PlainPassword"] = 2] = "PlainPassword"; + /** Certificate authentication */ + VpnRpcClientAuthType[VpnRpcClientAuthType["Cert"] = 3] = "Cert"; +})(VpnRpcClientAuthType = exports.VpnRpcClientAuthType || (exports.VpnRpcClientAuthType = {})); +/** Create and set of link */ +var VpnRpcCreateLink = /** @class */ (function () { + /** Constructor for the 'VpnRpcCreateLink' class: Create and set of link */ + function VpnRpcCreateLink(init) { + /** The Virtual Hub name */ + this.HubName_Ex_str = ""; + /** Online flag */ + this.Online_bool = false; + /** The flag to enable validation for the server certificate */ + this.CheckServerCert_bool = false; + /** The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. */ + this.ServerCert_bin = new Uint8Array([]); + /** Client Option Parameters: Specify the name of the Cascade Connection */ + this.AccountName_utf = ""; + /** Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. */ + this.Hostname_str = ""; + /** Client Option Parameters: Specify the port number of the destination VPN Server. */ + this.Port_u32 = 0; + /** Client Option Parameters: The type of the proxy server */ + this.ProxyType_u32 = 0; + /** Client Option Parameters: The hostname or IP address of the proxy server name */ + this.ProxyName_str = ""; + /** Client Option Parameters: The port number of the proxy server */ + this.ProxyPort_u32 = 0; + /** Client Option Parameters: The username to connect to the proxy server */ + this.ProxyUsername_str = ""; + /** Client Option Parameters: The password to connect to the proxy server */ + this.ProxyPassword_str = ""; + /** Client Option Parameters: The Virtual Hub on the destination VPN Server */ + this.HubName_str = ""; + /** Client Option Parameters: Number of TCP Connections to Use in VPN Communication */ + this.MaxConnection_u32 = 0; + /** Client Option Parameters: The flag to enable the encryption on the communication */ + this.UseEncrypt_bool = false; + /** Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection */ + this.UseCompress_bool = false; + /** Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. */ + this.HalfConnection_bool = false; + /** Client Option Parameters: Connection attempt interval when additional connection will be established */ + this.AdditionalConnectionInterval_u32 = 0; + /** Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) */ + this.ConnectionDisconnectSpan_u32 = 0; + /** Client Option Parameters: Disable QoS Control Function if the value is true */ + this.DisableQoS_bool = false; + /** Client Option Parameters: Do not use TLS 1.x of the value is true */ + this.NoTls1_bool = false; + /** Client Option Parameters: Do not use UDP acceleration mode if the value is true */ + this.NoUdpAcceleration_bool = false; + /** Authentication type */ + this.AuthType_u32 = 0; + /** User name */ + this.Username_str = ""; + /** SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). */ + this.HashedPassword_bin = new Uint8Array([]); + /** Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). */ + this.PlainPassword_str = ""; + /** Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */ + this.ClientX_bin = new Uint8Array([]); + /** Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */ + this.ClientK_bin = new Uint8Array([]); + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + this["policy:DHCPFilter_bool"] = false; + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + this["policy:DHCPNoServer_bool"] = false; + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + this["policy:DHCPForce_bool"] = false; + /** Security policy: Prohibit the duplicate MAC address */ + this.SecPol_CheckMac_bool = false; + /** Security policy: Prohibit a duplicate IP address (IPv4) */ + this.SecPol_CheckIP_bool = false; + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + this["policy:ArpDhcpOnly_bool"] = false; + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + this["policy:PrivacyFilter_bool"] = false; + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + this["policy:NoServer_bool"] = false; + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + this["policy:NoBroadcastLimiter_bool"] = false; + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + this["policy:MaxMac_u32"] = 0; + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + this["policy:MaxIP_u32"] = 0; + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + this["policy:MaxUpload_u32"] = 0; + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + this["policy:MaxDownload_u32"] = 0; + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + this["policy:RSandRAFilter_bool"] = false; + /** Security policy: Filter the router advertisement packet (IPv6) */ + this.SecPol_RAFilter_bool = false; + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + this["policy:DHCPv6Filter_bool"] = false; + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + this["policy:DHCPv6NoServer_bool"] = false; + /** Security policy: Prohibit the duplicate IP address (IPv6) */ + this.SecPol_CheckIPv6_bool = false; + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + this["policy:NoServerV6_bool"] = false; + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + this["policy:MaxIPv6_u32"] = 0; + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + this["policy:FilterIPv4_bool"] = false; + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + this["policy:FilterIPv6_bool"] = false; + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + this["policy:FilterNonIP_bool"] = false; + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + this["policy:NoIPv6DefaultRouterInRA_bool"] = false; + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + this["policy:VLanId_u32"] = 0; + /** Security policy: Whether version 3.0 (must be true) */ + this["policy:Ver3_bool"] = false; + Object.assign(this, init); + } + return VpnRpcCreateLink; +}()); +exports.VpnRpcCreateLink = VpnRpcCreateLink; +/** Listener */ +var VpnRpcListener = /** @class */ (function () { + /** Constructor for the 'VpnRpcListener' class: Listener */ + function VpnRpcListener(init) { + /** Port number (Range: 1 - 65535) */ + this.Port_u32 = 0; + /** Active state */ + this.Enable_bool = false; + Object.assign(this, init); + } + return VpnRpcListener; +}()); +exports.VpnRpcListener = VpnRpcListener; +/** User authentication type (server side) */ +var VpnRpcUserAuthType; +(function (VpnRpcUserAuthType) { + /** Anonymous authentication */ + VpnRpcUserAuthType[VpnRpcUserAuthType["Anonymous"] = 0] = "Anonymous"; + /** Password authentication */ + VpnRpcUserAuthType[VpnRpcUserAuthType["Password"] = 1] = "Password"; + /** User certificate authentication */ + VpnRpcUserAuthType[VpnRpcUserAuthType["UserCert"] = 2] = "UserCert"; + /** Root certificate which is issued by trusted Certificate Authority */ + VpnRpcUserAuthType[VpnRpcUserAuthType["RootCert"] = 3] = "RootCert"; + /** Radius authentication */ + VpnRpcUserAuthType[VpnRpcUserAuthType["Radius"] = 4] = "Radius"; + /** Windows NT authentication */ + VpnRpcUserAuthType[VpnRpcUserAuthType["NTDomain"] = 5] = "NTDomain"; +})(VpnRpcUserAuthType = exports.VpnRpcUserAuthType || (exports.VpnRpcUserAuthType = {})); +/** Create, configure, and get the user */ +var VpnRpcSetUser = /** @class */ (function () { + /** Constructor for the 'VpnRpcSetUser' class: Create, configure, and get the user */ + function VpnRpcSetUser(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Specify the user name of the user */ + this.Name_str = ""; + /** Assigned group name for the user */ + this.GroupName_str = ""; + /** Optional real name (full name) of the user, allow using any Unicode characters */ + this.Realname_utf = ""; + /** Optional User Description */ + this.Note_utf = ""; + /** Creation date and time */ + this.CreatedTime_dt = new Date(); + /** Last modified date and time */ + this.UpdatedTime_dt = new Date(); + /** Expiration date and time */ + this.ExpireTime_dt = new Date(); + /** Authentication method of the user */ + this.AuthType_u32 = 0; + /** User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. */ + this.Auth_Password_str = ""; + /** User certificate, valid only if AuthType_u32 == UserCert(2). */ + this.UserX_bin = new Uint8Array([]); + /** Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). */ + this.Serial_bin = new Uint8Array([]); + /** Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). */ + this.CommonName_utf = ""; + /** Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). */ + this.RadiusUsername_utf = ""; + /** Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). */ + this.NtUsername_utf = ""; + /** Number of total logins of the user */ + this.NumLogin_u32 = 0; + /** Number of broadcast packets (Recv) */ + this["Recv.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Recv) */ + this["Recv.BroadcastCount_u64"] = 0; + /** Unicast count (Recv) */ + this["Recv.UnicastBytes_u64"] = 0; + /** Unicast bytes (Recv) */ + this["Recv.UnicastCount_u64"] = 0; + /** Number of broadcast packets (Send) */ + this["Send.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Send) */ + this["Send.BroadcastCount_u64"] = 0; + /** Unicast bytes (Send) */ + this["Send.UnicastBytes_u64"] = 0; + /** Unicast bytes (Send) */ + this["Send.UnicastCount_u64"] = 0; + /** The flag whether to use security policy */ + this.UsePolicy_bool = false; + /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */ + this["policy:Access_bool"] = false; + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + this["policy:DHCPFilter_bool"] = false; + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + this["policy:DHCPNoServer_bool"] = false; + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + this["policy:DHCPForce_bool"] = false; + /** Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. */ + this["policy:NoBridge_bool"] = false; + /** Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + this["policy:NoRouting_bool"] = false; + /** Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + this["policy:CheckMac_bool"] = false; + /** Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + this["policy:CheckIP_bool"] = false; + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + this["policy:ArpDhcpOnly_bool"] = false; + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + this["policy:PrivacyFilter_bool"] = false; + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + this["policy:NoServer_bool"] = false; + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + this["policy:NoBroadcastLimiter_bool"] = false; + /** Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. */ + this["policy:MonitorPort_bool"] = false; + /** Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. */ + this["policy:MaxConnection_u32"] = 0; + /** Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. */ + this["policy:TimeOut_u32"] = 0; + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + this["policy:MaxMac_u32"] = 0; + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + this["policy:MaxIP_u32"] = 0; + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + this["policy:MaxUpload_u32"] = 0; + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + this["policy:MaxDownload_u32"] = 0; + /** Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. */ + this["policy:FixPassword_bool"] = false; + /** Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. */ + this["policy:MultiLogins_u32"] = 0; + /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */ + this["policy:NoQoS_bool"] = false; + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + this["policy:RSandRAFilter_bool"] = false; + /** Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. */ + this["policy:RAFilter_bool"] = false; + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + this["policy:DHCPv6Filter_bool"] = false; + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + this["policy:DHCPv6NoServer_bool"] = false; + /** Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + this["policy:NoRoutingV6_bool"] = false; + /** Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + this["policy:CheckIPv6_bool"] = false; + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + this["policy:NoServerV6_bool"] = false; + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + this["policy:MaxIPv6_u32"] = 0; + /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + this["policy:NoSavePassword_bool"] = false; + /** Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + this["policy:AutoDisconnect_u32"] = 0; + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + this["policy:FilterIPv4_bool"] = false; + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + this["policy:FilterIPv6_bool"] = false; + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + this["policy:FilterNonIP_bool"] = false; + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + this["policy:NoIPv6DefaultRouterInRA_bool"] = false; + /** Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + this["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"] = false; + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + this["policy:VLanId_u32"] = 0; + /** Security policy: Whether version 3.0 (must be true) */ + this["policy:Ver3_bool"] = false; + Object.assign(this, init); + } + return VpnRpcSetUser; +}()); +exports.VpnRpcSetUser = VpnRpcSetUser; +/** Delete the access list */ +var VpnRpcDeleteAccess = /** @class */ (function () { + /** Constructor for the 'VpnRpcDeleteAccess' class: Delete the access list */ + function VpnRpcDeleteAccess(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** ID */ + this.Id_u32 = 0; + Object.assign(this, init); + } + return VpnRpcDeleteAccess; +}()); +exports.VpnRpcDeleteAccess = VpnRpcDeleteAccess; +/** Delete the CA of HUB */ +var VpnRpcHubDeleteCA = /** @class */ (function () { + /** Constructor for the 'VpnRpcHubDeleteCA' class: Delete the CA of HUB */ + function VpnRpcHubDeleteCA(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Certificate key id to be deleted */ + this.Key_u32 = 0; + Object.assign(this, init); + } + return VpnRpcHubDeleteCA; +}()); +exports.VpnRpcHubDeleteCA = VpnRpcHubDeleteCA; +/** Deleting a user or group */ +var VpnRpcDeleteUser = /** @class */ (function () { + /** Constructor for the 'VpnRpcDeleteUser' class: Deleting a user or group */ + function VpnRpcDeleteUser(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** User or group name */ + this.Name_str = ""; + Object.assign(this, init); + } + return VpnRpcDeleteUser; +}()); +exports.VpnRpcDeleteUser = VpnRpcDeleteUser; +/** Delete the HUB */ +var VpnRpcDeleteHub = /** @class */ (function () { + /** Constructor for the 'VpnRpcDeleteHub' class: Delete the HUB */ + function VpnRpcDeleteHub(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + Object.assign(this, init); + } + return VpnRpcDeleteHub; +}()); +exports.VpnRpcDeleteHub = VpnRpcDeleteHub; +/** Delete the table */ +var VpnRpcDeleteTable = /** @class */ (function () { + /** Constructor for the 'VpnRpcDeleteTable' class: Delete the table */ + function VpnRpcDeleteTable(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Key ID */ + this.Key_u32 = 0; + Object.assign(this, init); + } + return VpnRpcDeleteTable; +}()); +exports.VpnRpcDeleteTable = VpnRpcDeleteTable; +/** Specify the Link */ +var VpnRpcLink = /** @class */ (function () { + /** Constructor for the 'VpnRpcLink' class: Specify the Link */ + function VpnRpcLink(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** The name of the cascade connection */ + this.AccountName_utf = ""; + Object.assign(this, init); + } + return VpnRpcLink; +}()); +exports.VpnRpcLink = VpnRpcLink; +/** Disconnect the session */ +var VpnRpcDeleteSession = /** @class */ (function () { + /** Constructor for the 'VpnRpcDeleteSession' class: Disconnect the session */ + function VpnRpcDeleteSession(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Session name */ + this.Name_str = ""; + Object.assign(this, init); + } + return VpnRpcDeleteSession; +}()); +exports.VpnRpcDeleteSession = VpnRpcDeleteSession; +/** Specify the HUB */ +var VpnRpcHub = /** @class */ (function () { + /** Constructor for the 'VpnRpcHub' class: Specify the HUB */ + function VpnRpcHub(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + Object.assign(this, init); + } + return VpnRpcHub; +}()); +exports.VpnRpcHub = VpnRpcHub; +/** Disconnect a connection */ +var VpnRpcDisconnectConnection = /** @class */ (function () { + /** Constructor for the 'VpnRpcDisconnectConnection' class: Disconnect a connection */ + function VpnRpcDisconnectConnection(init) { + /** Connection name */ + this.Name_str = ""; + Object.assign(this, init); + } + return VpnRpcDisconnectConnection; +}()); +exports.VpnRpcDisconnectConnection = VpnRpcDisconnectConnection; +/** Enumeration of the access list */ +var VpnRpcEnumAccessList = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumAccessList' class: Enumeration of the access list */ + function VpnRpcEnumAccessList(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Access list */ + this.AccessList = []; + Object.assign(this, init); + } + return VpnRpcEnumAccessList; +}()); +exports.VpnRpcEnumAccessList = VpnRpcEnumAccessList; +/** CA enumeration items of HUB */ +var VpnRpcHubEnumCAItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcHubEnumCAItem' class: CA enumeration items of HUB */ + function VpnRpcHubEnumCAItem(init) { + /** The key id of the item */ + this.Key_u32 = 0; + /** Subject */ + this.SubjectName_utf = ""; + /** Issuer */ + this.IssuerName_utf = ""; + /** Expiration date */ + this.Expires_dt = new Date(); + Object.assign(this, init); + } + return VpnRpcHubEnumCAItem; +}()); +exports.VpnRpcHubEnumCAItem = VpnRpcHubEnumCAItem; +/** CA enumeration of HUB */ +var VpnRpcHubEnumCA = /** @class */ (function () { + /** Constructor for the 'VpnRpcHubEnumCA' class: CA enumeration of HUB */ + function VpnRpcHubEnumCA(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** The list of CA */ + this.CAList = []; + Object.assign(this, init); + } + return VpnRpcHubEnumCA; +}()); +exports.VpnRpcHubEnumCA = VpnRpcHubEnumCA; +/** Type of connection */ +var VpnRpcConnectionType; +(function (VpnRpcConnectionType) { + /** VPN Client */ + VpnRpcConnectionType[VpnRpcConnectionType["Client"] = 0] = "Client"; + /** During initialization */ + VpnRpcConnectionType[VpnRpcConnectionType["Init"] = 1] = "Init"; + /** Login connection */ + VpnRpcConnectionType[VpnRpcConnectionType["Login"] = 2] = "Login"; + /** Additional connection */ + VpnRpcConnectionType[VpnRpcConnectionType["Additional"] = 3] = "Additional"; + /** RPC for server farm */ + VpnRpcConnectionType[VpnRpcConnectionType["FarmRpc"] = 4] = "FarmRpc"; + /** RPC for Management */ + VpnRpcConnectionType[VpnRpcConnectionType["AdminRpc"] = 5] = "AdminRpc"; + /** HUB enumeration */ + VpnRpcConnectionType[VpnRpcConnectionType["EnumHub"] = 6] = "EnumHub"; + /** Password change */ + VpnRpcConnectionType[VpnRpcConnectionType["Password"] = 7] = "Password"; + /** SSTP */ + VpnRpcConnectionType[VpnRpcConnectionType["SSTP"] = 8] = "SSTP"; + /** OpenVPN */ + VpnRpcConnectionType[VpnRpcConnectionType["OpenVPN"] = 9] = "OpenVPN"; +})(VpnRpcConnectionType = exports.VpnRpcConnectionType || (exports.VpnRpcConnectionType = {})); +/** Connection enumeration items */ +var VpnRpcEnumConnectionItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumConnectionItem' class: Connection enumeration items */ + function VpnRpcEnumConnectionItem(init) { + /** Connection name */ + this.Name_str = ""; + /** Host name */ + this.Hostname_str = ""; + /** IP address */ + this.Ip_ip = ""; + /** Port number */ + this.Port_u32 = 0; + /** Connected time */ + this.ConnectedTime_dt = new Date(); + /** Connection type */ + this.Type_u32 = 0; + Object.assign(this, init); + } + return VpnRpcEnumConnectionItem; +}()); +exports.VpnRpcEnumConnectionItem = VpnRpcEnumConnectionItem; +/** Connection enumeration */ +var VpnRpcEnumConnection = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumConnection' class: Connection enumeration */ + function VpnRpcEnumConnection(init) { + /** Number of connections */ + this.NumConnection_u32 = 0; + /** Connection list */ + this.ConnectionList = []; + Object.assign(this, init); + } + return VpnRpcEnumConnection; +}()); +exports.VpnRpcEnumConnection = VpnRpcEnumConnection; +/** Enum CRL Item */ +var VpnRpcEnumCrlItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumCrlItem' class: Enum CRL Item */ + function VpnRpcEnumCrlItem(init) { + /** Key ID */ + this.Key_u32 = 0; + /** The contents of the CRL item */ + this.CrlInfo_utf = ""; + Object.assign(this, init); + } + return VpnRpcEnumCrlItem; +}()); +exports.VpnRpcEnumCrlItem = VpnRpcEnumCrlItem; +/** Enum CRL */ +var VpnRpcEnumCrl = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumCrl' class: Enum CRL */ + function VpnRpcEnumCrl(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** CRL list */ + this.CRLList = []; + Object.assign(this, init); + } + return VpnRpcEnumCrl; +}()); +exports.VpnRpcEnumCrl = VpnRpcEnumCrl; +/** RPC_ENUM_DHCP_ITEM */ +var VpnRpcEnumDhcpItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumDhcpItem' class: RPC_ENUM_DHCP_ITEM */ + function VpnRpcEnumDhcpItem(init) { + /** ID */ + this.Id_u32 = 0; + /** Lease time */ + this.LeasedTime_dt = new Date(); + /** Expiration date */ + this.ExpireTime_dt = new Date(); + /** MAC address */ + this.MacAddress_bin = new Uint8Array([]); + /** IP address */ + this.IpAddress_ip = ""; + /** Subnet mask */ + this.Mask_u32 = 0; + /** Host name */ + this.Hostname_str = ""; + Object.assign(this, init); + } + return VpnRpcEnumDhcpItem; +}()); +exports.VpnRpcEnumDhcpItem = VpnRpcEnumDhcpItem; +/** RPC_ENUM_DHCP */ +var VpnRpcEnumDhcp = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumDhcp' class: RPC_ENUM_DHCP */ + function VpnRpcEnumDhcp(init) { + /** Virtual Hub Name */ + this.HubName_str = ""; + /** DHCP Item */ + this.DhcpTable = []; + Object.assign(this, init); + } + return VpnRpcEnumDhcp; +}()); +exports.VpnRpcEnumDhcp = VpnRpcEnumDhcp; +/** EtherIP setting list */ +var VpnRpcEnumEtherIpId = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumEtherIpId' class: EtherIP setting list */ + function VpnRpcEnumEtherIpId(init) { + /** Setting list */ + this.Settings = []; + Object.assign(this, init); + } + return VpnRpcEnumEtherIpId; +}()); +exports.VpnRpcEnumEtherIpId = VpnRpcEnumEtherIpId; +/** Ethernet Network Adapters list item */ +var VpnRpcEnumEthItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumEthItem' class: Ethernet Network Adapters list item */ + function VpnRpcEnumEthItem(init) { + /** Device name */ + this.DeviceName_str = ""; + /** Network connection name (description) */ + this.NetworkConnectionName_utf = ""; + Object.assign(this, init); + } + return VpnRpcEnumEthItem; +}()); +exports.VpnRpcEnumEthItem = VpnRpcEnumEthItem; +/** Ethernet Network Adapters list */ +var VpnRpcEnumEth = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumEth' class: Ethernet Network Adapters list */ + function VpnRpcEnumEth(init) { + /** Ethernet Network Adapters list */ + this.EthList = []; + Object.assign(this, init); + } + return VpnRpcEnumEth; +}()); +exports.VpnRpcEnumEth = VpnRpcEnumEth; +/** Server farm members enumeration items */ +var VpnRpcEnumFarmItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumFarmItem' class: Server farm members enumeration items */ + function VpnRpcEnumFarmItem(init) { + /** ID */ + this.Id_u32 = 0; + /** Controller */ + this.Controller_bool = false; + /** Connection time */ + this.ConnectedTime_dt = new Date(); + /** IP address */ + this.Ip_ip = ""; + /** Host name */ + this.Hostname_str = ""; + /** Point */ + this.Point_u32 = 0; + /** Number of sessions */ + this.NumSessions_u32 = 0; + /** Number of TCP connections */ + this.NumTcpConnections_u32 = 0; + /** Number of HUBs */ + this.NumHubs_u32 = 0; + /** Number of assigned client licenses */ + this.AssignedClientLicense_u32 = 0; + /** Number of assigned bridge licenses */ + this.AssignedBridgeLicense_u32 = 0; + Object.assign(this, init); + } + return VpnRpcEnumFarmItem; +}()); +exports.VpnRpcEnumFarmItem = VpnRpcEnumFarmItem; +/** Server farm member enumeration */ +var VpnRpcEnumFarm = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumFarm' class: Server farm member enumeration */ + function VpnRpcEnumFarm(init) { + /** Number of Cluster Members */ + this.NumFarm_u32 = 0; + /** Cluster Members list */ + this.FarmMemberList = []; + Object.assign(this, init); + } + return VpnRpcEnumFarm; +}()); +exports.VpnRpcEnumFarm = VpnRpcEnumFarm; +/** Enumeration items in the group */ +var VpnRpcEnumGroupItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumGroupItem' class: Enumeration items in the group */ + function VpnRpcEnumGroupItem(init) { + /** User name */ + this.Name_str = ""; + /** Real name */ + this.Realname_utf = ""; + /** Note */ + this.Note_utf = ""; + /** Number of users */ + this.NumUsers_u32 = 0; + /** Access denied */ + this.DenyAccess_bool = false; + Object.assign(this, init); + } + return VpnRpcEnumGroupItem; +}()); +exports.VpnRpcEnumGroupItem = VpnRpcEnumGroupItem; +/** Group enumeration */ +var VpnRpcEnumGroup = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumGroup' class: Group enumeration */ + function VpnRpcEnumGroup(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Group list */ + this.GroupList = []; + Object.assign(this, init); + } + return VpnRpcEnumGroup; +}()); +exports.VpnRpcEnumGroup = VpnRpcEnumGroup; +/** Enumeration items of HUB */ +var VpnRpcEnumHubItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumHubItem' class: Enumeration items of HUB */ + function VpnRpcEnumHubItem(init) { + /** The name of the Virtual Hub */ + this.HubName_str = ""; + /** Online state */ + this.Online_bool = false; + /** Type of HUB (Valid only for Clustered VPN Servers) */ + this.HubType_u32 = 0; + /** Number of users */ + this.NumUsers_u32 = 0; + /** Number of registered groups */ + this.NumGroups_u32 = 0; + /** Number of registered sessions */ + this.NumSessions_u32 = 0; + /** Number of current MAC table entries */ + this.NumMacTables_u32 = 0; + /** Number of current IP table entries */ + this.NumIpTables_u32 = 0; + /** Last communication date and time */ + this.LastCommTime_dt = new Date(); + /** Last login date and time */ + this.LastLoginTime_dt = new Date(); + /** Creation date and time */ + this.CreatedTime_dt = new Date(); + /** Number of accumulated logins */ + this.NumLogin_u32 = 0; + /** Whether the traffic information is provided */ + this.IsTrafficFilled_bool = false; + /** Number of broadcast packets (Recv) */ + this["Ex.Recv.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Recv) */ + this["Ex.Recv.BroadcastCount_u64"] = 0; + /** Unicast count (Recv) */ + this["Ex.Recv.UnicastBytes_u64"] = 0; + /** Unicast bytes (Recv) */ + this["Ex.Recv.UnicastCount_u64"] = 0; + /** Number of broadcast packets (Send) */ + this["Ex.Send.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Send) */ + this["Ex.Send.BroadcastCount_u64"] = 0; + /** Unicast bytes (Send) */ + this["Ex.Send.UnicastBytes_u64"] = 0; + /** Unicast bytes (Send) */ + this["Ex.Send.UnicastCount_u64"] = 0; + Object.assign(this, init); + } + return VpnRpcEnumHubItem; +}()); +exports.VpnRpcEnumHubItem = VpnRpcEnumHubItem; +/** Enumeration of HUB */ +var VpnRpcEnumHub = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumHub' class: Enumeration of HUB */ + function VpnRpcEnumHub(init) { + /** Number of Virtual Hubs */ + this.NumHub_u32 = 0; + /** Virtual Hubs */ + this.HubList = []; + Object.assign(this, init); + } + return VpnRpcEnumHub; +}()); +exports.VpnRpcEnumHub = VpnRpcEnumHub; +/** Enumeration items of IP table */ +var VpnRpcEnumIpTableItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumIpTableItem' class: Enumeration items of IP table */ + function VpnRpcEnumIpTableItem(init) { + /** Key ID */ + this.Key_u32 = 0; + /** Session name */ + this.SessionName_str = ""; + /** IP address */ + this.IpAddress_ip = ""; + /** Assigned by the DHCP */ + this.DhcpAllocated_bool = false; + /** Creation date and time */ + this.CreatedTime_dt = new Date(); + /** Updating date */ + this.UpdatedTime_dt = new Date(); + /** Remote items */ + this.RemoteItem_bool = false; + /** Remote host name */ + this.RemoteHostname_str = ""; + Object.assign(this, init); + } + return VpnRpcEnumIpTableItem; +}()); +exports.VpnRpcEnumIpTableItem = VpnRpcEnumIpTableItem; +/** Enumeration of IP table */ +var VpnRpcEnumIpTable = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumIpTable' class: Enumeration of IP table */ + function VpnRpcEnumIpTable(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** MAC table */ + this.IpTable = []; + Object.assign(this, init); + } + return VpnRpcEnumIpTable; +}()); +exports.VpnRpcEnumIpTable = VpnRpcEnumIpTable; +/** Layer-3 interface enumeration */ +var VpnRpcEnumL3If = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumL3If' class: Layer-3 interface enumeration */ + function VpnRpcEnumL3If(init) { + /** Layer-3 switch name */ + this.Name_str = ""; + /** Layer-3 interface list */ + this.L3IFList = []; + Object.assign(this, init); + } + return VpnRpcEnumL3If; +}()); +exports.VpnRpcEnumL3If = VpnRpcEnumL3If; +/** Layer-3 switch enumeration item */ +var VpnRpcEnumL3SwItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumL3SwItem' class: Layer-3 switch enumeration item */ + function VpnRpcEnumL3SwItem(init) { + /** Name of the layer-3 switch */ + this.Name_str = ""; + /** Number of layer-3 switch virtual interfaces */ + this.NumInterfaces_u32 = 0; + /** Number of routing tables */ + this.NumTables_u32 = 0; + /** Activated flag */ + this.Active_bool = false; + /** Online flag */ + this.Online_bool = false; + Object.assign(this, init); + } + return VpnRpcEnumL3SwItem; +}()); +exports.VpnRpcEnumL3SwItem = VpnRpcEnumL3SwItem; +/** Layer-3 switch enumeration */ +var VpnRpcEnumL3Sw = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumL3Sw' class: Layer-3 switch enumeration */ + function VpnRpcEnumL3Sw(init) { + /** Layer-3 switch list */ + this.L3SWList = []; + Object.assign(this, init); + } + return VpnRpcEnumL3Sw; +}()); +exports.VpnRpcEnumL3Sw = VpnRpcEnumL3Sw; +/** Routing table enumeration */ +var VpnRpcEnumL3Table = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumL3Table' class: Routing table enumeration */ + function VpnRpcEnumL3Table(init) { + /** L3 switch name */ + this.Name_str = ""; + /** Routing table item list */ + this.L3Table = []; + Object.assign(this, init); + } + return VpnRpcEnumL3Table; +}()); +exports.VpnRpcEnumL3Table = VpnRpcEnumL3Table; +/** Cascade Connection Enumeration */ +var VpnRpcEnumLinkItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumLinkItem' class: Cascade Connection Enumeration */ + function VpnRpcEnumLinkItem(init) { + /** The name of cascade connection */ + this.AccountName_utf = ""; + /** Online flag */ + this.Online_bool = false; + /** The flag indicates whether the cascade connection is established */ + this.Connected_bool = false; + /** The error last occurred if the cascade connection is in the fail state */ + this.LastError_u32 = 0; + /** Connection completion time */ + this.ConnectedTime_dt = new Date(); + /** Host name of the destination VPN server */ + this.Hostname_str = ""; + /** The Virtual Hub name */ + this.TargetHubName_str = ""; + Object.assign(this, init); + } + return VpnRpcEnumLinkItem; +}()); +exports.VpnRpcEnumLinkItem = VpnRpcEnumLinkItem; +/** Enumeration of the link */ +var VpnRpcEnumLink = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumLink' class: Enumeration of the link */ + function VpnRpcEnumLink(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Number of cascade connections */ + this.NumLink_u32 = 0; + /** The list of cascade connections */ + this.LinkList = []; + Object.assign(this, init); + } + return VpnRpcEnumLink; +}()); +exports.VpnRpcEnumLink = VpnRpcEnumLink; +/** List of listeners item */ +var VpnRpcListenerListItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcListenerListItem' class: List of listeners item */ + function VpnRpcListenerListItem(init) { + /** TCP port number (range: 1 - 65535) */ + this.Ports_u32 = 0; + /** Active state */ + this.Enables_bool = false; + /** The flag to indicate if the error occurred on the listener port */ + this.Errors_bool = false; + Object.assign(this, init); + } + return VpnRpcListenerListItem; +}()); +exports.VpnRpcListenerListItem = VpnRpcListenerListItem; +/** List of listeners */ +var VpnRpcListenerList = /** @class */ (function () { + /** Constructor for the 'VpnRpcListenerList' class: List of listeners */ + function VpnRpcListenerList(init) { + /** List of listener items */ + this.ListenerList = []; + Object.assign(this, init); + } + return VpnRpcListenerList; +}()); +exports.VpnRpcListenerList = VpnRpcListenerList; +/** Local Bridge enumeration */ +var VpnRpcEnumLocalBridge = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumLocalBridge' class: Local Bridge enumeration */ + function VpnRpcEnumLocalBridge(init) { + /** Local Bridge list */ + this.LocalBridgeList = []; + Object.assign(this, init); + } + return VpnRpcEnumLocalBridge; +}()); +exports.VpnRpcEnumLocalBridge = VpnRpcEnumLocalBridge; +/** Log file enumeration */ +var VpnRpcEnumLogFileItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumLogFileItem' class: Log file enumeration */ + function VpnRpcEnumLogFileItem(init) { + /** Server name */ + this.ServerName_str = ""; + /** File path */ + this.FilePath_str = ""; + /** File size */ + this.FileSize_u32 = 0; + /** Last write date */ + this.UpdatedTime_dt = new Date(); + Object.assign(this, init); + } + return VpnRpcEnumLogFileItem; +}()); +exports.VpnRpcEnumLogFileItem = VpnRpcEnumLogFileItem; +/** Log file enumeration */ +var VpnRpcEnumLogFile = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumLogFile' class: Log file enumeration */ + function VpnRpcEnumLogFile(init) { + /** Log file list */ + this.LogFiles = []; + Object.assign(this, init); + } + return VpnRpcEnumLogFile; +}()); +exports.VpnRpcEnumLogFile = VpnRpcEnumLogFile; +/** Enumeration items of the MAC table */ +var VpnRpcEnumMacTableItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumMacTableItem' class: Enumeration items of the MAC table */ + function VpnRpcEnumMacTableItem(init) { + /** Key ID */ + this.Key_u32 = 0; + /** Session name */ + this.SessionName_str = ""; + /** MAC address */ + this.MacAddress_bin = new Uint8Array([]); + /** Creation date and time */ + this.CreatedTime_dt = new Date(); + /** Updating date */ + this.UpdatedTime_dt = new Date(); + /** Remote items */ + this.RemoteItem_bool = false; + /** Remote host name */ + this.RemoteHostname_str = ""; + /** VLAN ID */ + this.VlanId_u32 = 0; + Object.assign(this, init); + } + return VpnRpcEnumMacTableItem; +}()); +exports.VpnRpcEnumMacTableItem = VpnRpcEnumMacTableItem; +/** Enumeration of the MAC table */ +var VpnRpcEnumMacTable = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumMacTable' class: Enumeration of the MAC table */ + function VpnRpcEnumMacTable(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** MAC table */ + this.MacTable = []; + Object.assign(this, init); + } + return VpnRpcEnumMacTable; +}()); +exports.VpnRpcEnumMacTable = VpnRpcEnumMacTable; +/** NAT Entry Protocol Number */ +var VpnRpcNatProtocol; +(function (VpnRpcNatProtocol) { + /** TCP */ + VpnRpcNatProtocol[VpnRpcNatProtocol["TCP"] = 0] = "TCP"; + /** UDP */ + VpnRpcNatProtocol[VpnRpcNatProtocol["UDP"] = 1] = "UDP"; + /** DNS */ + VpnRpcNatProtocol[VpnRpcNatProtocol["DNS"] = 2] = "DNS"; + /** ICMP */ + VpnRpcNatProtocol[VpnRpcNatProtocol["ICMP"] = 3] = "ICMP"; +})(VpnRpcNatProtocol = exports.VpnRpcNatProtocol || (exports.VpnRpcNatProtocol = {})); +/** State of NAT session (TCP) */ +var VpnRpcNatTcpState; +(function (VpnRpcNatTcpState) { + /** Connecting */ + VpnRpcNatTcpState[VpnRpcNatTcpState["Connecting"] = 0] = "Connecting"; + /** Send the RST (Connection failure or disconnected) */ + VpnRpcNatTcpState[VpnRpcNatTcpState["SendReset"] = 1] = "SendReset"; + /** Connection complete */ + VpnRpcNatTcpState[VpnRpcNatTcpState["Connected"] = 2] = "Connected"; + /** Connection established */ + VpnRpcNatTcpState[VpnRpcNatTcpState["Established"] = 3] = "Established"; + /** Wait for socket disconnection */ + VpnRpcNatTcpState[VpnRpcNatTcpState["WaitDisconnect"] = 4] = "WaitDisconnect"; +})(VpnRpcNatTcpState = exports.VpnRpcNatTcpState || (exports.VpnRpcNatTcpState = {})); +/** VpnRpcEnumNat List Item */ +var VpnRpcEnumNatItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumNatItem' class: VpnRpcEnumNat List Item */ + function VpnRpcEnumNatItem(init) { + /** ID */ + this.Id_u32 = 0; + /** Protocol */ + this.Protocol_u32 = 0; + /** Source IP address */ + this.SrcIp_ip = ""; + /** Source host name */ + this.SrcHost_str = ""; + /** Source port number */ + this.SrcPort_u32 = 0; + /** Destination IP address */ + this.DestIp_ip = ""; + /** Destination host name */ + this.DestHost_str = ""; + /** Destination port number */ + this.DestPort_u32 = 0; + /** Connection time */ + this.CreatedTime_dt = new Date(); + /** Last communication time */ + this.LastCommTime_dt = new Date(); + /** Transmission size */ + this.SendSize_u64 = 0; + /** Receive size */ + this.RecvSize_u64 = 0; + /** TCP state */ + this.TcpStatus_u32 = 0; + Object.assign(this, init); + } + return VpnRpcEnumNatItem; +}()); +exports.VpnRpcEnumNatItem = VpnRpcEnumNatItem; +/** RPC_ENUM_NAT */ +var VpnRpcEnumNat = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumNat' class: RPC_ENUM_NAT */ + function VpnRpcEnumNat(init) { + /** Virtual Hub Name */ + this.HubName_str = ""; + /** NAT item */ + this.NatTable = []; + Object.assign(this, init); + } + return VpnRpcEnumNat; +}()); +exports.VpnRpcEnumNat = VpnRpcEnumNat; +/** Enumeration item of VPN session */ +var VpnRpcEnumSessionItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumSessionItem' class: Enumeration item of VPN session */ + function VpnRpcEnumSessionItem(init) { + /** Session name */ + this.Name_str = ""; + /** Remote session */ + this.RemoteSession_bool = false; + /** Remote server name */ + this.RemoteHostname_str = ""; + /** User name */ + this.Username_str = ""; + /** IP address */ + this.ClientIP_ip = ""; + /** Host name */ + this.Hostname_str = ""; + /** Maximum number of underlying TCP connections */ + this.MaxNumTcp_u32 = 0; + /** Number of current underlying TCP connections */ + this.CurrentNumTcp_u32 = 0; + /** Packet size transmitted */ + this.PacketSize_u64 = 0; + /** Number of packets transmitted */ + this.PacketNum_u64 = 0; + /** Is a Cascade VPN session */ + this.LinkMode_bool = false; + /** Is a SecureNAT VPN session */ + this.SecureNATMode_bool = false; + /** Is the VPN session for Local Bridge */ + this.BridgeMode_bool = false; + /** Is a Layer-3 Switch VPN session */ + this.Layer3Mode_bool = false; + /** Is in Bridge Mode */ + this.Client_BridgeMode_bool = false; + /** Is in Monitor Mode */ + this.Client_MonitorMode_bool = false; + /** VLAN ID */ + this.VLanId_u32 = 0; + /** Unique ID of the VPN Session */ + this.UniqueId_bin = new Uint8Array([]); + /** Creation date and time */ + this.CreatedTime_dt = new Date(); + /** Last communication date and time */ + this.LastCommTime_dt = new Date(); + Object.assign(this, init); + } + return VpnRpcEnumSessionItem; +}()); +exports.VpnRpcEnumSessionItem = VpnRpcEnumSessionItem; +/** Enumerate VPN sessions */ +var VpnRpcEnumSession = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumSession' class: Enumerate VPN sessions */ + function VpnRpcEnumSession(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** VPN sessions list */ + this.SessionList = []; + Object.assign(this, init); + } + return VpnRpcEnumSession; +}()); +exports.VpnRpcEnumSession = VpnRpcEnumSession; +/** Enumeration item of user */ +var VpnRpcEnumUserItem = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumUserItem' class: Enumeration item of user */ + function VpnRpcEnumUserItem(init) { + /** User name */ + this.Name_str = ""; + /** Group name */ + this.GroupName_str = ""; + /** Real name */ + this.Realname_utf = ""; + /** Note */ + this.Note_utf = ""; + /** Authentication method */ + this.AuthType_u32 = 0; + /** Number of logins */ + this.NumLogin_u32 = 0; + /** Last login date and time */ + this.LastLoginTime_dt = new Date(); + /** Access denied */ + this.DenyAccess_bool = false; + /** Flag of whether the traffic variable is set */ + this.IsTrafficFilled_bool = false; + /** Flag of whether expiration date variable is set */ + this.IsExpiresFilled_bool = false; + /** Expiration date */ + this.Expires_dt = new Date(); + /** Number of broadcast packets (Recv) */ + this["Ex.Recv.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Recv) */ + this["Ex.Recv.BroadcastCount_u64"] = 0; + /** Unicast count (Recv) */ + this["Ex.Recv.UnicastBytes_u64"] = 0; + /** Unicast bytes (Recv) */ + this["Ex.Recv.UnicastCount_u64"] = 0; + /** Number of broadcast packets (Send) */ + this["Ex.Send.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Send) */ + this["Ex.Send.BroadcastCount_u64"] = 0; + /** Unicast bytes (Send) */ + this["Ex.Send.UnicastBytes_u64"] = 0; + /** Unicast bytes (Send) */ + this["Ex.Send.UnicastCount_u64"] = 0; + Object.assign(this, init); + } + return VpnRpcEnumUserItem; +}()); +exports.VpnRpcEnumUserItem = VpnRpcEnumUserItem; +/** Enumeration of user */ +var VpnRpcEnumUser = /** @class */ (function () { + /** Constructor for the 'VpnRpcEnumUser' class: Enumeration of user */ + function VpnRpcEnumUser(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** User list */ + this.UserList = []; + Object.assign(this, init); + } + return VpnRpcEnumUser; +}()); +exports.VpnRpcEnumUser = VpnRpcEnumUser; +/** Source IP Address Limit List Item */ +var VpnAc = /** @class */ (function () { + /** Constructor for the 'VpnAc' class: Source IP Address Limit List Item */ + function VpnAc(init) { + /** ID */ + this.Id_u32 = 0; + /** Priority */ + this.Priority_u32 = 0; + /** Deny access */ + this.Deny_bool = false; + /** Set true if you want to specify the SubnetMask_ip item. */ + this.Masked_bool = false; + /** IP address */ + this.IpAddress_ip = ""; + /** Subnet mask, valid only if Masked_bool == true */ + this.SubnetMask_ip = ""; + Object.assign(this, init); + } + return VpnAc; +}()); +exports.VpnAc = VpnAc; +/** Source IP Address Limit List */ +var VpnRpcAcList = /** @class */ (function () { + /** Constructor for the 'VpnRpcAcList' class: Source IP Address Limit List */ + function VpnRpcAcList(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Source IP Address Limit List */ + this.ACList = []; + Object.assign(this, init); + } + return VpnRpcAcList; +}()); +exports.VpnRpcAcList = VpnRpcAcList; +/** Message */ +var VpnRpcMsg = /** @class */ (function () { + /** Constructor for the 'VpnRpcMsg' class: Message */ + function VpnRpcMsg(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Message (Unicode strings acceptable) */ + this.Msg_bin = new Uint8Array([]); + Object.assign(this, init); + } + return VpnRpcMsg; +}()); +exports.VpnRpcMsg = VpnRpcMsg; +/** Get / Set the Azure state */ +var VpnRpcAzureStatus = /** @class */ (function () { + /** Constructor for the 'VpnRpcAzureStatus' class: Get / Set the Azure state */ + function VpnRpcAzureStatus(init) { + /** Whether VPN Azure Function is Enabled */ + this.IsEnabled_bool = false; + /** Whether connection to VPN Azure Cloud Server is established */ + this.IsConnected_bool = false; + Object.assign(this, init); + } + return VpnRpcAzureStatus; +}()); +exports.VpnRpcAzureStatus = VpnRpcAzureStatus; +/** Local Bridge support information */ +var VpnRpcBridgeSupport = /** @class */ (function () { + /** Constructor for the 'VpnRpcBridgeSupport' class: Local Bridge support information */ + function VpnRpcBridgeSupport(init) { + /** Whether the OS supports the Local Bridge function */ + this.IsBridgeSupportedOs_bool = false; + /** Whether WinPcap is necessary to install */ + this.IsWinPcapNeeded_bool = false; + Object.assign(this, init); + } + return VpnRpcBridgeSupport; +}()); +exports.VpnRpcBridgeSupport = VpnRpcBridgeSupport; +/** Get the CA of HUB */ +var VpnRpcHubGetCA = /** @class */ (function () { + /** Constructor for the 'VpnRpcHubGetCA' class: Get the CA of HUB */ + function VpnRpcHubGetCA(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** The key id of the certificate */ + this.Key_u32 = 0; + /** The body of the X.509 certificate */ + this.Cert_bin = new Uint8Array([]); + Object.assign(this, init); + } + return VpnRpcHubGetCA; +}()); +exports.VpnRpcHubGetCA = VpnRpcHubGetCA; +/** Caps item of the VPN Server */ +var VpnCaps = /** @class */ (function () { + /** Constructor for the 'VpnCaps' class: Caps item of the VPN Server */ + function VpnCaps(init) { + /** Name */ + this.CapsName_str = ""; + /** Value */ + this.CapsValue_u32 = 0; + /** Descrption */ + this.CapsDescrption_utf = ""; + Object.assign(this, init); + } + return VpnCaps; +}()); +exports.VpnCaps = VpnCaps; +/** Caps list of the VPN Server */ +var VpnCapslist = /** @class */ (function () { + /** Constructor for the 'VpnCapslist' class: Caps list of the VPN Server */ + function VpnCapslist(init) { + /** Caps list of the VPN Server */ + this.CapsList = []; + Object.assign(this, init); + } + return VpnCapslist; +}()); +exports.VpnCapslist = VpnCapslist; +/** Config operation */ +var VpnRpcConfig = /** @class */ (function () { + /** Constructor for the 'VpnRpcConfig' class: Config operation */ + function VpnRpcConfig(init) { + /** File name (valid only for returning from the server) */ + this.FileName_str = ""; + /** File data */ + this.FileData_bin = new Uint8Array([]); + Object.assign(this, init); + } + return VpnRpcConfig; +}()); +exports.VpnRpcConfig = VpnRpcConfig; +/** Connection information */ +var VpnRpcConnectionInfo = /** @class */ (function () { + /** Constructor for the 'VpnRpcConnectionInfo' class: Connection information */ + function VpnRpcConnectionInfo(init) { + /** Connection name */ + this.Name_str = ""; + /** Type */ + this.Type_u32 = 0; + /** Host name */ + this.Hostname_str = ""; + /** IP address */ + this.Ip_ip = ""; + /** Port number */ + this.Port_u32 = 0; + /** Connected time */ + this.ConnectedTime_dt = new Date(); + /** Server string */ + this.ServerStr_str = ""; + /** Server version */ + this.ServerVer_u32 = 0; + /** Server build number */ + this.ServerBuild_u32 = 0; + /** Client string */ + this.ClientStr_str = ""; + /** Client version */ + this.ClientVer_u32 = 0; + /** Client build number */ + this.ClientBuild_u32 = 0; + Object.assign(this, init); + } + return VpnRpcConnectionInfo; +}()); +exports.VpnRpcConnectionInfo = VpnRpcConnectionInfo; +/** Proxy type */ +var VpnRpcProxyType; +(function (VpnRpcProxyType) { + /** Direct TCP connection */ + VpnRpcProxyType[VpnRpcProxyType["Direct"] = 0] = "Direct"; + /** Connection via HTTP proxy server */ + VpnRpcProxyType[VpnRpcProxyType["HTTP"] = 1] = "HTTP"; + /** Connection via SOCKS proxy server */ + VpnRpcProxyType[VpnRpcProxyType["SOCKS"] = 2] = "SOCKS"; +})(VpnRpcProxyType = exports.VpnRpcProxyType || (exports.VpnRpcProxyType = {})); +/** The current status of the DDNS */ +var VpnDDnsClientStatus = /** @class */ (function () { + /** Constructor for the 'VpnDDnsClientStatus' class: The current status of the DDNS */ + function VpnDDnsClientStatus(init) { + /** Last error code (IPv4) */ + this.Err_IPv4_u32 = 0; + /** Last error string (IPv4) */ + this.ErrStr_IPv4_utf = ""; + /** Last error code (IPv6) */ + this.Err_IPv6_u32 = 0; + /** Last error string (IPv6) */ + this.ErrStr_IPv6_utf = ""; + /** Current DDNS host name */ + this.CurrentHostName_str = ""; + /** Current FQDN of the DDNS hostname */ + this.CurrentFqdn_str = ""; + /** DDNS suffix */ + this.DnsSuffix_str = ""; + /** Current IPv4 address of the VPN Server */ + this.CurrentIPv4_str = ""; + /** Current IPv6 address of the VPN Server */ + this.CurrentIPv6_str = ""; + Object.assign(this, init); + } + return VpnDDnsClientStatus; +}()); +exports.VpnDDnsClientStatus = VpnDDnsClientStatus; +/** Internet connection settings */ +var VpnInternetSetting = /** @class */ (function () { + /** Constructor for the 'VpnInternetSetting' class: Internet connection settings */ + function VpnInternetSetting(init) { + /** Type of proxy server */ + this.ProxyType_u32 = 0; + /** Proxy server host name */ + this.ProxyHostName_str = ""; + /** Proxy server port number */ + this.ProxyPort_u32 = 0; + /** Proxy server user name */ + this.ProxyUsername_str = ""; + /** Proxy server password */ + this.ProxyPassword_str = ""; + Object.assign(this, init); + } + return VpnInternetSetting; +}()); +exports.VpnInternetSetting = VpnInternetSetting; +/** Administration options */ +var VpnAdminOption = /** @class */ (function () { + /** Constructor for the 'VpnAdminOption' class: Administration options */ + function VpnAdminOption(init) { + /** Name */ + this.Name_str = ""; + /** Data */ + this.Value_u32 = 0; + /** Descrption */ + this.Descrption_utf = ""; + Object.assign(this, init); + } + return VpnAdminOption; +}()); +exports.VpnAdminOption = VpnAdminOption; +/** Administration options list */ +var VpnRpcAdminOption = /** @class */ (function () { + /** Constructor for the 'VpnRpcAdminOption' class: Administration options list */ + function VpnRpcAdminOption(init) { + /** Virtual HUB name */ + this.HubName_str = ""; + /** List data */ + this.AdminOptionList = []; + Object.assign(this, init); + } + return VpnRpcAdminOption; +}()); +exports.VpnRpcAdminOption = VpnRpcAdminOption; +/** Connection state to the controller */ +var VpnRpcFarmConnectionStatus = /** @class */ (function () { + /** Constructor for the 'VpnRpcFarmConnectionStatus' class: Connection state to the controller */ + function VpnRpcFarmConnectionStatus(init) { + /** IP address */ + this.Ip_ip = ""; + /** Port number */ + this.Port_u32 = 0; + /** Online state */ + this.Online_bool = false; + /** Last error code */ + this.LastError_u32 = 0; + /** Connection start time */ + this.StartedTime_dt = new Date(); + /** First connection time */ + this.FirstConnectedTime_dt = new Date(); + /** Connection time of this time */ + this.CurrentConnectedTime_dt = new Date(); + /** Number of retries */ + this.NumTry_u32 = 0; + /** Number of connection count */ + this.NumConnected_u32 = 0; + /** Connection failure count */ + this.NumFailed_u32 = 0; + Object.assign(this, init); + } + return VpnRpcFarmConnectionStatus; +}()); +exports.VpnRpcFarmConnectionStatus = VpnRpcFarmConnectionStatus; +/** HUB item of each farm member */ +var VpnRpcFarmHub = /** @class */ (function () { + /** Constructor for the 'VpnRpcFarmHub' class: HUB item of each farm member */ + function VpnRpcFarmHub(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Dynamic HUB */ + this.DynamicHub_bool = false; + Object.assign(this, init); + } + return VpnRpcFarmHub; +}()); +exports.VpnRpcFarmHub = VpnRpcFarmHub; +/** Server farm member information acquisition */ +var VpnRpcFarmInfo = /** @class */ (function () { + /** Constructor for the 'VpnRpcFarmInfo' class: Server farm member information acquisition */ + function VpnRpcFarmInfo(init) { + /** ID */ + this.Id_u32 = 0; + /** The flag if the server is Cluster Controller (false: Cluster Member servers) */ + this.Controller_bool = false; + /** Connection Established Time */ + this.ConnectedTime_dt = new Date(); + /** IP address */ + this.Ip_ip = ""; + /** Host name */ + this.Hostname_str = ""; + /** Point */ + this.Point_u32 = 0; + /** Number of Public Ports */ + this.NumPort_u32 = 0; + /** Public Ports */ + this.Ports_u32 = []; + /** Server certificate */ + this.ServerCert_bin = new Uint8Array([]); + /** Number of farm HUB */ + this.NumFarmHub_u32 = 0; + /** The hosted Virtual Hub list */ + this.HubsList = []; + /** Number of hosted VPN sessions */ + this.NumSessions_u32 = 0; + /** Number of TCP connections */ + this.NumTcpConnections_u32 = 0; + /** Performance Standard Ratio */ + this.Weight_u32 = 0; + Object.assign(this, init); + } + return VpnRpcFarmInfo; +}()); +exports.VpnRpcFarmInfo = VpnRpcFarmInfo; +/** Server farm configuration */ +var VpnRpcFarm = /** @class */ (function () { + /** Constructor for the 'VpnRpcFarm' class: Server farm configuration */ + function VpnRpcFarm(init) { + /** Type of server */ + this.ServerType_u32 = 0; + /** Valid only for Cluster Member servers. Number of the Ports_u32 element. */ + this.NumPort_u32 = 0; + /** Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers. */ + this.Ports_u32 = []; + /** Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used. */ + this.PublicIp_ip = ""; + /** Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. */ + this.ControllerName_str = ""; + /** Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. */ + this.ControllerPort_u32 = 0; + /** Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller. */ + this.MemberPasswordPlaintext_str = ""; + /** This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used. */ + this.Weight_u32 = 0; + /** Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments. */ + this.ControllerOnly_bool = false; + Object.assign(this, init); + } + return VpnRpcFarm; +}()); +exports.VpnRpcFarm = VpnRpcFarm; +/** Log switch type */ +var VpnRpcLogSwitchType; +(function (VpnRpcLogSwitchType) { + /** No switching */ + VpnRpcLogSwitchType[VpnRpcLogSwitchType["No"] = 0] = "No"; + /** Secondly basis */ + VpnRpcLogSwitchType[VpnRpcLogSwitchType["Second"] = 1] = "Second"; + /** Minutely basis */ + VpnRpcLogSwitchType[VpnRpcLogSwitchType["Minute"] = 2] = "Minute"; + /** Hourly basis */ + VpnRpcLogSwitchType[VpnRpcLogSwitchType["Hour"] = 3] = "Hour"; + /** Daily basis */ + VpnRpcLogSwitchType[VpnRpcLogSwitchType["Day"] = 4] = "Day"; + /** Monthly basis */ + VpnRpcLogSwitchType[VpnRpcLogSwitchType["Month"] = 5] = "Month"; +})(VpnRpcLogSwitchType = exports.VpnRpcLogSwitchType || (exports.VpnRpcLogSwitchType = {})); +/** Packet log settings */ +var VpnRpcPacketLogSetting; +(function (VpnRpcPacketLogSetting) { + /** Not save */ + VpnRpcPacketLogSetting[VpnRpcPacketLogSetting["None"] = 0] = "None"; + /** Only header */ + VpnRpcPacketLogSetting[VpnRpcPacketLogSetting["Header"] = 1] = "Header"; + /** All payloads */ + VpnRpcPacketLogSetting[VpnRpcPacketLogSetting["All"] = 2] = "All"; +})(VpnRpcPacketLogSetting = exports.VpnRpcPacketLogSetting || (exports.VpnRpcPacketLogSetting = {})); +/** Packet log settings array index */ +var VpnRpcPacketLogSettingIndex; +(function (VpnRpcPacketLogSettingIndex) { + /** TCP connection log */ + VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex["TcpConnection"] = 0] = "TcpConnection"; + /** TCP packet log */ + VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex["TcpAll"] = 1] = "TcpAll"; + /** DHCP Log */ + VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex["Dhcp"] = 2] = "Dhcp"; + /** UDP log */ + VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex["Udp"] = 3] = "Udp"; + /** ICMP log */ + VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex["Icmp"] = 4] = "Icmp"; + /** IP log */ + VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex["Ip"] = 5] = "Ip"; + /** ARP log */ + VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex["Arp"] = 6] = "Arp"; + /** Ethernet log */ + VpnRpcPacketLogSettingIndex[VpnRpcPacketLogSettingIndex["Ethernet"] = 7] = "Ethernet"; +})(VpnRpcPacketLogSettingIndex = exports.VpnRpcPacketLogSettingIndex || (exports.VpnRpcPacketLogSettingIndex = {})); +/** HUB log settings */ +var VpnRpcHubLog = /** @class */ (function () { + /** Constructor for the 'VpnRpcHubLog' class: HUB log settings */ + function VpnRpcHubLog(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** The flag to enable / disable saving the security log */ + this.SaveSecurityLog_bool = false; + /** The log filename switching setting of the security log */ + this.SecurityLogSwitchType_u32 = 0; + /** The flag to enable / disable saving the security log */ + this.SavePacketLog_bool = false; + /** The log filename switching settings of the packet logs */ + this.PacketLogSwitchType_u32 = 0; + /** Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7. */ + this.PacketLogConfig_u32 = []; + Object.assign(this, init); + } + return VpnRpcHubLog; +}()); +exports.VpnRpcHubLog = VpnRpcHubLog; +/** RADIUS server options */ +var VpnRpcRadius = /** @class */ (function () { + /** Constructor for the 'VpnRpcRadius' class: RADIUS server options */ + function VpnRpcRadius(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** RADIUS server name */ + this.RadiusServerName_str = ""; + /** RADIUS port number */ + this.RadiusPort_u32 = 0; + /** Secret key */ + this.RadiusSecret_str = ""; + /** Radius retry interval */ + this.RadiusRetryInterval_u32 = 0; + Object.assign(this, init); + } + return VpnRpcRadius; +}()); +exports.VpnRpcRadius = VpnRpcRadius; +/** Get the state HUB */ +var VpnRpcHubStatus = /** @class */ (function () { + /** Constructor for the 'VpnRpcHubStatus' class: Get the state HUB */ + function VpnRpcHubStatus(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Online */ + this.Online_bool = false; + /** Type of HUB */ + this.HubType_u32 = 0; + /** Number of sessions */ + this.NumSessions_u32 = 0; + /** Number of sessions (client mode) */ + this.NumSessionsClient_u32 = 0; + /** Number of sessions (bridge mode) */ + this.NumSessionsBridge_u32 = 0; + /** Number of Access list entries */ + this.NumAccessLists_u32 = 0; + /** Number of users */ + this.NumUsers_u32 = 0; + /** Number of groups */ + this.NumGroups_u32 = 0; + /** Number of MAC table entries */ + this.NumMacTables_u32 = 0; + /** Number of IP table entries */ + this.NumIpTables_u32 = 0; + /** Number of broadcast packets (Recv) */ + this["Recv.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Recv) */ + this["Recv.BroadcastCount_u64"] = 0; + /** Unicast count (Recv) */ + this["Recv.UnicastBytes_u64"] = 0; + /** Unicast bytes (Recv) */ + this["Recv.UnicastCount_u64"] = 0; + /** Number of broadcast packets (Send) */ + this["Send.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Send) */ + this["Send.BroadcastCount_u64"] = 0; + /** Unicast bytes (Send) */ + this["Send.UnicastBytes_u64"] = 0; + /** Unicast bytes (Send) */ + this["Send.UnicastCount_u64"] = 0; + /** Whether SecureNAT is enabled */ + this.SecureNATEnabled_bool = false; + /** Last communication date and time */ + this.LastCommTime_dt = new Date(); + /** Last login date and time */ + this.LastLoginTime_dt = new Date(); + /** Creation date and time */ + this.CreatedTime_dt = new Date(); + /** Number of logins */ + this.NumLogin_u32 = 0; + Object.assign(this, init); + } + return VpnRpcHubStatus; +}()); +exports.VpnRpcHubStatus = VpnRpcHubStatus; +/** List of services provided by IPsec server */ +var VpnIPsecServices = /** @class */ (function () { + /** Constructor for the 'VpnIPsecServices' class: List of services provided by IPsec server */ + function VpnIPsecServices(init) { + /** Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. */ + this.L2TP_Raw_bool = false; + /** Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option. */ + this.L2TP_IPsec_bool = false; + /** Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging. */ + this.EtherIP_IPsec_bool = false; + /** Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters. */ + this.IPsec_Secret_str = ""; + /** Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. */ + this.L2TP_DefaultHub_str = ""; + Object.assign(this, init); + } + return VpnIPsecServices; +}()); +exports.VpnIPsecServices = VpnIPsecServices; +/** Keep alive protocol */ +var VpnRpcKeepAliveProtocol; +(function (VpnRpcKeepAliveProtocol) { + /** TCP */ + VpnRpcKeepAliveProtocol[VpnRpcKeepAliveProtocol["TCP"] = 0] = "TCP"; + /** UDP */ + VpnRpcKeepAliveProtocol[VpnRpcKeepAliveProtocol["UDP"] = 1] = "UDP"; +})(VpnRpcKeepAliveProtocol = exports.VpnRpcKeepAliveProtocol || (exports.VpnRpcKeepAliveProtocol = {})); +/** Keep Alive settings */ +var VpnRpcKeep = /** @class */ (function () { + /** Constructor for the 'VpnRpcKeep' class: Keep Alive settings */ + function VpnRpcKeep(init) { + /** The flag to enable keep-alive to the Internet */ + this.UseKeepConnect_bool = false; + /** Specify the host name or IP address of the destination */ + this.KeepConnectHost_str = ""; + /** Specify the port number of the destination */ + this.KeepConnectPort_u32 = 0; + /** Protocol type */ + this.KeepConnectProtocol_u32 = 0; + /** Interval Between Packets Sends (Seconds) */ + this.KeepConnectInterval_u32 = 0; + Object.assign(this, init); + } + return VpnRpcKeep; +}()); +exports.VpnRpcKeep = VpnRpcKeep; +/** State of the client session */ +var VpnRpcClientSessionStatus; +(function (VpnRpcClientSessionStatus) { + /** Connecting */ + VpnRpcClientSessionStatus[VpnRpcClientSessionStatus["Connecting"] = 0] = "Connecting"; + /** Negotiating */ + VpnRpcClientSessionStatus[VpnRpcClientSessionStatus["Negotiation"] = 1] = "Negotiation"; + /** During user authentication */ + VpnRpcClientSessionStatus[VpnRpcClientSessionStatus["Auth"] = 2] = "Auth"; + /** Connection complete */ + VpnRpcClientSessionStatus[VpnRpcClientSessionStatus["Established"] = 3] = "Established"; + /** Wait to retry */ + VpnRpcClientSessionStatus[VpnRpcClientSessionStatus["Retry"] = 4] = "Retry"; + /** Idle state */ + VpnRpcClientSessionStatus[VpnRpcClientSessionStatus["Idle"] = 5] = "Idle"; +})(VpnRpcClientSessionStatus = exports.VpnRpcClientSessionStatus || (exports.VpnRpcClientSessionStatus = {})); +/** Get the link state */ +var VpnRpcLinkStatus = /** @class */ (function () { + /** Constructor for the 'VpnRpcLinkStatus' class: Get the link state */ + function VpnRpcLinkStatus(init) { + /** The Virtual Hub name */ + this.HubName_Ex_str = ""; + /** The name of the cascade connection */ + this.AccountName_utf = ""; + /** The flag whether the cascade connection is enabled */ + this.Active_bool = false; + /** The flag whether the cascade connection is established */ + this.Connected_bool = false; + /** The session status */ + this.SessionStatus_u32 = 0; + /** The destination VPN server name */ + this.ServerName_str = ""; + /** The port number of the server */ + this.ServerPort_u32 = 0; + /** Server product name */ + this.ServerProductName_str = ""; + /** Server product version */ + this.ServerProductVer_u32 = 0; + /** Server product build number */ + this.ServerProductBuild_u32 = 0; + /** Server's X.509 certificate */ + this.ServerX_bin = new Uint8Array([]); + /** Client certificate */ + this.ClientX_bin = new Uint8Array([]); + /** Connection start time */ + this.StartTime_dt = new Date(); + /** Connection completion time of the first connection */ + this.FirstConnectionEstablisiedTime_dt = new Date(); + /** Connection completion time of this connection */ + this.CurrentConnectionEstablishTime_dt = new Date(); + /** Number of connections have been established so far */ + this.NumConnectionsEatablished_u32 = 0; + /** Half-connection */ + this.HalfConnection_bool = false; + /** VoIP / QoS */ + this.QoS_bool = false; + /** Maximum number of the underlying TCP connections */ + this.MaxTcpConnections_u32 = 0; + /** Number of current underlying TCP connections */ + this.NumTcpConnections_u32 = 0; + /** Number of underlying inbound TCP connections */ + this.NumTcpConnectionsUpload_u32 = 0; + /** Number of underlying outbound TCP connections */ + this.NumTcpConnectionsDownload_u32 = 0; + /** Use of encryption */ + this.UseEncrypt_bool = false; + /** Cipher algorithm name */ + this.CipherName_str = ""; + /** Use of compression */ + this.UseCompress_bool = false; + /** The flag whether this is a R-UDP session */ + this.IsRUDPSession_bool = false; + /** Underlying physical communication protocol */ + this.UnderlayProtocol_str = ""; + /** The UDP acceleration is enabled */ + this.IsUdpAccelerationEnabled_bool = false; + /** The UDP acceleration is being actually used */ + this.IsUsingUdpAcceleration_bool = false; + /** Session name */ + this.SessionName_str = ""; + /** Connection name */ + this.ConnectionName_str = ""; + /** Session key */ + this.SessionKey_bin = new Uint8Array([]); + /** Total transmitted data size */ + this.TotalSendSize_u64 = 0; + /** Total received data size */ + this.TotalRecvSize_u64 = 0; + /** Total transmitted data size (no compression) */ + this.TotalSendSizeReal_u64 = 0; + /** Total received data size (no compression) */ + this.TotalRecvSizeReal_u64 = 0; + /** The flag whether the VPN session is Bridge Mode */ + this.IsBridgeMode_bool = false; + /** The flag whether the VPN session is Monitor mode */ + this.IsMonitorMode_bool = false; + /** VLAN ID */ + this.VLanId_u32 = 0; + Object.assign(this, init); + } + return VpnRpcLinkStatus; +}()); +exports.VpnRpcLinkStatus = VpnRpcLinkStatus; +/** Setting of SSTP and OpenVPN */ +var VpnOpenVpnSstpConfig = /** @class */ (function () { + /** Constructor for the 'VpnOpenVpnSstpConfig' class: Setting of SSTP and OpenVPN */ + function VpnOpenVpnSstpConfig(init) { + /** Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. */ + this.EnableOpenVPN_bool = false; + /** Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. */ + this.OpenVPNPortList_str = ""; + /** pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. */ + this.EnableSSTP_bool = false; + Object.assign(this, init); + } + return VpnOpenVpnSstpConfig; +}()); +exports.VpnOpenVpnSstpConfig = VpnOpenVpnSstpConfig; +/** Virtual host option */ +var VpnVhOption = /** @class */ (function () { + /** Constructor for the 'VpnVhOption' class: Virtual host option */ + function VpnVhOption(init) { + /** Target Virtual HUB name */ + this.RpcHubName_str = ""; + /** MAC address */ + this.MacAddress_bin = new Uint8Array([]); + /** IP address */ + this.Ip_ip = ""; + /** Subnet mask */ + this.Mask_ip = ""; + /** Use flag of the Virtual NAT function */ + this.UseNat_bool = false; + /** MTU value (Standard: 1500) */ + this.Mtu_u32 = 0; + /** NAT TCP timeout in seconds */ + this.NatTcpTimeout_u32 = 0; + /** NAT UDP timeout in seconds */ + this.NatUdpTimeout_u32 = 0; + /** Using flag of DHCP function */ + this.UseDhcp_bool = false; + /** Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) */ + this.DhcpLeaseIPStart_ip = ""; + /** Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) */ + this.DhcpLeaseIPEnd_ip = ""; + /** Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) */ + this.DhcpSubnetMask_ip = ""; + /** Specify the expiration date in second units for leasing an IP address to a client. */ + this.DhcpExpireTimeSpan_u32 = 0; + /** Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway. */ + this.DhcpGatewayAddress_ip = ""; + /** Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. */ + this.DhcpDnsServerAddress_ip = ""; + /** Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. */ + this.DhcpDnsServerAddress2_ip = ""; + /** Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name. */ + this.DhcpDomainName_str = ""; + /** Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting. */ + this.SaveLog_bool = false; + /** The flag to enable the DhcpPushRoutes_str field. */ + this.ApplyDhcpPushRoutes_bool = false; + /** Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes. */ + this.DhcpPushRoutes_str = ""; + Object.assign(this, init); + } + return VpnVhOption; +}()); +exports.VpnVhOption = VpnVhOption; +/** RPC_NAT_STATUS */ +var VpnRpcNatStatus = /** @class */ (function () { + /** Constructor for the 'VpnRpcNatStatus' class: RPC_NAT_STATUS */ + function VpnRpcNatStatus(init) { + /** Virtual Hub Name */ + this.HubName_str = ""; + /** Number of TCP sessions */ + this.NumTcpSessions_u32 = 0; + /** Ntmber of UDP sessions */ + this.NumUdpSessions_u32 = 0; + /** Nymber of ICMP sessions */ + this.NumIcmpSessions_u32 = 0; + /** Number of DNS sessions */ + this.NumDnsSessions_u32 = 0; + /** Number of DHCP clients */ + this.NumDhcpClients_u32 = 0; + /** Whether the NAT is operating in the Kernel Mode */ + this.IsKernelMode_bool = false; + /** Whether the NAT is operating in the Raw IP Mode */ + this.IsRawIpMode_bool = false; + Object.assign(this, init); + } + return VpnRpcNatStatus; +}()); +exports.VpnRpcNatStatus = VpnRpcNatStatus; +/** Key pair */ +var VpnRpcKeyPair = /** @class */ (function () { + /** Constructor for the 'VpnRpcKeyPair' class: Key pair */ + function VpnRpcKeyPair(init) { + /** The body of the certificate */ + this.Cert_bin = new Uint8Array([]); + /** The body of the private key */ + this.Key_bin = new Uint8Array([]); + Object.assign(this, init); + } + return VpnRpcKeyPair; +}()); +exports.VpnRpcKeyPair = VpnRpcKeyPair; +/** Single string value */ +var VpnRpcStr = /** @class */ (function () { + /** Constructor for the 'VpnRpcStr' class: Single string value */ + function VpnRpcStr(init) { + /** A string value */ + this.String_str = ""; + Object.assign(this, init); + } + return VpnRpcStr; +}()); +exports.VpnRpcStr = VpnRpcStr; +/** Type of VPN Server */ +var VpnRpcServerType; +(function (VpnRpcServerType) { + /** Stand-alone server */ + VpnRpcServerType[VpnRpcServerType["Standalone"] = 0] = "Standalone"; + /** Farm controller server */ + VpnRpcServerType[VpnRpcServerType["FarmController"] = 1] = "FarmController"; + /** Farm member server */ + VpnRpcServerType[VpnRpcServerType["FarmMember"] = 2] = "FarmMember"; +})(VpnRpcServerType = exports.VpnRpcServerType || (exports.VpnRpcServerType = {})); +/** Operating system type */ +var VpnRpcOsType; +(function (VpnRpcOsType) { + /** Windows 95 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_95"] = 1100] = "WINDOWS_95"; + /** Windows 98 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_98"] = 1200] = "WINDOWS_98"; + /** Windows Me */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_ME"] = 1300] = "WINDOWS_ME"; + /** Windows (unknown) */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_UNKNOWN"] = 1400] = "WINDOWS_UNKNOWN"; + /** Windows NT 4.0 Workstation */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_NT_4_WORKSTATION"] = 2100] = "WINDOWS_NT_4_WORKSTATION"; + /** Windows NT 4.0 Server */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_NT_4_SERVER"] = 2110] = "WINDOWS_NT_4_SERVER"; + /** Windows NT 4.0 Server, Enterprise Edition */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_NT_4_SERVER_ENTERPRISE"] = 2111] = "WINDOWS_NT_4_SERVER_ENTERPRISE"; + /** Windows NT 4.0 Terminal Server */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_NT_4_TERMINAL_SERVER"] = 2112] = "WINDOWS_NT_4_TERMINAL_SERVER"; + /** BackOffice Server 4.5 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_NT_4_BACKOFFICE"] = 2113] = "WINDOWS_NT_4_BACKOFFICE"; + /** Small Business Server 4.5 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_NT_4_SMS"] = 2114] = "WINDOWS_NT_4_SMS"; + /** Windows 2000 Professional */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2000_PROFESSIONAL"] = 2200] = "WINDOWS_2000_PROFESSIONAL"; + /** Windows 2000 Server */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2000_SERVER"] = 2211] = "WINDOWS_2000_SERVER"; + /** Windows 2000 Advanced Server */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2000_ADVANCED_SERVER"] = 2212] = "WINDOWS_2000_ADVANCED_SERVER"; + /** Windows 2000 Datacenter Server */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2000_DATACENTER_SERVER"] = 2213] = "WINDOWS_2000_DATACENTER_SERVER"; + /** BackOffice Server 2000 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2000_BACKOFFICE"] = 2214] = "WINDOWS_2000_BACKOFFICE"; + /** Small Business Server 2000 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2000_SBS"] = 2215] = "WINDOWS_2000_SBS"; + /** Windows XP Home Edition */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_XP_HOME"] = 2300] = "WINDOWS_XP_HOME"; + /** Windows XP Professional */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_XP_PROFESSIONAL"] = 2301] = "WINDOWS_XP_PROFESSIONAL"; + /** Windows Server 2003 Web Edition */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2003_WEB"] = 2410] = "WINDOWS_2003_WEB"; + /** Windows Server 2003 Standard Edition */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2003_STANDARD"] = 2411] = "WINDOWS_2003_STANDARD"; + /** Windows Server 2003 Enterprise Edition */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2003_ENTERPRISE"] = 2412] = "WINDOWS_2003_ENTERPRISE"; + /** Windows Server 2003 DataCenter Edition */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2003_DATACENTER"] = 2413] = "WINDOWS_2003_DATACENTER"; + /** BackOffice Server 2003 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2003_BACKOFFICE"] = 2414] = "WINDOWS_2003_BACKOFFICE"; + /** Small Business Server 2003 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_2003_SBS"] = 2415] = "WINDOWS_2003_SBS"; + /** Windows Vista */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_LONGHORN_PROFESSIONAL"] = 2500] = "WINDOWS_LONGHORN_PROFESSIONAL"; + /** Windows Server 2008 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_LONGHORN_SERVER"] = 2510] = "WINDOWS_LONGHORN_SERVER"; + /** Windows 7 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_7"] = 2600] = "WINDOWS_7"; + /** Windows Server 2008 R2 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_SERVER_2008_R2"] = 2610] = "WINDOWS_SERVER_2008_R2"; + /** Windows 8 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_8"] = 2700] = "WINDOWS_8"; + /** Windows Server 2012 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_SERVER_8"] = 2710] = "WINDOWS_SERVER_8"; + /** Windows 8.1 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_81"] = 2701] = "WINDOWS_81"; + /** Windows Server 2012 R2 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_SERVER_81"] = 2711] = "WINDOWS_SERVER_81"; + /** Windows 10 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_10"] = 2702] = "WINDOWS_10"; + /** Windows Server 10 */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_SERVER_10"] = 2712] = "WINDOWS_SERVER_10"; + /** Windows 11 or later */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_11"] = 2800] = "WINDOWS_11"; + /** Windows Server 11 or later */ + VpnRpcOsType[VpnRpcOsType["WINDOWS_SERVER_11"] = 2810] = "WINDOWS_SERVER_11"; + /** Unknown UNIX */ + VpnRpcOsType[VpnRpcOsType["UNIX_UNKNOWN"] = 3000] = "UNIX_UNKNOWN"; + /** Linux */ + VpnRpcOsType[VpnRpcOsType["LINUX"] = 3100] = "LINUX"; + /** Solaris */ + VpnRpcOsType[VpnRpcOsType["SOLARIS"] = 3200] = "SOLARIS"; + /** Cygwin */ + VpnRpcOsType[VpnRpcOsType["CYGWIN"] = 3300] = "CYGWIN"; + /** BSD */ + VpnRpcOsType[VpnRpcOsType["BSD"] = 3400] = "BSD"; + /** MacOS X */ + VpnRpcOsType[VpnRpcOsType["MACOS_X"] = 3500] = "MACOS_X"; +})(VpnRpcOsType = exports.VpnRpcOsType || (exports.VpnRpcOsType = {})); +/** VPN Server Information */ +var VpnRpcServerInfo = /** @class */ (function () { + /** Constructor for the 'VpnRpcServerInfo' class: VPN Server Information */ + function VpnRpcServerInfo(init) { + /** Server product name */ + this.ServerProductName_str = ""; + /** Server version string */ + this.ServerVersionString_str = ""; + /** Server build information string */ + this.ServerBuildInfoString_str = ""; + /** Server version integer value */ + this.ServerVerInt_u32 = 0; + /** Server build number integer value */ + this.ServerBuildInt_u32 = 0; + /** Server host name */ + this.ServerHostName_str = ""; + /** Type of server */ + this.ServerType_u32 = 0; + /** Build date and time of the server */ + this.ServerBuildDate_dt = new Date(); + /** Family name */ + this.ServerFamilyName_str = ""; + /** OS type */ + this.OsType_u32 = 0; + /** Service pack number */ + this.OsServicePack_u32 = 0; + /** OS system name */ + this.OsSystemName_str = ""; + /** OS product name */ + this.OsProductName_str = ""; + /** OS vendor name */ + this.OsVendorName_str = ""; + /** OS version */ + this.OsVersion_str = ""; + /** Kernel name */ + this.KernelName_str = ""; + /** Kernel version */ + this.KernelVersion_str = ""; + Object.assign(this, init); + } + return VpnRpcServerInfo; +}()); +exports.VpnRpcServerInfo = VpnRpcServerInfo; +/** Server status */ +var VpnRpcServerStatus = /** @class */ (function () { + /** Constructor for the 'VpnRpcServerStatus' class: Server status */ + function VpnRpcServerStatus(init) { + /** Type of server */ + this.ServerType_u32 = 0; + /** Total number of TCP connections */ + this.NumTcpConnections_u32 = 0; + /** Number of Local TCP connections */ + this.NumTcpConnectionsLocal_u32 = 0; + /** Number of remote TCP connections */ + this.NumTcpConnectionsRemote_u32 = 0; + /** Total number of HUBs */ + this.NumHubTotal_u32 = 0; + /** Nymber of stand-alone HUB */ + this.NumHubStandalone_u32 = 0; + /** Number of static HUBs */ + this.NumHubStatic_u32 = 0; + /** Number of Dynamic HUBs */ + this.NumHubDynamic_u32 = 0; + /** Total number of sessions */ + this.NumSessionsTotal_u32 = 0; + /** Number of local VPN sessions */ + this.NumSessionsLocal_u32 = 0; + /** The number of remote sessions */ + this.NumSessionsRemote_u32 = 0; + /** Number of MAC table entries (total sum of all Virtual Hubs) */ + this.NumMacTables_u32 = 0; + /** Number of IP table entries (total sum of all Virtual Hubs) */ + this.NumIpTables_u32 = 0; + /** Number of users (total sum of all Virtual Hubs) */ + this.NumUsers_u32 = 0; + /** Number of groups (total sum of all Virtual Hubs) */ + this.NumGroups_u32 = 0; + /** Number of assigned bridge licenses (Useful to make a commercial version) */ + this.AssignedBridgeLicenses_u32 = 0; + /** Number of assigned client licenses (Useful to make a commercial version) */ + this.AssignedClientLicenses_u32 = 0; + /** Number of Assigned bridge license (cluster-wide), useful to make a commercial version */ + this.AssignedBridgeLicensesTotal_u32 = 0; + /** Number of assigned client licenses (cluster-wide), useful to make a commercial version */ + this.AssignedClientLicensesTotal_u32 = 0; + /** Number of broadcast packets (Recv) */ + this["Recv.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Recv) */ + this["Recv.BroadcastCount_u64"] = 0; + /** Unicast count (Recv) */ + this["Recv.UnicastBytes_u64"] = 0; + /** Unicast bytes (Recv) */ + this["Recv.UnicastCount_u64"] = 0; + /** Number of broadcast packets (Send) */ + this["Send.BroadcastBytes_u64"] = 0; + /** Broadcast bytes (Send) */ + this["Send.BroadcastCount_u64"] = 0; + /** Unicast bytes (Send) */ + this["Send.UnicastBytes_u64"] = 0; + /** Unicast bytes (Send) */ + this["Send.UnicastCount_u64"] = 0; + /** Current time */ + this.CurrentTime_dt = new Date(); + /** 64 bit High-Precision Logical System Clock */ + this.CurrentTick_u64 = 0; + /** VPN Server Start-up time */ + this.StartTime_dt = new Date(); + /** Memory information: Total Memory */ + this.TotalMemory_u64 = 0; + /** Memory information: Used Memory */ + this.UsedMemory_u64 = 0; + /** Memory information: Free Memory */ + this.FreeMemory_u64 = 0; + /** Memory information: Total Phys */ + this.TotalPhys_u64 = 0; + /** Memory information: Used Phys */ + this.UsedPhys_u64 = 0; + /** Memory information: Free Phys */ + this.FreePhys_u64 = 0; + Object.assign(this, init); + } + return VpnRpcServerStatus; +}()); +exports.VpnRpcServerStatus = VpnRpcServerStatus; +/** VPN Session status */ +var VpnRpcSessionStatus = /** @class */ (function () { + /** Constructor for the 'VpnRpcSessionStatus' class: VPN Session status */ + function VpnRpcSessionStatus(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** VPN session name */ + this.Name_str = ""; + /** User name */ + this.Username_str = ""; + /** Real user name which was used for the authentication */ + this.RealUsername_str = ""; + /** Group name */ + this.GroupName_str = ""; + /** Is Cascade Session */ + this.LinkMode_bool = false; + /** Client IP address */ + this.Client_Ip_Address_ip = ""; + /** Client host name */ + this.SessionStatus_ClientHostName_str = ""; + /** Operation flag */ + this.Active_bool = false; + /** Connected flag */ + this.Connected_bool = false; + /** State of the client session */ + this.SessionStatus_u32 = 0; + /** Server name */ + this.ServerName_str = ""; + /** Port number of the server */ + this.ServerPort_u32 = 0; + /** Server product name */ + this.ServerProductName_str = ""; + /** Server product version */ + this.ServerProductVer_u32 = 0; + /** Server product build number */ + this.ServerProductBuild_u32 = 0; + /** Connection start time */ + this.StartTime_dt = new Date(); + /** Connection completion time of the first connection */ + this.FirstConnectionEstablisiedTime_dt = new Date(); + /** Connection completion time of this connection */ + this.CurrentConnectionEstablishTime_dt = new Date(); + /** Number of connections have been established so far */ + this.NumConnectionsEatablished_u32 = 0; + /** Half-connection */ + this.HalfConnection_bool = false; + /** VoIP / QoS */ + this.QoS_bool = false; + /** Maximum number of the underlying TCP connections */ + this.MaxTcpConnections_u32 = 0; + /** Number of current underlying TCP connections */ + this.NumTcpConnections_u32 = 0; + /** Number of inbound underlying connections */ + this.NumTcpConnectionsUpload_u32 = 0; + /** Number of outbound underlying connections */ + this.NumTcpConnectionsDownload_u32 = 0; + /** Use of encryption */ + this.UseEncrypt_bool = false; + /** Cipher algorithm name */ + this.CipherName_str = ""; + /** Use of compression */ + this.UseCompress_bool = false; + /** Is R-UDP session */ + this.IsRUDPSession_bool = false; + /** Physical underlying communication protocol */ + this.UnderlayProtocol_str = ""; + /** The UDP acceleration is enabled */ + this.IsUdpAccelerationEnabled_bool = false; + /** Using the UDP acceleration function */ + this.IsUsingUdpAcceleration_bool = false; + /** VPN session name */ + this.SessionName_str = ""; + /** Connection name */ + this.ConnectionName_str = ""; + /** Session key */ + this.SessionKey_bin = new Uint8Array([]); + /** Total transmitted data size */ + this.TotalSendSize_u64 = 0; + /** Total received data size */ + this.TotalRecvSize_u64 = 0; + /** Total transmitted data size (no compression) */ + this.TotalSendSizeReal_u64 = 0; + /** Total received data size (no compression) */ + this.TotalRecvSizeReal_u64 = 0; + /** Is Bridge Mode */ + this.IsBridgeMode_bool = false; + /** Is Monitor mode */ + this.IsMonitorMode_bool = false; + /** VLAN ID */ + this.VLanId_u32 = 0; + /** Client product name */ + this.ClientProductName_str = ""; + /** Client version */ + this.ClientProductVer_u32 = 0; + /** Client build number */ + this.ClientProductBuild_u32 = 0; + /** Client OS name */ + this.ClientOsName_str = ""; + /** Client OS version */ + this.ClientOsVer_str = ""; + /** Client OS Product ID */ + this.ClientOsProductId_str = ""; + /** Client host name */ + this.ClientHostname_str = ""; + /** Unique ID */ + this.UniqueId_bin = new Uint8Array([]); + Object.assign(this, init); + } + return VpnRpcSessionStatus; +}()); +exports.VpnRpcSessionStatus = VpnRpcSessionStatus; +/** Set the special listener */ +var VpnRpcSpecialListener = /** @class */ (function () { + /** Constructor for the 'VpnRpcSpecialListener' class: Set the special listener */ + function VpnRpcSpecialListener(init) { + /** The flag to activate the VPN over ICMP server function */ + this.VpnOverIcmpListener_bool = false; + /** The flag to activate the VPN over DNS function */ + this.VpnOverDnsListener_bool = false; + Object.assign(this, init); + } + return VpnRpcSpecialListener; +}()); +exports.VpnRpcSpecialListener = VpnRpcSpecialListener; +/** Syslog configuration */ +var VpnSyslogSaveType; +(function (VpnSyslogSaveType) { + /** Do not use syslog */ + VpnSyslogSaveType[VpnSyslogSaveType["None"] = 0] = "None"; + /** Only server log */ + VpnSyslogSaveType[VpnSyslogSaveType["ServerLog"] = 1] = "ServerLog"; + /** Server and Virtual HUB security log */ + VpnSyslogSaveType[VpnSyslogSaveType["ServerAndHubSecurityLog"] = 2] = "ServerAndHubSecurityLog"; + /** Server, Virtual HUB security, and packet log */ + VpnSyslogSaveType[VpnSyslogSaveType["ServerAndHubAllLog"] = 3] = "ServerAndHubAllLog"; +})(VpnSyslogSaveType = exports.VpnSyslogSaveType || (exports.VpnSyslogSaveType = {})); +/** Syslog configuration */ +var VpnSyslogSetting = /** @class */ (function () { + /** Constructor for the 'VpnSyslogSetting' class: Syslog configuration */ + function VpnSyslogSetting(init) { + /** The behavior of the syslog function */ + this.SaveType_u32 = 0; + /** Specify the host name or IP address of the syslog server */ + this.Hostname_str = ""; + /** Specify the port number of the syslog server */ + this.Port_u32 = 0; + Object.assign(this, init); + } + return VpnSyslogSetting; +}()); +exports.VpnSyslogSetting = VpnSyslogSetting; +/** VPN Gate Server Config */ +var VpnVgsConfig = /** @class */ (function () { + /** Constructor for the 'VpnVgsConfig' class: VPN Gate Server Config */ + function VpnVgsConfig(init) { + /** Active flag */ + this.IsEnabled_bool = false; + /** Message */ + this.Message_utf = ""; + /** Owner name */ + this.Owner_utf = ""; + /** Abuse email */ + this.Abuse_utf = ""; + /** Log save flag */ + this.NoLog_bool = false; + /** Save log permanently */ + this.LogPermanent_bool = false; + /** Enable the L2TP VPN function */ + this.EnableL2TP_bool = false; + Object.assign(this, init); + } + return VpnVgsConfig; +}()); +exports.VpnVgsConfig = VpnVgsConfig; +/** Read a Log file */ +var VpnRpcReadLogFile = /** @class */ (function () { + /** Constructor for the 'VpnRpcReadLogFile' class: Read a Log file */ + function VpnRpcReadLogFile(init) { + /** Server name */ + this.ServerName_str = ""; + /** File Path */ + this.FilePath_str = ""; + /** Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field. */ + this.Offset_u32 = 0; + /** Received buffer */ + this.Buffer_bin = new Uint8Array([]); + Object.assign(this, init); + } + return VpnRpcReadLogFile; +}()); +exports.VpnRpcReadLogFile = VpnRpcReadLogFile; +/** Rename link */ +var VpnRpcRenameLink = /** @class */ (function () { + /** Constructor for the 'VpnRpcRenameLink' class: Rename link */ + function VpnRpcRenameLink(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** The old name of the cascade connection */ + this.OldAccountName_utf = ""; + /** The new name of the cascade connection */ + this.NewAccountName_utf = ""; + Object.assign(this, init); + } + return VpnRpcRenameLink; +}()); +exports.VpnRpcRenameLink = VpnRpcRenameLink; +/** Online or offline the HUB */ +var VpnRpcSetHubOnline = /** @class */ (function () { + /** Constructor for the 'VpnRpcSetHubOnline' class: Online or offline the HUB */ + function VpnRpcSetHubOnline(init) { + /** The Virtual Hub name */ + this.HubName_str = ""; + /** Online / offline flag */ + this.Online_bool = false; + Object.assign(this, init); + } + return VpnRpcSetHubOnline; +}()); +exports.VpnRpcSetHubOnline = VpnRpcSetHubOnline; +/** Set Password */ +var VpnRpcSetPassword = /** @class */ (function () { + /** Constructor for the 'VpnRpcSetPassword' class: Set Password */ + function VpnRpcSetPassword(init) { + /** The plaintext password */ + this.PlainTextPassword_str = ""; + Object.assign(this, init); + } + return VpnRpcSetPassword; +}()); +exports.VpnRpcSetPassword = VpnRpcSetPassword; +// --- Utility codes --- +/** JSON-RPC request class. See https://www.jsonrpc.org/specification */ +var JsonRpcRequest = /** @class */ (function () { + function JsonRpcRequest(method, param, id) { + if (method === void 0) { method = ""; } + if (param === void 0) { param = null; } + if (id === void 0) { id = ""; } + this.jsonrpc = "2.0"; + this.method = method; + this.params = param; + this.id = id; + } + return JsonRpcRequest; +}()); +exports.JsonRpcRequest = JsonRpcRequest; +/** JSON-RPC error class. See https://www.jsonrpc.org/specification */ +var JsonRpcError = /** @class */ (function () { + function JsonRpcError(code, message, data) { + if (code === void 0) { code = 0; } + if (message === void 0) { message = ""; } + if (data === void 0) { data = null; } + this.code = code; + this.message = message; + this.data = data; + } + return JsonRpcError; +}()); +exports.JsonRpcError = JsonRpcError; +/** JSON-RPC response class with generics */ +var JsonRpcResponse = /** @class */ (function () { + function JsonRpcResponse() { + this.jsonrpc = "2.0"; + this.result = null; + this.error = null; + this.id = ""; + } + return JsonRpcResponse; +}()); +exports.JsonRpcResponse = JsonRpcResponse; +/** JSON-RPC client class. See https://www.jsonrpc.org/specification */ +var JsonRpcClient = /** @class */ (function () { + /** + * JSON-RPC client class constructor + * @param url The URL + * @param headers Additional HTTP headers + * @param send_credential Set true to use the same credential with the browsing web site. Valid only if the code is running on the web browser. + */ + function JsonRpcClient(url, headers, send_credential, nodejs_https_client_reject_untrusted_server_cert) { + this.BaseUrl = url; + this.headers = headers; + this.client = new HttpClient(); + this.client.SendCredential = send_credential; + this.client.NodeJS_HTTPS_Client_Reject_Unauthorized = nodejs_https_client_reject_untrusted_server_cert; + } + /** A utility function to convert any object to JSON string */ + JsonRpcClient.ObjectToJson = function (obj) { + return JSON.stringify(obj, function (key, value) { + if (key.endsWith("_bin")) { + return Util_Base64_Encode(value); + } + return value; + }, 4); + }; + /** A utility function to convert JSON string to object */ + JsonRpcClient.JsonToObject = function (str) { + return JSON.parse(str, function (key, value) { + if (key.endsWith("_bin")) { + return Util_Base64_Decode(value); + } + else if (key.endsWith("_dt")) { + return new Date(value); + } + return value; + }); + }; + /** + * Call a single RPC call (without error check). You can wait for the response with Promise or await statement. + * @param method_name The name of RPC method + * @param param The parameters + */ + JsonRpcClient.prototype.CallInternalAsync = function (method_name, param) { + return __awaiter(this, void 0, void 0, function () { + var id, req, req_string, http_response, ret_string; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + id = "1"; + req = new JsonRpcRequest(method_name, param, id); + req_string = JsonRpcClient.ObjectToJson(req); + if (debug_mode) { + console.log("--- RPC Request Body ---"); + console.log(req_string); + console.log("------------------------"); + } + return [4 /*yield*/, this.client.PostAsync(this.BaseUrl, this.headers, req_string, "application/json")]; + case 1: + http_response = _a.sent(); + ret_string = http_response.Body; + if (debug_mode) { + console.log("--- RPC Response Body ---"); + console.log(ret_string); + console.log("-------------------------"); + } + return [2 /*return*/, ret_string]; + } + }); + }); + }; + /** + * Call a single RPC call (with error check). You can wait for the response with Promise or await statement. In the case of error, it will be thrown. + * @param method_name The name of RPC method + * @param param The parameters + */ + JsonRpcClient.prototype.CallAsync = function (method_name, param) { + return __awaiter(this, void 0, void 0, function () { + var ret_string, ret; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.CallInternalAsync(method_name, param)]; + case 1: + ret_string = _a.sent(); + ret = JSON.parse(ret_string); + if (is_null(ret.error) === false) { + throw new JsonRpcException(ret.error); + } + return [2 /*return*/, ret.result]; + } + }); + }); + }; + return JsonRpcClient; +}()); +exports.JsonRpcClient = JsonRpcClient; +/** JSON-RPC exception class */ +var JsonRpcException = /** @class */ (function (_super) { + __extends(JsonRpcException, _super); + function JsonRpcException(error) { + var _this = _super.call(this, "Code=" + error.code + ", Message=" + error.message) || this; + _this.Error = error; + return _this; + } + return JsonRpcException; +}(Error)); +exports.JsonRpcException = JsonRpcException; +/** HTTP client exception class */ +var HttpClientException = /** @class */ (function (_super) { + __extends(HttpClientException, _super); + function HttpClientException(message) { + return _super.call(this, message) || this; + } + return HttpClientException; +}(Error)); +exports.HttpClientException = HttpClientException; +/** HTTP client response class */ +var HttpClientResponse = /** @class */ (function () { + function HttpClientResponse() { + this.Body = ""; + } + return HttpClientResponse; +}()); +exports.HttpClientResponse = HttpClientResponse; +/** An HTTP client which can be used in both web browsers and Node.js */ +var HttpClient = /** @class */ (function () { + function HttpClient() { + this.TimeoutMsecs = 60 * 5 * 1000; + this.SendCredential = true; + this.NodeJS_HTTPS_Client_Reject_Unauthorized = false; + } + /** Post method. In web browsers this function will process the request by itself. In Node.js this function will call PostAsync_NodeJS() instead. */ + HttpClient.prototype.PostAsync = function (url, headers, req_body, req_media_type) { + return __awaiter(this, void 0, void 0, function () { + var fetch_header_list, _i, _a, name_1, fetch_init, fetch_response, ret, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + if (is_node_js) { + return [2 /*return*/, this.PostAsync_NodeJS(url, headers, req_body, req_media_type)]; + } + fetch_header_list = new Headers(); + for (_i = 0, _a = Object.keys(headers); _i < _a.length; _i++) { + name_1 = _a[_i]; + fetch_header_list.append(name_1, headers[name_1]); + } + fetch_init = { + mode: "cors", + headers: fetch_header_list, + credentials: (this.SendCredential ? "include" : "omit"), + method: "POST", + cache: "no-cache", + keepalive: true, + redirect: "follow", + body: req_body + }; + return [4 /*yield*/, fetch(url, fetch_init)]; + case 1: + fetch_response = _c.sent(); + if (fetch_response.ok === false) { + throw new HttpClientException("HTTP Error: " + fetch_response.status + " " + fetch_response.statusText); + } + ret = new HttpClientResponse(); + _b = ret; + return [4 /*yield*/, fetch_response.text()]; + case 2: + _b.Body = _c.sent(); + return [2 /*return*/, ret]; + } + }); + }); + }; + /** Post method for Node.js. */ + HttpClient.prototype.PostAsync_NodeJS = function (url, headers, req_body, req_media_type) { + var https = require("https"); + var keepAliveAgent = new https.Agent({ keepAlive: true }); + var urlparse = require("url"); + var urlobj = urlparse.parse(url); + if (is_null(urlobj.host)) + throw new Error("URL is invalid."); + var options = { + host: urlobj.hostname, + port: urlobj.port, + path: urlobj.path, + rejectUnauthorized: this.NodeJS_HTTPS_Client_Reject_Unauthorized, + method: "POST", + timeout: this.TimeoutMsecs, + agent: keepAliveAgent + }; + return new Promise(function (resolve, reject) { + var req = https.request(options, function (res) { + if (res.statusCode !== 200) { + reject(new HttpClientException("HTTP Error: " + res.statusCode + " " + res.statusMessage)); + } + var recv_str = ""; + res.on("data", function (body) { + recv_str += body; + }); + res.on("end", function () { + var ret = new HttpClientResponse(); + ret.Body = recv_str; + resolve(ret); + }); + }).on("error", function (err) { + throw err; + }); + for (var _i = 0, _a = Object.keys(headers); _i < _a.length; _i++) { + var name_2 = _a[_i]; + req.setHeader(name_2, !is_null(headers[name_2]) ? headers[name_2] : ""); + } + req.setHeader("Content-Type", req_media_type); + req.setHeader("Content-Length", Buffer.byteLength(req_body)); + req.write(req_body); + req.end(); + }); + }; + return HttpClient; +}()); +exports.HttpClient = HttpClient; +//////// BEGIN: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js +// The MIT License(MIT) +// Copyright(c) 2014 +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +var lookup = []; +var revLookup = []; +var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; +} +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup["-".charCodeAt(0)] = 62; +revLookup["_".charCodeAt(0)] = 63; +function getLens(b64) { + var len = b64.length; + if (len % 4 > 0) { + throw new Error("Invalid string. Length must be a multiple of 4"); + } + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf("="); + if (validLen === -1) + validLen = len; + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4); + return [validLen, placeHoldersLen]; +} +// base64 is 4/3 + up to two characters of the original data +function byteLength(b64) { + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen; +} +function _byteLength(b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen; +} +function Util_Base64_Decode(b64) { + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + var arr = new Uint8Array(_byteLength(b64, validLen, placeHoldersLen)); + var curByte = 0; + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen; + for (var i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)]; + arr[curByte++] = (tmp >> 16) & 0xFF; + arr[curByte++] = (tmp >> 8) & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4); + arr[curByte++] = tmp & 0xFF; + } + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2); + arr[curByte++] = (tmp >> 8) & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + return arr; +} +exports.Util_Base64_Decode = Util_Base64_Decode; +function tripletToBase64(num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F]; +} +function encodeChunk(uint8, start, end) { + var tmp; + var output = []; + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF); + output.push(tripletToBase64(tmp)); + } + return output.join(""); +} +function Util_Base64_Encode(uint8) { + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); + } + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1]; + parts.push(lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + "=="); + } + else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1]; + parts.push(lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + "="); + } + return parts.join(""); +} +exports.Util_Base64_Encode = Util_Base64_Encode; +//////// END: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js +//# sourceMappingURL=vpnrpc.js.map \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js.map softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js.map --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js.map 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js.map 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1 @@ +{"version":3,"file":"vpnrpc.js","sourceRoot":"","sources":["../src/vpnrpc.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/LICENSE softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/LICENSE --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/LICENSE 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/Note_HowToPublish.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/Note_HowToPublish.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/Note_HowToPublish.txt 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/Note_HowToPublish.txt 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,5 @@ +npm install + +npm run build + +npm publish diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package.json softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package.json --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package.json 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package.json 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,30 @@ +{ + "name": "vpnrpc", + "version": "1.0.1", + "description": "", + "main": "dist/vpnrpc.js", + "scripts": { + "prepare": "tsc", + "build": "tsc" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/SoftEtherVPN/SoftEtherVPN.git" + }, + "keywords": [ + "vpn", + "softether" + ], + "author": "", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/SoftEtherVPN/SoftEtherVPN/issues" + }, + "homepage": "https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/#readme", + "devDependencies": { + "@types/node": "^12.0.2", + "ts-loader": "^6.0.1", + "tslint": "^5.16.0", + "typescript": "^3.4.5" + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package-lock.json softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package-lock.json --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package-lock.json 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package-lock.json 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,529 @@ +{ + "name": "vpnrpc", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@types/node": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz", + "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "resolve": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz", + "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-loader": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.0.1.tgz", + "integrity": "sha512-9H5ErTIw5t73sdSoFE0hX0RO45B7cdDA4pW1VIQ2wNFAhxSpZcAlv2fwMcfv6SAYLoI7uGwHuzC5dECzmzqtzA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", + "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "typescript": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/src/sample.ts softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/src/sample.ts --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/src/sample.ts 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/src/sample.ts 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,2690 @@ +// Test sample code for SoftEther VPN Server JSON-RPC Stub +// Runs on both web browsers and Node.js +// +// sample.ts +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// This sample code shows how to call all available RPC functions. +// You can copy and paste test code to write your own web browser TypeScript / JavaScript codes. +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + +// On the web browser uncomment below imports as necessary to support old browsers. +// import "core-js/es6/promise"; +// import "core-js/es6/string"; +// import "whatwg-fetch"; + + +// Import the vpnrpc.ts RPC stub. +import * as VPN from "./vpnrpc"; + +// Output JSON-RPC request / reply strings to the debug console. +VPN.VpnServerRpc.SetDebugMode(true); + +let api: VPN.VpnServerRpc; +// Creating the VpnServerRpc class instance here. +if (VPN.VpnServerRpc.IsNodeJS() === false) // // Determine if this JavaScript environment is on the Node.js or not +{ + // On the web browser. We do not need to specify any hostname, port or credential as the web browser already knows it. + api = new VPN.VpnServerRpc(); +} +else +{ + // On the Node.js. We need to specify the target VPN Server's hostname, port and credential. + api = new VPN.VpnServerRpc("127.0.0.1", 443, "", "PASSWORD_HERE", false); +} + +// A variable for test +let hub_name = "test"; + +// Call the Test_All() function to test almost all VPN APIs. +Test_All(); + + + + +/** Tests all VPN APIs */ +async function Test_All(): Promise +{ + hub_name = "TEST"; + await Test_Test(); + await Test_GetServerInfo(); + await Test_GetServerStatus(); + let new_listener_port: number = await Test_CreateListener(); + await Test_EnableListener(new_listener_port, false); + await Test_EnumListener(); + await Test_EnableListener(new_listener_port, true); + await Test_EnumListener(); + await Test_DeleteListener(new_listener_port); + await Test_SetServerPassword(); + await Test_GetFarmSetting(); + if (false) + { + await Test_SetFarmSetting(); + let farm_members: VPN.VpnRpcEnumFarm = await Test_EnumFarmMember(); + for (let farm_member of farm_members.FarmMemberList) + { + await Test_GetFarmInfo(farm_member.Id_u32); + } + await Test_GetFarmConnectionStatus(); + } + else if (false) + { + console.log("abc"); + } + else + { + console.log("def"); + } + await Test_GetServerCert(); + await Test_SetServerCert(); + await Test_GetServerCipher(); + await Test_SetServerCipher(); + let enum_connection: VPN.VpnRpcEnumConnection = await Test_EnumConnection(); + for (let connecton of enum_connection.ConnectionList) + { + await Test_GetConnectionInfo(connecton.Name_str); + } + hub_name = await Test_CreateHub(); + await Test_SetHub(); + await Test_GetHub(); + await Test_EnumHub(); + await Test_SetHubRadius(); + await Test_GetHubRadius(); + await Test_SetHubOnline(); + await Test_GetHubStatus(); + let hub_log_settings: VPN.VpnRpcHubLog = await Test_GetHubLog(); + await Test_SetHubLog(hub_log_settings); + await Test_AddCa(); + let enum_ca: VPN.VpnRpcHubEnumCA = await Test_EnumCa(); + for (let ca of enum_ca.CAList) + { + await Test_GetCa(ca.Key_u32); + await Test_DeleteCa(ca.Key_u32); + } + await Test_CreateLink(); + await Test_GetLink(); + await Test_SetLink(); + await Test_SetLinkOffline(); + await Test_SetLinkOnline(); + let enum_link: VPN.VpnRpcEnumLink = await Test_EnumLink(); + for (let link of enum_link.LinkList) + { + await Test_GetLinkStatus(link.AccountName_utf); + } + await new Promise((r) => setTimeout(r, 3000)); + await Test_RenameLink(); + await Test_DeleteLink(); + await Test_AddAccess(); + await Test_EnumAccess(); + await Test_DeleteAccess(); + await Test_SetAccessList(); + await Test_CreateGroup(); + await Test_SetGroup(); + await Test_GetGroup(); + await Test_CreateUser(); + await Test_SetUser(); + await Test_GetUser(); + await Test_EnumUser(); + await Test_EnumGroup(); + await Test_DeleteUser(); + await Test_DeleteGroup(); + let enum_session: VPN.VpnRpcEnumSession = await Test_EnumSession(); + for (let session of enum_session.SessionList) + { + await Test_GetSessionStatus(session.Name_str); + await Test_DeleteSession(session.Name_str); + } + let enum_mac: VPN.VpnRpcEnumMacTable = await Test_EnumMacTable(); + for (let mac of enum_mac.MacTable) + { + await Test_DeleteMacTable(mac.Key_u32); + } + let enum_ip: VPN.VpnRpcEnumIpTable = await Test_EnumIpTable(); + for (let ip of enum_ip.IpTable) + { + await Test_DeleteIpTable(ip.Key_u32); + } + await Test_SetKeep(); + await Test_GetKeep(); + await Test_EnableSecureNAT(); + await Test_GetSecureNATOption(); + await Test_SetSecureNATOption(); + await Test_EnumNAT(); + await Test_EnumDHCP(); + await Test_GetSecureNATStatus(); + await Test_DisableSecureNAT(); + await Test_EnumEthernet(); + await Test_EnumLocalBridge(); + await Test_GetBridgeSupport(); + await Test_GetCaps(); + await Test_GetConfig(); + await Test_GetDefaultHubAdminOptions(); + await Test_GetHubAdminOptions(); + await Test_SetHubAdminOptions(); + await Test_GetHubExtOptions(); + await Test_SetHubExtOptions(); + await Test_AddL3Switch(); + await Test_AddL3If(); + await Test_EnumL3Switch(); + await Test_EnumL3If(); + await Test_AddL3Table(); + await Test_EnumL3Table(); + await Test_DelL3Table(); + await Test_StartL3Switch(); + await Test_StopL3Switch(); + await Test_DelL3If(); + await Test_DelL3Switch(); + await Test_AddCrl(); + let enum_crl: VPN.VpnRpcEnumCrl = await Test_EnumCrl(); + for (let crl of enum_crl.CRLList) + { + let got_crl: VPN.VpnRpcCrl = await Test_GetCrl(crl.Key_u32); + got_crl.CommonName_utf = got_crl.CommonName_utf + "_a"; + await Test_SetCrl(got_crl); + } + enum_crl = await Test_EnumCrl(); + for (let crl of enum_crl.CRLList) + { + await Test_DelCrl(crl.Key_u32); + } + await Test_SetAcList(); + await Test_GetAcList(); + let enum_log_file: VPN.VpnRpcEnumLogFile = await Test_EnumLogFile(); + for (let log of enum_log_file.LogFiles) + { + await Test_ReadLogFile(log.FilePath_str); + break; + } + await Test_SetSysLog(true); + await Test_GetSysLog(); + await Test_SetSysLog(false); + await Test_SetHubMsg(); + await Test_GetHubMsg(); + await Test_GetAdminMsg(); + await Test_Flush(); + await Test_SetIPsecServices(); + await Test_GetIPsecServices(); + await Test_AddEtherIpId(); + let enum_etherip_id: VPN.VpnRpcEnumEtherIpId = await Test_EnumEtherIpId(); + for (let etherip_id of enum_etherip_id.Settings) + { + await Test_GetEtherIpId(etherip_id.Id_str); + await Test_DeleteEtherIpId(etherip_id.Id_str); + } + await Test_SetOpenVpnSstpConfig(); + await Test_GetOpenVpnSstpConfig(); + await Test_GetDDnsClientStatus(); + await Test_SetDDnsInternetSettng(); + await Test_GetDDnsInternetSettng(); + await Test_ChangeDDnsClientHostname(); + await Test_RegenerateServerCert(); + await Test_MakeOpenVpnConfigFile(); + await Test_SetSpecialListener(); + await Test_GetSpecialListener(); + await Test_GetAzureStatus(); + await Test_SetAzureStatus(); + await Test_SetVgsConfig(); + await Test_GetVgsConfig(); + await Test_DeleteHub(); + return; +} + +/** API test for 'Test', test RPC function */ +async function Test_Test(): Promise +{ + console.log("Begin: Test_Test"); + let a: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + IntValue_u32: 12345, + }); + let b: VPN.VpnRpcTest = await api.Test(a); + console.log(b); + console.log("End: Test_Test"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetServerInfo', Get server information */ +async function Test_GetServerInfo(): Promise +{ + console.log("Begin: Test_GetServerInfo"); + let info: VPN.VpnRpcServerInfo = await api.GetServerInfo(); + console.log(info); + console.log("End: Test_GetServerInfo"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetServerStatus', Get server status */ +async function Test_GetServerStatus(): Promise +{ + console.log("Begin: Test_GetServerStatus"); + let out_rpc_server_status: VPN.VpnRpcServerStatus = await api.GetServerStatus(); + console.log(out_rpc_server_status); + console.log("End: Test_GetServerStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateListener', Create a listener */ +async function Test_CreateListener(): Promise +{ + console.log("Begin: Test_CreateListener"); + let port: number = Math.floor((Math.random() * (65534 - 1025)) + 1025); + console.log("Creating a new listener port: Port " + port); + let in_rpc_listener: VPN.VpnRpcListener = new VPN.VpnRpcListener( + { + Enable_bool: true, + Port_u32: port, + }); + let out_rpc_listener: VPN.VpnRpcListener = await api.CreateListener(in_rpc_listener); + console.log("Done."); + console.log("End: Test_CreateListener"); + console.log("-----"); + console.log(); + return port; +} + +/** API test for 'EnumListener', Enumerating listeners */ +async function Test_EnumListener(): Promise +{ + console.log("Begin: Test_EnumListener"); + let out_rpc_listener_list: VPN.VpnRpcListenerList = await api.EnumListener(); + console.log(out_rpc_listener_list); + console.log("End: Test_EnumListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteListener', Delete a listener */ +async function Test_DeleteListener(port: number): Promise +{ + console.log("Begin: Test_DeleteListener"); + console.log("Deleting a new listener port: Port" + port); + let in_rpc_listener: VPN.VpnRpcListener = new VPN.VpnRpcListener( + { + Port_u32: port, + }); + let out_rpc_listener: VPN.VpnRpcListener = await api.DeleteListener(in_rpc_listener); + console.log("Done."); + console.log("End: Test_DeleteListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnableListener', Enable / Disable listener */ +async function Test_EnableListener(port: number, enabled: boolean): Promise +{ + console.log("Begin: Test_EnableListener"); + if (enabled) + { + console.log("Enabling listener port = " + port); + } + else + { + console.log("Disabling listener port = " + port); + } + let in_rpc_listener: VPN.VpnRpcListener = new VPN.VpnRpcListener( + { + Port_u32: port, + Enable_bool: enabled, + }); + let out_rpc_listener: VPN.VpnRpcListener = await api.EnableListener(in_rpc_listener); + console.log("Done."); + console.log("End: Test_EnableListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetServerPassword', Set server password */ +async function Test_SetServerPassword(): Promise +{ + let password: string = "microsoft"; + console.log("Begin: Test_SetServerPassword"); + console.log("Set the server administrator password to '" + password + "'."); + let in_rpc_set_password: VPN.VpnRpcSetPassword = new VPN.VpnRpcSetPassword( + { + PlainTextPassword_str: password, + }); + let out_rpc_set_password: VPN.VpnRpcSetPassword = await api.SetServerPassword(in_rpc_set_password); + console.log("Done."); + console.log("End: Test_SetServerPassword"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetFarmSetting', Set clustering configuration */ +async function Test_SetFarmSetting(): Promise +{ + console.log("Begin: Test_SetFarmSetting"); + let in_rpc_farm: VPN.VpnRpcFarm = new VPN.VpnRpcFarm( + { + ServerType_u32: VPN.VpnRpcServerType.FarmController, + NumPort_u32: 2, + Ports_u32: [ 443, 444, 445, ], + PublicIp_ip: "1.2.3.4", + ControllerName_str: "controller", + MemberPasswordPlaintext_str: "microsoft", + ControllerPort_u32: 443, + Weight_u32: 100, + ControllerOnly_bool: false, + }); + let out_rpc_farm: VPN.VpnRpcFarm = await api.SetFarmSetting(in_rpc_farm); + console.log("End: Test_SetFarmSetting"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetFarmSetting', Get clustering configuration */ +async function Test_GetFarmSetting(): Promise +{ + console.log("Begin: Test_GetFarmSetting"); + let out_rpc_farm: VPN.VpnRpcFarm = await api.GetFarmSetting(); + console.log(out_rpc_farm); + console.log("End: Test_GetFarmSetting"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetFarmInfo', Get cluster member information */ +async function Test_GetFarmInfo(id: number): Promise +{ + console.log("Begin: Test_GetFarmInfo"); + let in_rpc_farm_info: VPN.VpnRpcFarmInfo = new VPN.VpnRpcFarmInfo( + { + Id_u32: id, + }); + let out_rpc_farm_info: VPN.VpnRpcFarmInfo = await api.GetFarmInfo(in_rpc_farm_info); + console.log(out_rpc_farm_info); + console.log("End: Test_GetFarmInfo"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumFarmMember', Enumerate cluster members */ +async function Test_EnumFarmMember(): Promise +{ + console.log("Begin: Test_EnumFarmMember"); + let out_rpc_enum_farm: VPN.VpnRpcEnumFarm = await api.EnumFarmMember(); + console.log(out_rpc_enum_farm); + console.log("End: Test_EnumFarmMember"); + console.log("-----"); + console.log(); + return out_rpc_enum_farm; +} + +/** API test for 'GetFarmConnectionStatus', Get status of connection to cluster controller */ +async function Test_GetFarmConnectionStatus(): Promise +{ + console.log("Begin: Test_GetFarmConnectionStatus"); + let out_rpc_farm_connection_status: VPN.VpnRpcFarmConnectionStatus = await api.GetFarmConnectionStatus(); + console.log(out_rpc_farm_connection_status); + console.log("End: Test_GetFarmConnectionStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetServerCert', Set the server certification */ +async function Test_SetServerCert(): Promise +{ + console.log("Begin: Test_SetServerCert"); + let in_rpc_key_pair: VPN.VpnRpcKeyPair = new VPN.VpnRpcKeyPair( + { + Cert_bin: new Uint8Array([ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x72, 0x6a, 0x43, 0x43, 0x41, 0x70, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x0a, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x0a, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4e, 0x4d, 0x54, 0x67, 0x78, 0x4d, 0x44, 0x45, 0x78, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x68, 0x63, 0x4e, 0x4e, 0x44, 0x49, 0x78, 0x4d, 0x44, 0x41, 0x31, 0x0a, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x6a, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x0a, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x0a, 0x67, 0x67, 0x45, 0x69, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4b, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x0a, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x0a, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x0a, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x0a, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x0a, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x0a, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, 0x67, 0x59, 0x59, 0x77, 0x67, 0x59, 0x4d, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2f, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2f, 0x7a, 0x41, 0x4c, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4d, 0x43, 0x41, 0x66, 0x59, 0x77, 0x59, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6c, 0x0a, 0x42, 0x46, 0x77, 0x77, 0x57, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x45, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x43, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x41, 0x77, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x51, 0x47, 0x43, 0x43, 0x73, 0x47, 0x0a, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x46, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x42, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x63, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x49, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x43, 0x54, 0x41, 0x4e, 0x0a, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x45, 0x41, 0x46, 0x6d, 0x34, 0x37, 0x47, 0x55, 0x70, 0x50, 0x57, 0x35, 0x2b, 0x37, 0x69, 0x46, 0x74, 0x69, 0x6c, 0x6f, 0x6b, 0x35, 0x32, 0x49, 0x6f, 0x54, 0x57, 0x72, 0x74, 0x46, 0x67, 0x32, 0x79, 0x69, 0x36, 0x6b, 0x49, 0x32, 0x69, 0x52, 0x4e, 0x51, 0x0a, 0x4b, 0x75, 0x67, 0x48, 0x55, 0x49, 0x4f, 0x34, 0x4b, 0x53, 0x71, 0x4a, 0x56, 0x42, 0x50, 0x38, 0x61, 0x4b, 0x4f, 0x61, 0x54, 0x5a, 0x47, 0x45, 0x31, 0x4b, 0x4d, 0x68, 0x2f, 0x59, 0x6a, 0x68, 0x36, 0x71, 0x2f, 0x67, 0x50, 0x61, 0x6c, 0x67, 0x64, 0x2f, 0x38, 0x44, 0x6d, 0x72, 0x78, 0x53, 0x4a, 0x6d, 0x55, 0x78, 0x33, 0x62, 0x4e, 0x62, 0x38, 0x52, 0x59, 0x36, 0x70, 0x4b, 0x7a, 0x74, 0x0a, 0x5a, 0x64, 0x75, 0x53, 0x61, 0x53, 0x2b, 0x57, 0x55, 0x30, 0x59, 0x74, 0x2b, 0x6c, 0x47, 0x35, 0x76, 0x56, 0x67, 0x61, 0x70, 0x48, 0x45, 0x71, 0x36, 0x79, 0x71, 0x4c, 0x62, 0x65, 0x56, 0x78, 0x51, 0x4c, 0x75, 0x62, 0x54, 0x69, 0x6e, 0x4f, 0x66, 0x56, 0x56, 0x5a, 0x58, 0x79, 0x45, 0x43, 0x59, 0x47, 0x4d, 0x73, 0x59, 0x71, 0x65, 0x6e, 0x4a, 0x6a, 0x4e, 0x63, 0x62, 0x49, 0x5a, 0x4e, 0x0a, 0x79, 0x4d, 0x75, 0x72, 0x46, 0x63, 0x67, 0x30, 0x34, 0x36, 0x4f, 0x34, 0x59, 0x79, 0x68, 0x56, 0x79, 0x71, 0x53, 0x69, 0x74, 0x43, 0x59, 0x37, 0x68, 0x2f, 0x65, 0x71, 0x67, 0x6b, 0x50, 0x4a, 0x51, 0x30, 0x68, 0x6b, 0x70, 0x39, 0x45, 0x64, 0x51, 0x77, 0x62, 0x6e, 0x38, 0x56, 0x6c, 0x66, 0x78, 0x64, 0x42, 0x58, 0x77, 0x51, 0x34, 0x4e, 0x48, 0x4b, 0x30, 0x4a, 0x56, 0x46, 0x2f, 0x33, 0x0a, 0x71, 0x48, 0x61, 0x68, 0x4e, 0x48, 0x4f, 0x35, 0x64, 0x62, 0x4a, 0x5a, 0x57, 0x59, 0x41, 0x62, 0x42, 0x44, 0x70, 0x32, 0x51, 0x45, 0x53, 0x70, 0x76, 0x6f, 0x2b, 0x38, 0x33, 0x6c, 0x68, 0x34, 0x64, 0x6e, 0x58, 0x6a, 0x46, 0x58, 0x4d, 0x43, 0x48, 0x76, 0x52, 0x68, 0x35, 0x31, 0x79, 0x2f, 0x54, 0x71, 0x79, 0x42, 0x34, 0x56, 0x76, 0x72, 0x52, 0x4b, 0x49, 0x4b, 0x74, 0x54, 0x6f, 0x7a, 0x0a, 0x5a, 0x6a, 0x48, 0x59, 0x49, 0x63, 0x62, 0x6a, 0x76, 0x53, 0x58, 0x4d, 0x7a, 0x61, 0x44, 0x50, 0x6a, 0x50, 0x63, 0x5a, 0x47, 0x6a, 0x42, 0x4a, 0x6c, 0x47, 0x36, 0x43, 0x76, 0x44, 0x34, 0x4c, 0x6d, 0x59, 0x7a, 0x72, 0x6b, 0x48, 0x34, 0x31, 0x63, 0x7a, 0x72, 0x34, 0x57, 0x41, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, ]), + Key_bin: new Uint8Array([ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x45, 0x76, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x53, 0x43, 0x42, 0x4b, 0x67, 0x77, 0x67, 0x67, 0x53, 0x6b, 0x41, 0x67, 0x45, 0x41, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x0a, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x0a, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x0a, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x0a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x0a, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x0a, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x45, 0x43, 0x67, 0x67, 0x45, 0x41, 0x54, 0x77, 0x34, 0x52, 0x6f, 0x52, 0x4c, 0x6a, 0x73, 0x68, 0x72, 0x42, 0x56, 0x6f, 0x59, 0x69, 0x78, 0x4f, 0x4a, 0x2b, 0x57, 0x4c, 0x6d, 0x2f, 0x45, 0x51, 0x57, 0x65, 0x37, 0x6f, 0x6a, 0x38, 0x31, 0x51, 0x50, 0x73, 0x39, 0x56, 0x45, 0x49, 0x32, 0x62, 0x53, 0x4f, 0x0a, 0x34, 0x4a, 0x51, 0x42, 0x55, 0x42, 0x53, 0x6b, 0x70, 0x64, 0x48, 0x34, 0x57, 0x32, 0x77, 0x51, 0x75, 0x2f, 0x61, 0x58, 0x57, 0x38, 0x75, 0x75, 0x53, 0x39, 0x45, 0x43, 0x6d, 0x6d, 0x41, 0x41, 0x75, 0x45, 0x79, 0x4a, 0x54, 0x56, 0x7a, 0x75, 0x31, 0x32, 0x35, 0x58, 0x73, 0x65, 0x63, 0x6c, 0x44, 0x41, 0x55, 0x38, 0x49, 0x55, 0x70, 0x54, 0x2b, 0x70, 0x4c, 0x35, 0x79, 0x70, 0x37, 0x34, 0x0a, 0x45, 0x62, 0x76, 0x4e, 0x48, 0x48, 0x33, 0x67, 0x65, 0x72, 0x4f, 0x67, 0x78, 0x76, 0x49, 0x6a, 0x50, 0x64, 0x67, 0x77, 0x62, 0x66, 0x6d, 0x4d, 0x49, 0x59, 0x48, 0x62, 0x56, 0x70, 0x6e, 0x49, 0x30, 0x77, 0x32, 0x42, 0x43, 0x44, 0x51, 0x76, 0x74, 0x64, 0x64, 0x57, 0x6f, 0x42, 0x74, 0x41, 0x33, 0x43, 0x54, 0x6a, 0x63, 0x2f, 0x43, 0x56, 0x67, 0x73, 0x47, 0x77, 0x33, 0x43, 0x4e, 0x72, 0x0a, 0x46, 0x78, 0x41, 0x46, 0x35, 0x73, 0x4a, 0x34, 0x63, 0x5a, 0x4c, 0x6e, 0x5a, 0x31, 0x45, 0x36, 0x69, 0x74, 0x4c, 0x54, 0x50, 0x69, 0x6f, 0x6a, 0x74, 0x76, 0x48, 0x48, 0x34, 0x61, 0x64, 0x6d, 0x68, 0x68, 0x43, 0x61, 0x42, 0x49, 0x78, 0x76, 0x47, 0x2f, 0x53, 0x6e, 0x59, 0x77, 0x4e, 0x35, 0x38, 0x37, 0x55, 0x5a, 0x6d, 0x37, 0x4c, 0x57, 0x50, 0x61, 0x67, 0x4c, 0x41, 0x33, 0x67, 0x69, 0x0a, 0x48, 0x4b, 0x4f, 0x2b, 0x4b, 0x79, 0x42, 0x51, 0x39, 0x33, 0x31, 0x4e, 0x4d, 0x61, 0x65, 0x6a, 0x36, 0x6d, 0x75, 0x75, 0x46, 0x32, 0x30, 0x32, 0x76, 0x34, 0x37, 0x6c, 0x57, 0x6b, 0x64, 0x50, 0x4f, 0x6e, 0x52, 0x43, 0x69, 0x6f, 0x4d, 0x58, 0x30, 0x63, 0x31, 0x6a, 0x36, 0x76, 0x32, 0x61, 0x59, 0x34, 0x34, 0x77, 0x55, 0x4b, 0x71, 0x39, 0x4d, 0x52, 0x67, 0x6f, 0x52, 0x76, 0x4a, 0x37, 0x0a, 0x41, 0x39, 0x77, 0x65, 0x72, 0x4c, 0x6b, 0x68, 0x35, 0x78, 0x78, 0x35, 0x35, 0x32, 0x4f, 0x74, 0x71, 0x50, 0x36, 0x73, 0x61, 0x6d, 0x75, 0x47, 0x44, 0x52, 0x78, 0x31, 0x42, 0x70, 0x36, 0x53, 0x4f, 0x70, 0x68, 0x43, 0x45, 0x50, 0x48, 0x59, 0x67, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x36, 0x33, 0x65, 0x2b, 0x52, 0x75, 0x6c, 0x36, 0x46, 0x78, 0x47, 0x43, 0x76, 0x67, 0x70, 0x6b, 0x33, 0x0a, 0x57, 0x67, 0x2f, 0x54, 0x31, 0x77, 0x2f, 0x59, 0x4b, 0x6b, 0x79, 0x4f, 0x49, 0x46, 0x4c, 0x63, 0x46, 0x4c, 0x57, 0x71, 0x42, 0x44, 0x71, 0x6c, 0x6e, 0x58, 0x65, 0x63, 0x6c, 0x6b, 0x50, 0x4b, 0x6a, 0x57, 0x4e, 0x2f, 0x32, 0x70, 0x4a, 0x6d, 0x4f, 0x31, 0x63, 0x46, 0x63, 0x44, 0x4a, 0x46, 0x59, 0x64, 0x32, 0x45, 0x49, 0x45, 0x72, 0x76, 0x42, 0x57, 0x54, 0x34, 0x51, 0x39, 0x4d, 0x42, 0x0a, 0x4e, 0x35, 0x6c, 0x44, 0x6b, 0x47, 0x75, 0x6a, 0x34, 0x2f, 0x6b, 0x68, 0x56, 0x6c, 0x79, 0x6e, 0x77, 0x62, 0x64, 0x42, 0x6e, 0x47, 0x43, 0x34, 0x61, 0x34, 0x48, 0x4a, 0x49, 0x4a, 0x76, 0x61, 0x35, 0x63, 0x70, 0x49, 0x63, 0x57, 0x65, 0x4a, 0x72, 0x35, 0x61, 0x57, 0x33, 0x69, 0x44, 0x36, 0x68, 0x53, 0x73, 0x61, 0x6c, 0x79, 0x55, 0x76, 0x4a, 0x4d, 0x6d, 0x64, 0x4d, 0x42, 0x6e, 0x47, 0x0a, 0x37, 0x2b, 0x50, 0x65, 0x53, 0x2b, 0x4e, 0x73, 0x4b, 0x30, 0x61, 0x63, 0x31, 0x67, 0x33, 0x4d, 0x6c, 0x56, 0x35, 0x42, 0x41, 0x32, 0x70, 0x55, 0x54, 0x77, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x62, 0x65, 0x46, 0x6d, 0x2b, 0x46, 0x46, 0x35, 0x62, 0x76, 0x6f, 0x4b, 0x7a, 0x49, 0x4c, 0x6c, 0x31, 0x62, 0x79, 0x6b, 0x6c, 0x52, 0x6b, 0x69, 0x76, 0x7a, 0x6b, 0x62, 0x7a, 0x49, 0x6b, 0x41, 0x78, 0x0a, 0x35, 0x56, 0x6b, 0x74, 0x67, 0x36, 0x4a, 0x35, 0x63, 0x76, 0x38, 0x44, 0x35, 0x2b, 0x72, 0x71, 0x50, 0x75, 0x6a, 0x4f, 0x66, 0x39, 0x67, 0x42, 0x6a, 0x4e, 0x37, 0x70, 0x64, 0x78, 0x39, 0x39, 0x35, 0x6b, 0x47, 0x49, 0x78, 0x5a, 0x39, 0x6d, 0x31, 0x68, 0x57, 0x69, 0x78, 0x55, 0x55, 0x31, 0x55, 0x6f, 0x38, 0x72, 0x70, 0x39, 0x4a, 0x69, 0x47, 0x4f, 0x36, 0x72, 0x65, 0x31, 0x77, 0x69, 0x0a, 0x6a, 0x56, 0x2f, 0x4c, 0x31, 0x64, 0x37, 0x55, 0x66, 0x39, 0x48, 0x6a, 0x65, 0x61, 0x70, 0x4f, 0x46, 0x62, 0x34, 0x6b, 0x72, 0x71, 0x52, 0x58, 0x54, 0x65, 0x75, 0x4d, 0x6e, 0x35, 0x35, 0x44, 0x33, 0x64, 0x70, 0x79, 0x6a, 0x51, 0x4e, 0x43, 0x30, 0x5a, 0x50, 0x72, 0x61, 0x6d, 0x58, 0x64, 0x38, 0x31, 0x57, 0x6f, 0x6f, 0x56, 0x77, 0x58, 0x59, 0x41, 0x66, 0x69, 0x46, 0x76, 0x4c, 0x49, 0x0a, 0x6f, 0x66, 0x31, 0x37, 0x51, 0x67, 0x67, 0x49, 0x59, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x59, 0x55, 0x67, 0x67, 0x43, 0x34, 0x58, 0x49, 0x67, 0x5a, 0x76, 0x58, 0x34, 0x59, 0x65, 0x55, 0x38, 0x6c, 0x61, 0x79, 0x51, 0x50, 0x79, 0x4b, 0x71, 0x67, 0x38, 0x37, 0x2f, 0x76, 0x31, 0x2b, 0x7a, 0x35, 0x79, 0x65, 0x2f, 0x4d, 0x32, 0x5a, 0x65, 0x36, 0x53, 0x6e, 0x37, 0x48, 0x4a, 0x66, 0x59, 0x0a, 0x55, 0x5a, 0x4d, 0x36, 0x37, 0x48, 0x37, 0x52, 0x4b, 0x4e, 0x6f, 0x68, 0x46, 0x6c, 0x35, 0x43, 0x39, 0x65, 0x44, 0x4e, 0x7a, 0x67, 0x72, 0x50, 0x6b, 0x52, 0x63, 0x2f, 0x2f, 0x54, 0x77, 0x32, 0x45, 0x48, 0x74, 0x59, 0x68, 0x33, 0x42, 0x4b, 0x49, 0x6f, 0x72, 0x77, 0x39, 0x45, 0x64, 0x78, 0x59, 0x4e, 0x6c, 0x6b, 0x2b, 0x6a, 0x4e, 0x73, 0x30, 0x30, 0x64, 0x57, 0x35, 0x34, 0x64, 0x39, 0x0a, 0x65, 0x69, 0x69, 0x7a, 0x7a, 0x78, 0x59, 0x34, 0x34, 0x2f, 0x41, 0x32, 0x70, 0x39, 0x52, 0x49, 0x4d, 0x67, 0x79, 0x35, 0x49, 0x52, 0x77, 0x76, 0x53, 0x73, 0x6d, 0x50, 0x67, 0x61, 0x71, 0x34, 0x6f, 0x4b, 0x4d, 0x64, 0x54, 0x4e, 0x4d, 0x4f, 0x73, 0x30, 0x4a, 0x77, 0x65, 0x79, 0x50, 0x72, 0x42, 0x65, 0x49, 0x41, 0x72, 0x62, 0x46, 0x43, 0x67, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x43, 0x71, 0x0a, 0x57, 0x30, 0x34, 0x56, 0x33, 0x49, 0x75, 0x74, 0x33, 0x55, 0x42, 0x6f, 0x75, 0x50, 0x4d, 0x63, 0x63, 0x38, 0x2f, 0x56, 0x62, 0x69, 0x77, 0x48, 0x77, 0x79, 0x2b, 0x52, 0x6c, 0x4c, 0x6d, 0x4e, 0x77, 0x59, 0x41, 0x71, 0x63, 0x79, 0x35, 0x50, 0x35, 0x58, 0x4b, 0x4c, 0x33, 0x70, 0x36, 0x62, 0x65, 0x33, 0x2b, 0x4d, 0x6f, 0x76, 0x48, 0x52, 0x71, 0x6a, 0x35, 0x78, 0x72, 0x4a, 0x54, 0x57, 0x0a, 0x54, 0x6a, 0x2f, 0x36, 0x59, 0x61, 0x51, 0x73, 0x31, 0x2b, 0x72, 0x74, 0x63, 0x51, 0x45, 0x61, 0x74, 0x64, 0x34, 0x4b, 0x50, 0x66, 0x64, 0x78, 0x53, 0x2f, 0x63, 0x66, 0x52, 0x74, 0x38, 0x71, 0x74, 0x75, 0x42, 0x77, 0x51, 0x61, 0x2f, 0x34, 0x39, 0x4d, 0x72, 0x41, 0x4c, 0x76, 0x57, 0x43, 0x4c, 0x53, 0x42, 0x75, 0x4b, 0x74, 0x33, 0x49, 0x49, 0x75, 0x53, 0x2f, 0x51, 0x44, 0x74, 0x43, 0x0a, 0x5a, 0x4e, 0x67, 0x6d, 0x36, 0x4d, 0x78, 0x71, 0x4e, 0x6e, 0x49, 0x43, 0x58, 0x35, 0x46, 0x34, 0x36, 0x6d, 0x52, 0x49, 0x52, 0x42, 0x42, 0x4f, 0x32, 0x4b, 0x7a, 0x6c, 0x30, 0x33, 0x68, 0x62, 0x51, 0x6c, 0x71, 0x58, 0x4c, 0x5a, 0x63, 0x38, 0x6f, 0x51, 0x4b, 0x42, 0x67, 0x43, 0x53, 0x77, 0x66, 0x46, 0x7a, 0x68, 0x48, 0x76, 0x78, 0x36, 0x68, 0x69, 0x64, 0x57, 0x67, 0x48, 0x4a, 0x63, 0x0a, 0x77, 0x79, 0x76, 0x64, 0x6e, 0x70, 0x58, 0x78, 0x36, 0x5a, 0x4c, 0x6e, 0x6f, 0x61, 0x7a, 0x61, 0x6f, 0x48, 0x47, 0x74, 0x4d, 0x47, 0x43, 0x45, 0x5a, 0x49, 0x50, 0x66, 0x6a, 0x4c, 0x42, 0x63, 0x30, 0x4d, 0x74, 0x79, 0x45, 0x64, 0x53, 0x4c, 0x78, 0x54, 0x6c, 0x35, 0x59, 0x70, 0x78, 0x6f, 0x6d, 0x43, 0x46, 0x55, 0x4d, 0x33, 0x55, 0x63, 0x59, 0x4e, 0x2f, 0x50, 0x5a, 0x66, 0x58, 0x41, 0x0a, 0x6d, 0x36, 0x31, 0x45, 0x6d, 0x71, 0x53, 0x53, 0x4d, 0x56, 0x63, 0x47, 0x50, 0x67, 0x65, 0x2f, 0x43, 0x34, 0x44, 0x42, 0x5a, 0x59, 0x6a, 0x53, 0x45, 0x71, 0x62, 0x67, 0x37, 0x6d, 0x73, 0x52, 0x30, 0x33, 0x37, 0x42, 0x58, 0x54, 0x48, 0x6b, 0x78, 0x44, 0x62, 0x33, 0x71, 0x48, 0x46, 0x54, 0x6f, 0x30, 0x6b, 0x48, 0x57, 0x4a, 0x66, 0x34, 0x39, 0x59, 0x77, 0x32, 0x73, 0x77, 0x6a, 0x54, 0x0a, 0x72, 0x4f, 0x38, 0x46, 0x46, 0x44, 0x52, 0x56, 0x50, 0x44, 0x4c, 0x5a, 0x61, 0x37, 0x36, 0x47, 0x67, 0x79, 0x41, 0x55, 0x4a, 0x38, 0x55, 0x63, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, ]), + }); + let out_rpc_key_pair: VPN.VpnRpcKeyPair = await api.SetServerCert(in_rpc_key_pair); + console.log(out_rpc_key_pair); + console.log("End: Test_SetServerCert"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetServerCert', Get the server certification */ +async function Test_GetServerCert(): Promise +{ + console.log("Begin: Test_GetServerCert"); + let out_rpc_key_pair: VPN.VpnRpcKeyPair = await api.GetServerCert(); + console.log(out_rpc_key_pair); + console.log("End: Test_GetServerCert"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetServerCipher', Get cipher for SSL */ +async function Test_GetServerCipher(): Promise +{ + console.log("Begin: Test_GetServerCipher"); + let out_rpc_str: VPN.VpnRpcStr = await api.GetServerCipher(); + console.log(out_rpc_str); + console.log("End: Test_GetServerCipher"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetServerCipher', Set cipher for SSL to the server */ +async function Test_SetServerCipher(): Promise +{ + console.log("Begin: Test_SetServerCipher"); + let in_rpc_str: VPN.VpnRpcStr = new VPN.VpnRpcStr( + { + String_str: "RC4-MD5", + }); + let out_rpc_str: VPN.VpnRpcStr = await api.SetServerCipher(in_rpc_str); + console.log(out_rpc_str); + console.log("End: Test_SetServerCipher"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateHub', Create a hub */ +async function Test_CreateHub(): Promise +{ + let hub_name: string = "Test_" + Math.floor((Math.random() * (999999 - 100000)) + 100000); + console.log("Begin: Test_CreateHub"); + let in_rpc_create_hub: VPN.VpnRpcCreateHub = new VPN.VpnRpcCreateHub( + { + HubName_str: hub_name, + HubType_u32: VPN.VpnRpcHubType.Standalone, + Online_bool: true, + AdminPasswordPlainText_str: "microsoft", + MaxSession_u32: 123, + NoEnum_bool: false, + }); + let out_rpc_create_hub: VPN.VpnRpcCreateHub = await api.CreateHub(in_rpc_create_hub); + console.log(out_rpc_create_hub); + console.log("End: Test_CreateHub"); + console.log("-----"); + console.log(); + return hub_name; +} + +/** API test for 'SetHub', Set hub configuration */ +async function Test_SetHub(): Promise +{ + console.log("Begin: Test_SetHub"); + let in_rpc_create_hub: VPN.VpnRpcCreateHub = new VPN.VpnRpcCreateHub( + { + HubName_str: hub_name, + AdminPasswordPlainText_str: "aho", + HubType_u32: VPN.VpnRpcHubType.Standalone, + NoEnum_bool: false, + MaxSession_u32: 128, + Online_bool: true, + }); + let out_rpc_create_hub: VPN.VpnRpcCreateHub = await api.SetHub(in_rpc_create_hub); + console.log(out_rpc_create_hub); + console.log("End: Test_SetHub"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHub', Get hub configuration */ +async function Test_GetHub(): Promise +{ + console.log("Begin: Test_GetHub"); + let in_rpc_create_hub: VPN.VpnRpcCreateHub = new VPN.VpnRpcCreateHub( + { + HubName_str: hub_name, + }); + let out_rpc_create_hub: VPN.VpnRpcCreateHub = await api.GetHub(in_rpc_create_hub); + console.log(out_rpc_create_hub); + console.log("End: Test_GetHub"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumHub', Enumerate hubs */ +async function Test_EnumHub(): Promise +{ + console.log("Begin: Test_EnumHub"); + let out_rpc_enum_hub: VPN.VpnRpcEnumHub = await api.EnumHub(); + console.log(out_rpc_enum_hub); + console.log("End: Test_EnumHub"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteHub', Delete a hub */ +async function Test_DeleteHub(): Promise +{ + console.log("Begin: Test_DeleteHub"); + let in_rpc_delete_hub: VPN.VpnRpcDeleteHub = new VPN.VpnRpcDeleteHub( + { + HubName_str: hub_name, + }); + let out_rpc_delete_hub: VPN.VpnRpcDeleteHub = await api.DeleteHub(in_rpc_delete_hub); + console.log(out_rpc_delete_hub); + console.log("End: Test_DeleteHub"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubRadius', Get Radius options of the hub */ +async function Test_GetHubRadius(): Promise +{ + console.log("Begin: Test_GetHubRadius"); + let in_rpc_radius: VPN.VpnRpcRadius = new VPN.VpnRpcRadius( + { + HubName_str: hub_name, + }); + let out_rpc_radius: VPN.VpnRpcRadius = await api.GetHubRadius(in_rpc_radius); + console.log(out_rpc_radius); + console.log("End: Test_GetHubRadius"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubRadius', Set Radius options of the hub */ +async function Test_SetHubRadius(): Promise +{ + console.log("Begin: Test_SetHubRadius"); + let in_rpc_radius: VPN.VpnRpcRadius = new VPN.VpnRpcRadius( + { + HubName_str: hub_name, + RadiusServerName_str: "1.2.3.4", + RadiusPort_u32: 1234, + RadiusSecret_str: "microsoft", + RadiusRetryInterval_u32: 1000, + }); + let out_rpc_radius: VPN.VpnRpcRadius = await api.SetHubRadius(in_rpc_radius); + console.log(out_rpc_radius); + console.log("End: Test_SetHubRadius"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumConnection', Enumerate connections */ +async function Test_EnumConnection(): Promise +{ + console.log("Begin: Test_EnumConnection"); + let out_rpc_enum_connection: VPN.VpnRpcEnumConnection = await api.EnumConnection(); + console.log(out_rpc_enum_connection); + console.log("End: Test_EnumConnection"); + console.log("-----"); + console.log(); + return out_rpc_enum_connection; +} + +/** API test for 'DisconnectConnection', Disconnect a connection */ +async function Test_DisconnectConnection(connection_id: string): Promise +{ + console.log("Begin: Test_DisconnectConnection"); + let in_rpc_disconnect_connection: VPN.VpnRpcDisconnectConnection = new VPN.VpnRpcDisconnectConnection( + { + Name_str: connection_id, + }); + let out_rpc_disconnect_connection: VPN.VpnRpcDisconnectConnection = await api.DisconnectConnection(in_rpc_disconnect_connection); + console.log(out_rpc_disconnect_connection); + console.log("End: Test_DisconnectConnection"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetConnectionInfo', Get connection information */ +async function Test_GetConnectionInfo(name: string): Promise +{ + console.log("Begin: Test_GetConnectionInfo"); + let in_rpc_connection_info: VPN.VpnRpcConnectionInfo = new VPN.VpnRpcConnectionInfo( + { + Name_str: name, + }); + let out_rpc_connection_info: VPN.VpnRpcConnectionInfo = await api.GetConnectionInfo(in_rpc_connection_info); + console.log(out_rpc_connection_info); + console.log("End: Test_GetConnectionInfo"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubOnline', Make a hub on-line or off-line */ +async function Test_SetHubOnline(): Promise +{ + console.log("Begin: Test_SetHubOnline"); + let in_rpc_set_hub_online: VPN.VpnRpcSetHubOnline = new VPN.VpnRpcSetHubOnline( + { + HubName_str: hub_name, + Online_bool: true, + }); + let out_rpc_set_hub_online: VPN.VpnRpcSetHubOnline = await api.SetHubOnline(in_rpc_set_hub_online); + console.log(out_rpc_set_hub_online); + console.log("End: Test_SetHubOnline"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubStatus', Get hub status */ +async function Test_GetHubStatus(): Promise +{ + console.log("Begin: Test_GetHubStatus"); + let in_rpc_hub_status: VPN.VpnRpcHubStatus = new VPN.VpnRpcHubStatus( + { + HubName_str: hub_name, + }); + let out_rpc_hub_status: VPN.VpnRpcHubStatus = await api.GetHubStatus(in_rpc_hub_status); + console.log(out_rpc_hub_status); + console.log("End: Test_GetHubStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubLog', Set logging configuration into the hub */ +async function Test_SetHubLog(in_rpc_hub_log: VPN.VpnRpcHubLog): Promise +{ + console.log("Begin: Test_SetHubLog"); + let out_rpc_hub_log: VPN.VpnRpcHubLog = await api.SetHubLog(in_rpc_hub_log); + console.log(out_rpc_hub_log); + console.log("End: Test_SetHubLog"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubLog', Get logging configuration of the hub */ +async function Test_GetHubLog(): Promise +{ + console.log("Begin: Test_GetHubLog"); + let in_rpc_hub_log: VPN.VpnRpcHubLog = new VPN.VpnRpcHubLog( + { + HubName_str: hub_name, + }); + let out_rpc_hub_log: VPN.VpnRpcHubLog = await api.GetHubLog(in_rpc_hub_log); + console.log(out_rpc_hub_log); + console.log("End: Test_GetHubLog"); + console.log("-----"); + console.log(); + return out_rpc_hub_log; +} + +/** API test for 'AddCa', Add CA(Certificate Authority) into the hub */ +async function Test_AddCa(): Promise +{ + console.log("Begin: Test_AddCa"); + let in_rpc_hub_add_ca: VPN.VpnRpcHubAddCA = new VPN.VpnRpcHubAddCA( + { + HubName_str: hub_name, + Cert_bin: new Uint8Array([ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x72, 0x6a, 0x43, 0x43, 0x41, 0x70, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x0a, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x0a, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4e, 0x4d, 0x54, 0x67, 0x78, 0x4d, 0x44, 0x45, 0x78, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x68, 0x63, 0x4e, 0x4e, 0x44, 0x49, 0x78, 0x4d, 0x44, 0x41, 0x31, 0x0a, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x6a, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x0a, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x0a, 0x67, 0x67, 0x45, 0x69, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4b, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x0a, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x0a, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x0a, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x0a, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x0a, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x0a, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, 0x67, 0x59, 0x59, 0x77, 0x67, 0x59, 0x4d, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2f, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2f, 0x7a, 0x41, 0x4c, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4d, 0x43, 0x41, 0x66, 0x59, 0x77, 0x59, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6c, 0x0a, 0x42, 0x46, 0x77, 0x77, 0x57, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x45, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x43, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x41, 0x77, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x51, 0x47, 0x43, 0x43, 0x73, 0x47, 0x0a, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x46, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x42, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x63, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x49, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x43, 0x54, 0x41, 0x4e, 0x0a, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x45, 0x41, 0x46, 0x6d, 0x34, 0x37, 0x47, 0x55, 0x70, 0x50, 0x57, 0x35, 0x2b, 0x37, 0x69, 0x46, 0x74, 0x69, 0x6c, 0x6f, 0x6b, 0x35, 0x32, 0x49, 0x6f, 0x54, 0x57, 0x72, 0x74, 0x46, 0x67, 0x32, 0x79, 0x69, 0x36, 0x6b, 0x49, 0x32, 0x69, 0x52, 0x4e, 0x51, 0x0a, 0x4b, 0x75, 0x67, 0x48, 0x55, 0x49, 0x4f, 0x34, 0x4b, 0x53, 0x71, 0x4a, 0x56, 0x42, 0x50, 0x38, 0x61, 0x4b, 0x4f, 0x61, 0x54, 0x5a, 0x47, 0x45, 0x31, 0x4b, 0x4d, 0x68, 0x2f, 0x59, 0x6a, 0x68, 0x36, 0x71, 0x2f, 0x67, 0x50, 0x61, 0x6c, 0x67, 0x64, 0x2f, 0x38, 0x44, 0x6d, 0x72, 0x78, 0x53, 0x4a, 0x6d, 0x55, 0x78, 0x33, 0x62, 0x4e, 0x62, 0x38, 0x52, 0x59, 0x36, 0x70, 0x4b, 0x7a, 0x74, 0x0a, 0x5a, 0x64, 0x75, 0x53, 0x61, 0x53, 0x2b, 0x57, 0x55, 0x30, 0x59, 0x74, 0x2b, 0x6c, 0x47, 0x35, 0x76, 0x56, 0x67, 0x61, 0x70, 0x48, 0x45, 0x71, 0x36, 0x79, 0x71, 0x4c, 0x62, 0x65, 0x56, 0x78, 0x51, 0x4c, 0x75, 0x62, 0x54, 0x69, 0x6e, 0x4f, 0x66, 0x56, 0x56, 0x5a, 0x58, 0x79, 0x45, 0x43, 0x59, 0x47, 0x4d, 0x73, 0x59, 0x71, 0x65, 0x6e, 0x4a, 0x6a, 0x4e, 0x63, 0x62, 0x49, 0x5a, 0x4e, 0x0a, 0x79, 0x4d, 0x75, 0x72, 0x46, 0x63, 0x67, 0x30, 0x34, 0x36, 0x4f, 0x34, 0x59, 0x79, 0x68, 0x56, 0x79, 0x71, 0x53, 0x69, 0x74, 0x43, 0x59, 0x37, 0x68, 0x2f, 0x65, 0x71, 0x67, 0x6b, 0x50, 0x4a, 0x51, 0x30, 0x68, 0x6b, 0x70, 0x39, 0x45, 0x64, 0x51, 0x77, 0x62, 0x6e, 0x38, 0x56, 0x6c, 0x66, 0x78, 0x64, 0x42, 0x58, 0x77, 0x51, 0x34, 0x4e, 0x48, 0x4b, 0x30, 0x4a, 0x56, 0x46, 0x2f, 0x33, 0x0a, 0x71, 0x48, 0x61, 0x68, 0x4e, 0x48, 0x4f, 0x35, 0x64, 0x62, 0x4a, 0x5a, 0x57, 0x59, 0x41, 0x62, 0x42, 0x44, 0x70, 0x32, 0x51, 0x45, 0x53, 0x70, 0x76, 0x6f, 0x2b, 0x38, 0x33, 0x6c, 0x68, 0x34, 0x64, 0x6e, 0x58, 0x6a, 0x46, 0x58, 0x4d, 0x43, 0x48, 0x76, 0x52, 0x68, 0x35, 0x31, 0x79, 0x2f, 0x54, 0x71, 0x79, 0x42, 0x34, 0x56, 0x76, 0x72, 0x52, 0x4b, 0x49, 0x4b, 0x74, 0x54, 0x6f, 0x7a, 0x0a, 0x5a, 0x6a, 0x48, 0x59, 0x49, 0x63, 0x62, 0x6a, 0x76, 0x53, 0x58, 0x4d, 0x7a, 0x61, 0x44, 0x50, 0x6a, 0x50, 0x63, 0x5a, 0x47, 0x6a, 0x42, 0x4a, 0x6c, 0x47, 0x36, 0x43, 0x76, 0x44, 0x34, 0x4c, 0x6d, 0x59, 0x7a, 0x72, 0x6b, 0x48, 0x34, 0x31, 0x63, 0x7a, 0x72, 0x34, 0x57, 0x41, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, ]), + }); + let out_rpc_hub_add_ca: VPN.VpnRpcHubAddCA = await api.AddCa(in_rpc_hub_add_ca); + console.log(out_rpc_hub_add_ca); + console.log("End: Test_AddCa"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumCa', Enumerate CA(Certificate Authority) in the hub */ +async function Test_EnumCa(): Promise +{ + console.log("Begin: Test_EnumCa"); + let in_rpc_hub_enum_ca: VPN.VpnRpcHubEnumCA = new VPN.VpnRpcHubEnumCA( + { + HubName_str: hub_name, + }); + let out_rpc_hub_enum_ca: VPN.VpnRpcHubEnumCA = await api.EnumCa(in_rpc_hub_enum_ca); + console.log(out_rpc_hub_enum_ca); + console.log("End: Test_EnumCa"); + console.log("-----"); + console.log(); + return out_rpc_hub_enum_ca; +} + +/** API test for 'GetCa', Get CA(Certificate Authority) setting from the hub */ +async function Test_GetCa(key: number): Promise +{ + console.log("Begin: Test_GetCa"); + let in_rpc_hub_get_ca: VPN.VpnRpcHubGetCA = new VPN.VpnRpcHubGetCA( + { + HubName_str: hub_name, + Key_u32: key, + }); + let out_rpc_hub_get_ca: VPN.VpnRpcHubGetCA = await api.GetCa(in_rpc_hub_get_ca); + console.log(out_rpc_hub_get_ca); + console.log("End: Test_GetCa"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteCa', Delete a CA(Certificate Authority) setting from the hub */ +async function Test_DeleteCa(key: number): Promise +{ + console.log("Begin: Test_DeleteCa"); + let in_rpc_hub_delete_ca: VPN.VpnRpcHubDeleteCA = new VPN.VpnRpcHubDeleteCA( + { + HubName_str: hub_name, + Key_u32: key, + }); + let out_rpc_hub_delete_ca: VPN.VpnRpcHubDeleteCA = await api.DeleteCa(in_rpc_hub_delete_ca); + console.log(out_rpc_hub_delete_ca); + console.log("End: Test_DeleteCa"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetLinkOnline', Make a link into on-line */ +async function Test_SetLinkOnline(): Promise +{ + console.log("Begin: Test_SetLinkOnline"); + let in_rpc_link: VPN.VpnRpcLink = new VPN.VpnRpcLink( + { + HubName_str: hub_name, + AccountName_utf: "linktest", + }); + let out_rpc_link: VPN.VpnRpcLink = await api.SetLinkOnline(in_rpc_link); + console.log(out_rpc_link); + console.log("End: Test_SetLinkOnline"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetLinkOffline', Make a link into off-line */ +async function Test_SetLinkOffline(): Promise +{ + console.log("Begin: Test_SetLinkOffline"); + let in_rpc_link: VPN.VpnRpcLink = new VPN.VpnRpcLink( + { + HubName_str: hub_name, + AccountName_utf: "linktest", + }); + let out_rpc_link: VPN.VpnRpcLink = await api.SetLinkOffline(in_rpc_link); + console.log(out_rpc_link); + console.log("End: Test_SetLinkOffline"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteLink', Delete a link */ +async function Test_DeleteLink(): Promise +{ + console.log("Begin: Test_DeleteLink"); + let in_rpc_link: VPN.VpnRpcLink = new VPN.VpnRpcLink( + { + HubName_str: hub_name, + AccountName_utf: "linktest2", + }); + let out_rpc_link: VPN.VpnRpcLink = await api.DeleteLink(in_rpc_link); + console.log(out_rpc_link); + console.log("End: Test_DeleteLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'RenameLink', Rename link (cascade connection) */ +async function Test_RenameLink(): Promise +{ + console.log("Begin: Test_RenameLink"); + let in_rpc_rename_link: VPN.VpnRpcRenameLink = new VPN.VpnRpcRenameLink( + { + HubName_str: hub_name, + OldAccountName_utf: "linktest", + NewAccountName_utf: "linktest2", + }); + let out_rpc_rename_link: VPN.VpnRpcRenameLink = await api.RenameLink(in_rpc_rename_link); + console.log(out_rpc_rename_link); + console.log("End: Test_RenameLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateLink', Create a new link(cascade) */ +async function Test_CreateLink(): Promise +{ + console.log("Begin: Test_CreateLink"); + let in_rpc_create_link: VPN.VpnRpcCreateLink = new VPN.VpnRpcCreateLink( + { + HubName_Ex_str: hub_name, + CheckServerCert_bool: false, + AccountName_utf: "linktest", + Hostname_str: "1.2.3.4", + Port_u32: 443, + ProxyType_u32: 0, + HubName_str: "ABC", + MaxConnection_u32: 16, + UseEncrypt_bool: true, + UseCompress_bool: false, + HalfConnection_bool: true, + AdditionalConnectionInterval_u32: 2, + ConnectionDisconnectSpan_u32: 24, + AuthType_u32: VPN.VpnRpcClientAuthType.PlainPassword, + Username_str: "181012", + PlainPassword_str: "microsoft", + HashedPassword_bin: new Uint8Array([ ]), + ClientX_bin: new Uint8Array([ ]), + ClientK_bin: new Uint8Array([ ]), + ["policy:DHCPFilter_bool"]: true, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: true, + SecPol_CheckMac_bool: true, + SecPol_CheckIP_bool: true, + ["policy:ArpDhcpOnly_bool"]: true, + ["policy:PrivacyFilter_bool"]: true, + ["policy:NoServer_bool"]: true, + ["policy:NoBroadcastLimiter_bool"]: true, + ["policy:MaxMac_u32"]: 32, + ["policy:MaxIP_u32"]: 64, + ["policy:MaxUpload_u32"]: 960000, + ["policy:MaxDownload_u32"]: 1280000, + ["policy:RSandRAFilter_bool"]: true, + SecPol_RAFilter_bool: true, + ["policy:DHCPv6Filter_bool"]: true, + ["policy:DHCPv6NoServer_bool"]: true, + SecPol_CheckIPv6_bool: true, + ["policy:NoServerV6_bool"]: true, + ["policy:MaxIPv6_u32"]: 127, + ["policy:FilterIPv4_bool"]: true, + ["policy:FilterIPv6_bool"]: true, + ["policy:FilterNonIP_bool"]: true, + ["policy:NoIPv6DefaultRouterInRA_bool"]: true, + ["policy:VLanId_u32"]: 123, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_create_link: VPN.VpnRpcCreateLink = await api.CreateLink(in_rpc_create_link); + console.log(out_rpc_create_link); + console.log("End: Test_CreateLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetLink', Get link configuration */ +async function Test_GetLink(): Promise +{ + console.log("Begin: Test_GetLink"); + let in_rpc_create_link: VPN.VpnRpcCreateLink = new VPN.VpnRpcCreateLink( + { + HubName_Ex_str: hub_name, + AccountName_utf: "linktest", + }); + let out_rpc_create_link: VPN.VpnRpcCreateLink = await api.GetLink(in_rpc_create_link); + console.log(out_rpc_create_link); + console.log("End: Test_GetLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetLink', Set link configuration */ +async function Test_SetLink(): Promise +{ + console.log("Begin: Test_SetLink"); + let in_rpc_create_link: VPN.VpnRpcCreateLink = new VPN.VpnRpcCreateLink( + { + HubName_Ex_str: hub_name, + CheckServerCert_bool: false, + AccountName_utf: "linktest", + Hostname_str: "1.2.3.4", + Port_u32: 443, + ProxyType_u32: 0, + HubName_str: "ABC", + MaxConnection_u32: 16, + UseEncrypt_bool: true, + UseCompress_bool: false, + HalfConnection_bool: true, + AdditionalConnectionInterval_u32: 2, + ConnectionDisconnectSpan_u32: 24, + AuthType_u32: VPN.VpnRpcClientAuthType.PlainPassword, + Username_str: "181012", + PlainPassword_str: "microsoft", + HashedPassword_bin: new Uint8Array([ ]), + ClientX_bin: new Uint8Array([ ]), + ClientK_bin: new Uint8Array([ ]), + ["policy:DHCPFilter_bool"]: true, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: true, + SecPol_CheckMac_bool: true, + SecPol_CheckIP_bool: true, + ["policy:ArpDhcpOnly_bool"]: true, + ["policy:PrivacyFilter_bool"]: true, + ["policy:NoServer_bool"]: true, + ["policy:NoBroadcastLimiter_bool"]: true, + ["policy:MaxMac_u32"]: 32, + ["policy:MaxIP_u32"]: 64, + ["policy:MaxUpload_u32"]: 960000, + ["policy:MaxDownload_u32"]: 1280000, + ["policy:RSandRAFilter_bool"]: true, + SecPol_RAFilter_bool: true, + ["policy:DHCPv6Filter_bool"]: true, + ["policy:DHCPv6NoServer_bool"]: true, + SecPol_CheckIPv6_bool: true, + ["policy:NoServerV6_bool"]: true, + ["policy:MaxIPv6_u32"]: 127, + ["policy:FilterIPv4_bool"]: true, + ["policy:FilterIPv6_bool"]: true, + ["policy:FilterNonIP_bool"]: true, + ["policy:NoIPv6DefaultRouterInRA_bool"]: true, + ["policy:VLanId_u32"]: 123, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_create_link: VPN.VpnRpcCreateLink = await api.SetLink(in_rpc_create_link); + console.log(out_rpc_create_link); + console.log("End: Test_SetLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumLink', Enumerate links */ +async function Test_EnumLink(): Promise +{ + console.log("Begin: Test_EnumLink"); + let in_rpc_enum_link: VPN.VpnRpcEnumLink = new VPN.VpnRpcEnumLink( + { + HubName_str: hub_name, + }); + let out_rpc_enum_link: VPN.VpnRpcEnumLink = await api.EnumLink(in_rpc_enum_link); + console.log(out_rpc_enum_link); + console.log("End: Test_EnumLink"); + console.log("-----"); + console.log(); + return out_rpc_enum_link; +} + +/** API test for 'GetLinkStatus', Get link status */ +async function Test_GetLinkStatus(name: string): Promise +{ + console.log("Begin: Test_GetLinkStatus"); + let in_rpc_link_status: VPN.VpnRpcLinkStatus = new VPN.VpnRpcLinkStatus( + { + HubName_Ex_str: hub_name, + AccountName_utf: name, + }); + let out_rpc_link_status: VPN.VpnRpcLinkStatus = await api.GetLinkStatus(in_rpc_link_status); + console.log(out_rpc_link_status); + console.log("End: Test_GetLinkStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddAccess', Add access list entry */ +async function Test_AddAccess(): Promise +{ + console.log("Begin: Test_AddAccess"); + let in_rpc_add_access_ipv4: VPN.VpnRpcAddAccess = new VPN.VpnRpcAddAccess( + { + HubName_str: hub_name, + AccessListSingle: [ new VPN.VpnAccess( + { + Note_utf: "IPv4 Test", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: false, + SrcIpAddress_ip: "192.168.0.0", + SrcSubnetMask_ip: "255.255.255.0", + DestIpAddress_ip: "10.0.0.0", + DestSubnetMask_ip: "255.255.0.0", + Protocol_u32: VPN.VpnIpProtocolNumber.TCP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([ 1, 2, 3, 0, 0, 0, ]), + SrcMacMask_bin: new Uint8Array([ 255, 255, 255, 0, 0, 0, ]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho", + }), ], + }); + let out_rpc_add_access_ipv4: VPN.VpnRpcAddAccess = await api.AddAccess(in_rpc_add_access_ipv4); + let in_rpc_add_access_ipv6: VPN.VpnRpcAddAccess = new VPN.VpnRpcAddAccess( + { + HubName_str: hub_name, + AccessListSingle: [ new VPN.VpnAccess( + { + Note_utf: "IPv6 Test", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: true, + SrcIpAddress6_bin: new Uint8Array([ 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), + SrcSubnetMask6_bin: new Uint8Array([ 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), + Protocol_u32: VPN.VpnIpProtocolNumber.UDP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([ 1, 2, 3, 0, 0, 0, ]), + SrcMacMask_bin: new Uint8Array([ 255, 255, 255, 0, 0, 0, ]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho", + }), ], + }); + let out_rpc_add_access_ipv6: VPN.VpnRpcAddAccess = await api.AddAccess(in_rpc_add_access_ipv6); + console.log("End: Test_AddAccess"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteAccess', Delete access list entry */ +async function Test_DeleteAccess(): Promise +{ + console.log("Begin: Test_DeleteAccess"); + let in_rpc_delete_access: VPN.VpnRpcDeleteAccess = new VPN.VpnRpcDeleteAccess( + { + HubName_str: hub_name, + Id_u32: 1, + }); + let out_rpc_delete_access: VPN.VpnRpcDeleteAccess = await api.DeleteAccess(in_rpc_delete_access); + console.log(out_rpc_delete_access); + console.log("End: Test_DeleteAccess"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumAccess', Get access list */ +async function Test_EnumAccess(): Promise +{ + console.log("Begin: Test_EnumAccess"); + let in_rpc_enum_access_list: VPN.VpnRpcEnumAccessList = new VPN.VpnRpcEnumAccessList( + { + HubName_str: hub_name, + }); + let out_rpc_enum_access_list: VPN.VpnRpcEnumAccessList = await api.EnumAccess(in_rpc_enum_access_list); + console.log(out_rpc_enum_access_list); + console.log("End: Test_EnumAccess"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetAccessList', Set access list */ +async function Test_SetAccessList(): Promise +{ + console.log("Begin: Test_SetAccessList"); + let in_rpc_enum_access_list: VPN.VpnRpcEnumAccessList = new VPN.VpnRpcEnumAccessList( + { + HubName_str: hub_name, + AccessList: [ new VPN.VpnAccess( + { + Note_utf: "IPv4 Test 2", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: false, + SrcIpAddress_ip: "192.168.0.0", + SrcSubnetMask_ip: "255.255.255.0", + DestIpAddress_ip: "10.0.0.0", + DestSubnetMask_ip: "255.255.0.0", + Protocol_u32: VPN.VpnIpProtocolNumber.TCP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([ 1, 2, 3, 0, 0, 0, ]), + SrcMacMask_bin: new Uint8Array([ 255, 255, 255, 0, 0, 0, ]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho", + }), new VPN.VpnAccess( + { + Note_utf: "IPv6 Test 2", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: true, + SrcIpAddress6_bin: new Uint8Array([ 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), + SrcSubnetMask6_bin: new Uint8Array([ 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), + Protocol_u32: VPN.VpnIpProtocolNumber.UDP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([ 1, 2, 3, 0, 0, 0, ]), + SrcMacMask_bin: new Uint8Array([ 255, 255, 255, 0, 0, 0, ]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho", + }), ], + }); + let out_rpc_enum_access_list: VPN.VpnRpcEnumAccessList = await api.SetAccessList(in_rpc_enum_access_list); + console.log(out_rpc_enum_access_list); + console.log("End: Test_SetAccessList"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateUser', Create a user */ +async function Test_CreateUser(): Promise +{ + console.log("Begin: Test_CreateUser"); + let in_rpc_set_user: VPN.VpnRpcSetUser = new VPN.VpnRpcSetUser( + { + HubName_str: hub_name, + Name_str: "test1", + Realname_utf: "Cat man", + Note_utf: "Hey!!!", + AuthType_u32: VPN.VpnRpcUserAuthType.Password, + Auth_Password_str: "microsoft", + UserX_bin: new Uint8Array([ ]), + Serial_bin: new Uint8Array([ ]), + CommonName_utf: "", + RadiusUsername_utf: "", + NtUsername_utf: "", + ExpireTime_dt: new Date(2019, 1, 1), + UsePolicy_bool: true, + ["policy:Access_bool"]: true, + ["policy:DHCPFilter_bool"]: false, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: false, + ["policy:NoBridge_bool"]: false, + ["policy:NoRouting_bool"]: false, + ["policy:CheckMac_bool"]: false, + ["policy:CheckIP_bool"]: false, + ["policy:ArpDhcpOnly_bool"]: false, + ["policy:PrivacyFilter_bool"]: false, + ["policy:NoServer_bool"]: false, + ["policy:NoBroadcastLimiter_bool"]: false, + ["policy:MonitorPort_bool"]: false, + ["policy:MaxConnection_u32"]: 32, + ["policy:TimeOut_u32"]: 15, + ["policy:MaxMac_u32"]: 1000, + ["policy:MaxIP_u32"]: 1000, + ["policy:MaxUpload_u32"]: 1000000000, + ["policy:MaxDownload_u32"]: 1000000000, + ["policy:FixPassword_bool"]: false, + ["policy:MultiLogins_u32"]: 1000, + ["policy:NoQoS_bool"]: false, + ["policy:RSandRAFilter_bool"]: false, + ["policy:RAFilter_bool"]: false, + ["policy:DHCPv6Filter_bool"]: false, + ["policy:DHCPv6NoServer_bool"]: false, + ["policy:NoRoutingV6_bool"]: false, + ["policy:CheckIPv6_bool"]: false, + ["policy:NoServerV6_bool"]: false, + ["policy:MaxIPv6_u32"]: 1234, + ["policy:NoSavePassword_bool"]: false, + ["policy:AutoDisconnect_u32"]: 0, + ["policy:FilterIPv4_bool"]: false, + ["policy:FilterIPv6_bool"]: false, + ["policy:FilterNonIP_bool"]: false, + ["policy:NoIPv6DefaultRouterInRA_bool"]: false, + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: false, + ["policy:VLanId_u32"]: 0, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_set_user: VPN.VpnRpcSetUser = await api.CreateUser(in_rpc_set_user); + console.log("End: Test_CreateUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetUser', Set user setting */ +async function Test_SetUser(): Promise +{ + console.log("Begin: Test_SetUser"); + let in_rpc_set_user: VPN.VpnRpcSetUser = new VPN.VpnRpcSetUser( + { + HubName_str: hub_name, + Name_str: "test1", + Realname_utf: "Cat man", + Note_utf: "Hey!!!", + GroupName_str: "group1", + AuthType_u32: VPN.VpnRpcUserAuthType.Anonymous, + Auth_Password_str: "", + UserX_bin: new Uint8Array([ ]), + Serial_bin: new Uint8Array([ ]), + CommonName_utf: "", + RadiusUsername_utf: "", + NtUsername_utf: "", + ExpireTime_dt: new Date(2019, 1, 1), + UsePolicy_bool: true, + ["policy:Access_bool"]: true, + ["policy:DHCPFilter_bool"]: false, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: false, + ["policy:NoBridge_bool"]: false, + ["policy:NoRouting_bool"]: false, + ["policy:CheckMac_bool"]: false, + ["policy:CheckIP_bool"]: false, + ["policy:ArpDhcpOnly_bool"]: false, + ["policy:PrivacyFilter_bool"]: false, + ["policy:NoServer_bool"]: false, + ["policy:NoBroadcastLimiter_bool"]: false, + ["policy:MonitorPort_bool"]: false, + ["policy:MaxConnection_u32"]: 32, + ["policy:TimeOut_u32"]: 15, + ["policy:MaxMac_u32"]: 1000, + ["policy:MaxIP_u32"]: 1000, + ["policy:MaxUpload_u32"]: 1000000000, + ["policy:MaxDownload_u32"]: 1000000000, + ["policy:FixPassword_bool"]: false, + ["policy:MultiLogins_u32"]: 1000, + ["policy:NoQoS_bool"]: false, + ["policy:RSandRAFilter_bool"]: false, + ["policy:RAFilter_bool"]: false, + ["policy:DHCPv6Filter_bool"]: false, + ["policy:DHCPv6NoServer_bool"]: false, + ["policy:NoRoutingV6_bool"]: false, + ["policy:CheckIPv6_bool"]: false, + ["policy:NoServerV6_bool"]: false, + ["policy:MaxIPv6_u32"]: 1234, + ["policy:NoSavePassword_bool"]: false, + ["policy:AutoDisconnect_u32"]: 0, + ["policy:FilterIPv4_bool"]: false, + ["policy:FilterIPv6_bool"]: false, + ["policy:FilterNonIP_bool"]: false, + ["policy:NoIPv6DefaultRouterInRA_bool"]: false, + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: false, + ["policy:VLanId_u32"]: 0, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_set_user: VPN.VpnRpcSetUser = await api.SetUser(in_rpc_set_user); + console.log("End: Test_SetUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetUser', Get user setting */ +async function Test_GetUser(): Promise +{ + console.log("Begin: Test_GetUser"); + let in_rpc_set_user: VPN.VpnRpcSetUser = new VPN.VpnRpcSetUser( + { + HubName_str: hub_name, + Name_str: "test1", + }); + let out_rpc_set_user: VPN.VpnRpcSetUser = await api.GetUser(in_rpc_set_user); + console.log(out_rpc_set_user); + console.log("End: Test_GetUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteUser', Delete a user */ +async function Test_DeleteUser(): Promise +{ + console.log("Begin: Test_DeleteUser"); + let in_rpc_delete_user: VPN.VpnRpcDeleteUser = new VPN.VpnRpcDeleteUser( + { + HubName_str: hub_name, + Name_str: "test1", + }); + let out_rpc_delete_user: VPN.VpnRpcDeleteUser = await api.DeleteUser(in_rpc_delete_user); + console.log("End: Test_DeleteUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumUser', Enumerate users */ +async function Test_EnumUser(): Promise +{ + console.log("Begin: Test_EnumUser"); + let in_rpc_enum_user: VPN.VpnRpcEnumUser = new VPN.VpnRpcEnumUser( + { + HubName_str: hub_name, + }); + let out_rpc_enum_user: VPN.VpnRpcEnumUser = await api.EnumUser(in_rpc_enum_user); + console.log(out_rpc_enum_user); + console.log("End: Test_EnumUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateGroup', Create a group */ +async function Test_CreateGroup(): Promise +{ + console.log("Begin: Test_CreateGroup"); + let in_rpc_set_group: VPN.VpnRpcSetGroup = new VPN.VpnRpcSetGroup( + { + HubName_str: hub_name, + Name_str: "group1", + Realname_utf: "Cat group", + Note_utf: "This is it! This is it!!", + UsePolicy_bool: true, + ["policy:Access_bool"]: true, + ["policy:DHCPFilter_bool"]: false, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: false, + ["policy:NoBridge_bool"]: false, + ["policy:NoRouting_bool"]: false, + ["policy:CheckMac_bool"]: false, + ["policy:CheckIP_bool"]: false, + ["policy:ArpDhcpOnly_bool"]: false, + ["policy:PrivacyFilter_bool"]: false, + ["policy:NoServer_bool"]: false, + ["policy:NoBroadcastLimiter_bool"]: false, + ["policy:MonitorPort_bool"]: false, + ["policy:MaxConnection_u32"]: 32, + ["policy:TimeOut_u32"]: 15, + ["policy:MaxMac_u32"]: 1000, + ["policy:MaxIP_u32"]: 1000, + ["policy:MaxUpload_u32"]: 1000000000, + ["policy:MaxDownload_u32"]: 1000000000, + ["policy:FixPassword_bool"]: false, + ["policy:MultiLogins_u32"]: 1000, + ["policy:NoQoS_bool"]: false, + ["policy:RSandRAFilter_bool"]: false, + ["policy:RAFilter_bool"]: false, + ["policy:DHCPv6Filter_bool"]: false, + ["policy:DHCPv6NoServer_bool"]: false, + ["policy:NoRoutingV6_bool"]: false, + ["policy:CheckIPv6_bool"]: false, + ["policy:NoServerV6_bool"]: false, + ["policy:MaxIPv6_u32"]: 1234, + ["policy:NoSavePassword_bool"]: false, + ["policy:AutoDisconnect_u32"]: 0, + ["policy:FilterIPv4_bool"]: false, + ["policy:FilterIPv6_bool"]: false, + ["policy:FilterNonIP_bool"]: false, + ["policy:NoIPv6DefaultRouterInRA_bool"]: false, + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: false, + ["policy:VLanId_u32"]: 0, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_set_group: VPN.VpnRpcSetGroup = await api.CreateGroup(in_rpc_set_group); + console.log(out_rpc_set_group); + console.log("End: Test_CreateGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetGroup', Set group setting */ +async function Test_SetGroup(): Promise +{ + console.log("Begin: Test_SetGroup"); + let in_rpc_set_group: VPN.VpnRpcSetGroup = new VPN.VpnRpcSetGroup( + { + HubName_str: hub_name, + Name_str: "group1", + Realname_utf: "Cat group 2", + Note_utf: "This is it! This is it!! 2", + UsePolicy_bool: true, + ["policy:Access_bool"]: true, + ["policy:DHCPFilter_bool"]: false, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: false, + ["policy:NoBridge_bool"]: false, + ["policy:NoRouting_bool"]: false, + ["policy:CheckMac_bool"]: false, + ["policy:CheckIP_bool"]: false, + ["policy:ArpDhcpOnly_bool"]: false, + ["policy:PrivacyFilter_bool"]: false, + ["policy:NoServer_bool"]: false, + ["policy:NoBroadcastLimiter_bool"]: false, + ["policy:MonitorPort_bool"]: false, + ["policy:MaxConnection_u32"]: 32, + ["policy:TimeOut_u32"]: 15, + ["policy:MaxMac_u32"]: 1000, + ["policy:MaxIP_u32"]: 1000, + ["policy:MaxUpload_u32"]: 1000000000, + ["policy:MaxDownload_u32"]: 1000000000, + ["policy:FixPassword_bool"]: false, + ["policy:MultiLogins_u32"]: 1000, + ["policy:NoQoS_bool"]: false, + ["policy:RSandRAFilter_bool"]: false, + ["policy:RAFilter_bool"]: false, + ["policy:DHCPv6Filter_bool"]: false, + ["policy:DHCPv6NoServer_bool"]: false, + ["policy:NoRoutingV6_bool"]: false, + ["policy:CheckIPv6_bool"]: false, + ["policy:NoServerV6_bool"]: false, + ["policy:MaxIPv6_u32"]: 1234, + ["policy:NoSavePassword_bool"]: false, + ["policy:AutoDisconnect_u32"]: 0, + ["policy:FilterIPv4_bool"]: false, + ["policy:FilterIPv6_bool"]: false, + ["policy:FilterNonIP_bool"]: false, + ["policy:NoIPv6DefaultRouterInRA_bool"]: false, + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: false, + ["policy:VLanId_u32"]: 0, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_set_group: VPN.VpnRpcSetGroup = await api.SetGroup(in_rpc_set_group); + console.log(out_rpc_set_group); + console.log("End: Test_SetGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetGroup', Get group information */ +async function Test_GetGroup(): Promise +{ + console.log("Begin: Test_GetGroup"); + let in_rpc_set_group: VPN.VpnRpcSetGroup = new VPN.VpnRpcSetGroup( + { + HubName_str: hub_name, + Name_str: "group1", + }); + let out_rpc_set_group: VPN.VpnRpcSetGroup = await api.GetGroup(in_rpc_set_group); + console.log(out_rpc_set_group); + console.log("End: Test_GetGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteGroup', Delete a group */ +async function Test_DeleteGroup(): Promise +{ + console.log("Begin: Test_DeleteGroup"); + let in_rpc_delete_user: VPN.VpnRpcDeleteUser = new VPN.VpnRpcDeleteUser( + { + HubName_str: hub_name, + Name_str: "group1", + }); + let out_rpc_delete_user: VPN.VpnRpcDeleteUser = await api.DeleteGroup(in_rpc_delete_user); + console.log(out_rpc_delete_user); + console.log("End: Test_DeleteGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumGroup', Enumerate groups */ +async function Test_EnumGroup(): Promise +{ + console.log("Begin: Test_EnumGroup"); + let in_rpc_enum_group: VPN.VpnRpcEnumGroup = new VPN.VpnRpcEnumGroup( + { + HubName_str: hub_name, + }); + let out_rpc_enum_group: VPN.VpnRpcEnumGroup = await api.EnumGroup(in_rpc_enum_group); + console.log(out_rpc_enum_group); + console.log("End: Test_EnumGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumSession', Enumerate sessions */ +async function Test_EnumSession(): Promise +{ + console.log("Begin: Test_EnumSession"); + let in_rpc_enum_session: VPN.VpnRpcEnumSession = new VPN.VpnRpcEnumSession( + { + HubName_str: hub_name, + }); + let out_rpc_enum_session: VPN.VpnRpcEnumSession = await api.EnumSession(in_rpc_enum_session); + console.log(out_rpc_enum_session); + console.log("End: Test_EnumSession"); + console.log("-----"); + console.log(); + return out_rpc_enum_session; +} + +/** API test for 'GetSessionStatus', Get session status */ +async function Test_GetSessionStatus(session_name: string): Promise +{ + console.log("Begin: Test_GetSessionStatus"); + let in_rpc_session_status: VPN.VpnRpcSessionStatus = new VPN.VpnRpcSessionStatus( + { + HubName_str: hub_name, + Name_str: session_name, + }); + let out_rpc_session_status: VPN.VpnRpcSessionStatus = await api.GetSessionStatus(in_rpc_session_status); + console.log(out_rpc_session_status); + console.log("End: Test_GetSessionStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteSession', Delete a session */ +async function Test_DeleteSession(session_id: string): Promise +{ + console.log("Begin: Test_DeleteSession"); + let in_rpc_delete_session: VPN.VpnRpcDeleteSession = new VPN.VpnRpcDeleteSession( + { + HubName_str: hub_name, + Name_str: session_id, + }); + let out_rpc_delete_session: VPN.VpnRpcDeleteSession = await api.DeleteSession(in_rpc_delete_session); + console.log(out_rpc_delete_session); + console.log("End: Test_DeleteSession"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumMacTable', Get MAC address table */ +async function Test_EnumMacTable(): Promise +{ + console.log("Begin: Test_EnumMacTable"); + let in_rpc_enum_mac_table: VPN.VpnRpcEnumMacTable = new VPN.VpnRpcEnumMacTable( + { + HubName_str: hub_name, + }); + let out_rpc_enum_mac_table: VPN.VpnRpcEnumMacTable = await api.EnumMacTable(in_rpc_enum_mac_table); + console.log(out_rpc_enum_mac_table); + console.log("End: Test_EnumMacTable"); + console.log("-----"); + console.log(); + return out_rpc_enum_mac_table; +} + +/** API test for 'DeleteMacTable', Delete MAC address table entry */ +async function Test_DeleteMacTable(key32: number): Promise +{ + console.log("Begin: Test_DeleteMacTable"); + let in_rpc_delete_table: VPN.VpnRpcDeleteTable = new VPN.VpnRpcDeleteTable( + { + HubName_str: hub_name, + Key_u32: key32, + }); + let out_rpc_delete_table: VPN.VpnRpcDeleteTable = await api.DeleteMacTable(in_rpc_delete_table); + console.log("End: Test_DeleteMacTable"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumIpTable', Get IP address table */ +async function Test_EnumIpTable(): Promise +{ + console.log("Begin: Test_EnumIpTable"); + let in_rpc_enum_ip_table: VPN.VpnRpcEnumIpTable = new VPN.VpnRpcEnumIpTable( + { + HubName_str: hub_name, + }); + let out_rpc_enum_ip_table: VPN.VpnRpcEnumIpTable = await api.EnumIpTable(in_rpc_enum_ip_table); + console.log(out_rpc_enum_ip_table); + console.log("End: Test_EnumIpTable"); + console.log("-----"); + console.log(); + return out_rpc_enum_ip_table; +} + +/** API test for 'DeleteIpTable', Delete IP address table entry */ +async function Test_DeleteIpTable(key32: number): Promise +{ + console.log("Begin: Test_DeleteIpTable"); + let in_rpc_delete_table: VPN.VpnRpcDeleteTable = new VPN.VpnRpcDeleteTable( + { + HubName_str: hub_name, + Key_u32: key32, + }); + let out_rpc_delete_table: VPN.VpnRpcDeleteTable = await api.DeleteIpTable(in_rpc_delete_table); + console.log(out_rpc_delete_table); + console.log("End: Test_DeleteIpTable"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetKeep', Set keep-alive function setting */ +async function Test_SetKeep(): Promise +{ + console.log("Begin: Test_SetKeep"); + let in_rpc_keep: VPN.VpnRpcKeep = new VPN.VpnRpcKeep( + { + UseKeepConnect_bool: true, + KeepConnectHost_str: "www.softether.org", + KeepConnectPort_u32: 123, + KeepConnectProtocol_u32: VPN.VpnRpcKeepAliveProtocol.UDP, + KeepConnectInterval_u32: 1, + }); + let out_rpc_keep: VPN.VpnRpcKeep = await api.SetKeep(in_rpc_keep); + console.log(out_rpc_keep); + console.log("End: Test_SetKeep"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetKeep', Get keep-alive function setting */ +async function Test_GetKeep(): Promise +{ + console.log("Begin: Test_GetKeep"); + let in_rpc_keep: VPN.VpnRpcKeep = new VPN.VpnRpcKeep( + { + }); + let out_rpc_keep: VPN.VpnRpcKeep = await api.GetKeep(in_rpc_keep); + console.log(out_rpc_keep); + console.log("End: Test_GetKeep"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnableSecureNAT', Enable SecureNAT function of the hub */ +async function Test_EnableSecureNAT(): Promise +{ + console.log("Begin: Test_EnableSecureNAT"); + let in_rpc_hub: VPN.VpnRpcHub = new VPN.VpnRpcHub( + { + HubName_str: hub_name, + }); + let out_rpc_hub: VPN.VpnRpcHub = await api.EnableSecureNAT(in_rpc_hub); + console.log(out_rpc_hub); + console.log("End: Test_EnableSecureNAT"); + console.log("-----"); + console.log(); +} + +/** API test for 'DisableSecureNAT', Disable the SecureNAT function of the hub */ +async function Test_DisableSecureNAT(): Promise +{ + console.log("Begin: Test_DisableSecureNAT"); + let in_rpc_hub: VPN.VpnRpcHub = new VPN.VpnRpcHub( + { + HubName_str: hub_name, + }); + let out_rpc_hub: VPN.VpnRpcHub = await api.DisableSecureNAT(in_rpc_hub); + console.log(out_rpc_hub); + console.log("End: Test_DisableSecureNAT"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetSecureNATOption', Set SecureNAT options */ +async function Test_SetSecureNATOption(): Promise +{ + console.log("Begin: Test_SetSecureNATOption"); + let in_vh_option: VPN.VpnVhOption = new VPN.VpnVhOption( + { + RpcHubName_str: hub_name, + MacAddress_bin: new Uint8Array([ 0x00, 0xAC, 0x00, 0x11, 0x22, 0x33, ]), + Ip_ip: "10.0.0.254", + Mask_ip: "255.255.255.0", + UseNat_bool: true, + Mtu_u32: 1200, + NatTcpTimeout_u32: 100, + NatUdpTimeout_u32: 50, + UseDhcp_bool: true, + DhcpLeaseIPStart_ip: "10.0.0.101", + DhcpLeaseIPEnd_ip: "10.0.0.199", + DhcpSubnetMask_ip: "255.255.255.0", + DhcpExpireTimeSpan_u32: 3600, + DhcpGatewayAddress_ip: "10.0.0.254", + DhcpDnsServerAddress_ip: "10.0.0.254", + DhcpDnsServerAddress2_ip: "8.8.8.8", + DhcpDomainName_str: "lab.coe.ad.jp", + SaveLog_bool: true, + ApplyDhcpPushRoutes_bool: false, + DhcpPushRoutes_str: "", + }); + let out_vh_option: VPN.VpnVhOption = await api.SetSecureNATOption(in_vh_option); + console.log(out_vh_option); + console.log("End: Test_SetSecureNATOption"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetSecureNATOption', Get SecureNAT options */ +async function Test_GetSecureNATOption(): Promise +{ + console.log("Begin: Test_GetSecureNATOption"); + let in_vh_option: VPN.VpnVhOption = new VPN.VpnVhOption( + { + RpcHubName_str: hub_name, + }); + let out_vh_option: VPN.VpnVhOption = await api.GetSecureNATOption(in_vh_option); + console.log(out_vh_option); + console.log("End: Test_GetSecureNATOption"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumNAT', Enumerate NAT entries of the SecureNAT */ +async function Test_EnumNAT(): Promise +{ + console.log("Begin: Test_EnumNAT"); + let in_rpc_enum_nat: VPN.VpnRpcEnumNat = new VPN.VpnRpcEnumNat( + { + HubName_str: hub_name, + }); + let out_rpc_enum_nat: VPN.VpnRpcEnumNat = await api.EnumNAT(in_rpc_enum_nat); + console.log(out_rpc_enum_nat); + console.log("End: Test_EnumNAT"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumDHCP', Enumerate DHCP entries */ +async function Test_EnumDHCP(): Promise +{ + console.log("Begin: Test_EnumDHCP"); + let in_rpc_enum_dhcp: VPN.VpnRpcEnumDhcp = new VPN.VpnRpcEnumDhcp( + { + HubName_str: hub_name, + }); + let out_rpc_enum_dhcp: VPN.VpnRpcEnumDhcp = await api.EnumDHCP(in_rpc_enum_dhcp); + console.log(out_rpc_enum_dhcp); + console.log("End: Test_EnumDHCP"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetSecureNATStatus', Get status of the SecureNAT */ +async function Test_GetSecureNATStatus(): Promise +{ + console.log("Begin: Test_GetSecureNATStatus"); + let in_rpc_nat_status: VPN.VpnRpcNatStatus = new VPN.VpnRpcNatStatus( + { + HubName_str: hub_name, + }); + let out_rpc_nat_status: VPN.VpnRpcNatStatus = await api.GetSecureNATStatus(in_rpc_nat_status); + console.log(out_rpc_nat_status); + console.log("End: Test_GetSecureNATStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumEthernet', Enumerate Ethernet devices */ +async function Test_EnumEthernet(): Promise +{ + console.log("Begin: Test_EnumEthernet"); + let out_rpc_enum_eth: VPN.VpnRpcEnumEth = await api.EnumEthernet(); + console.log(out_rpc_enum_eth); + console.log("End: Test_EnumEthernet"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddLocalBridge', Add a new local bridge */ +async function Test_AddLocalBridge(): Promise +{ + console.log("Begin: Test_AddLocalBridge"); + let in_rpc_localbridge: VPN.VpnRpcLocalBridge = new VPN.VpnRpcLocalBridge( + { + DeviceName_str: "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str: hub_name, + }); + let out_rpc_localbridge: VPN.VpnRpcLocalBridge = await api.AddLocalBridge(in_rpc_localbridge); + console.log(out_rpc_localbridge); + console.log("End: Test_AddLocalBridge"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteLocalBridge', Delete a local bridge */ +async function Test_DeleteLocalBridge(): Promise +{ + console.log("Begin: Test_DeleteLocalBridge"); + let in_rpc_localbridge: VPN.VpnRpcLocalBridge = new VPN.VpnRpcLocalBridge( + { + DeviceName_str: "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str: hub_name, + }); + let out_rpc_localbridge: VPN.VpnRpcLocalBridge = await api.DeleteLocalBridge(in_rpc_localbridge); + console.log(out_rpc_localbridge); + console.log("End: Test_DeleteLocalBridge"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumLocalBridge', Enumerate local bridges */ +async function Test_EnumLocalBridge(): Promise +{ + console.log("Begin: Test_EnumLocalBridge"); + let out_rpc_enum_localbridge: VPN.VpnRpcEnumLocalBridge = await api.EnumLocalBridge(); + console.log(out_rpc_enum_localbridge); + console.log("End: Test_EnumLocalBridge"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetBridgeSupport', Get availability to localbridge function */ +async function Test_GetBridgeSupport(): Promise +{ + console.log("Begin: Test_GetBridgeSupport"); + let out_rpc_bridge_support: VPN.VpnRpcBridgeSupport = await api.GetBridgeSupport(); + console.log(out_rpc_bridge_support); + console.log("End: Test_GetBridgeSupport"); + console.log("-----"); + console.log(); +} + +/** API test for 'RebootServer', Reboot server itself */ +async function Test_RebootServer(): Promise +{ + console.log("Begin: Test_RebootServer"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + }); + let out_rpc_test: VPN.VpnRpcTest = await api.RebootServer(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_RebootServer"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetCaps', Get capabilities */ +async function Test_GetCaps(): Promise +{ + console.log("Begin: Test_GetCaps"); + let out_capslist: VPN.VpnCapslist = await api.GetCaps(); + console.log(out_capslist); + console.log("End: Test_GetCaps"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetConfig', Get configuration file stream */ +async function Test_GetConfig(): Promise +{ + console.log("Begin: Test_GetConfig"); + let out_rpc_config: VPN.VpnRpcConfig = await api.GetConfig(); + console.log(out_rpc_config); + console.log("End: Test_GetConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetConfig', Overwrite configuration file by specified data */ +async function Test_SetConfig(): Promise +{ + console.log("Begin: Test_SetConfig"); + let in_rpc_config: VPN.VpnRpcConfig = new VPN.VpnRpcConfig( + { + FileData_bin: new Uint8Array([ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, ]), + }); + let out_rpc_config: VPN.VpnRpcConfig = await api.SetConfig(in_rpc_config); + console.log("End: Test_SetConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetDefaultHubAdminOptions', Get default hub administration options */ +async function Test_GetDefaultHubAdminOptions(): Promise +{ + console.log("Begin: Test_GetDefaultHubAdminOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.GetDefaultHubAdminOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_GetDefaultHubAdminOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubAdminOptions', Get hub administration options */ +async function Test_GetHubAdminOptions(): Promise +{ + console.log("Begin: Test_GetHubAdminOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.GetHubAdminOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_GetHubAdminOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubAdminOptions', Set hub administration options */ +async function Test_SetHubAdminOptions(): Promise +{ + console.log("Begin: Test_SetHubAdminOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + AdminOptionList: [ new VPN.VpnAdminOption( + { + Name_str: "no_securenat_enablenat", + Value_u32: 1, + }), ], + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.SetHubAdminOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_SetHubAdminOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubExtOptions', Get hub extended options */ +async function Test_GetHubExtOptions(): Promise +{ + console.log("Begin: Test_GetHubExtOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.GetHubExtOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_GetHubExtOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubExtOptions', Set hub extended options */ +async function Test_SetHubExtOptions(): Promise +{ + console.log("Begin: Test_SetHubExtOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + AdminOptionList: [ new VPN.VpnAdminOption( + { + Name_str: "SecureNAT_RandomizeAssignIp", + Value_u32: 1, + }), ], + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.SetHubExtOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_SetHubExtOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddL3Switch', Add a new virtual layer-3 switch */ +async function Test_AddL3Switch(): Promise +{ + console.log("Begin: Test_AddL3Switch"); + let in_rpc_l3sw: VPN.VpnRpcL3Sw = new VPN.VpnRpcL3Sw( + { + Name_str: "L3SW1", + }); + let out_rpc_l3sw: VPN.VpnRpcL3Sw = await api.AddL3Switch(in_rpc_l3sw); + console.log(out_rpc_l3sw); + console.log("End: Test_AddL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'DelL3Switch', Delete a virtual layer-3 switch */ +async function Test_DelL3Switch(): Promise +{ + console.log("Begin: Test_DelL3Switch"); + let in_rpc_l3sw: VPN.VpnRpcL3Sw = new VPN.VpnRpcL3Sw( + { + Name_str: "L3SW1", + }); + let out_rpc_l3sw: VPN.VpnRpcL3Sw = await api.DelL3Switch(in_rpc_l3sw); + console.log(out_rpc_l3sw); + console.log("End: Test_DelL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumL3Switch', Enumerate virtual layer-3 switches */ +async function Test_EnumL3Switch(): Promise +{ + console.log("Begin: Test_EnumL3Switch"); + let out_rpc_enum_l3sw: VPN.VpnRpcEnumL3Sw = await api.EnumL3Switch(); + console.log(out_rpc_enum_l3sw); + console.log("End: Test_EnumL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'StartL3Switch', Start a virtual layer-3 switch */ +async function Test_StartL3Switch(): Promise +{ + console.log("Begin: Test_StartL3Switch"); + let in_rpc_l3sw: VPN.VpnRpcL3Sw = new VPN.VpnRpcL3Sw( + { + Name_str: "L3SW1", + }); + let out_rpc_l3sw: VPN.VpnRpcL3Sw = await api.StartL3Switch(in_rpc_l3sw); + console.log(out_rpc_l3sw); + console.log("End: Test_StartL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'StopL3Switch', Stop a virtual layer-3 switch */ +async function Test_StopL3Switch(): Promise +{ + console.log("Begin: Test_StopL3Switch"); + let in_rpc_l3sw: VPN.VpnRpcL3Sw = new VPN.VpnRpcL3Sw( + { + Name_str: "L3SW1", + }); + let out_rpc_l3sw: VPN.VpnRpcL3Sw = await api.StopL3Switch(in_rpc_l3sw); + console.log(out_rpc_l3sw); + console.log("End: Test_StopL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddL3If', Add new virtual interface on virtual L3 switch */ +async function Test_AddL3If(): Promise +{ + console.log("Begin: Test_AddL3If"); + let in_rpc_l3if: VPN.VpnRpcL3If = new VPN.VpnRpcL3If( + { + Name_str: "L3SW1", + HubName_str: hub_name, + IpAddress_ip: "192.168.0.1", + SubnetMask_ip: "255.255.255.0", + }); + let out_rpc_l3if: VPN.VpnRpcL3If = await api.AddL3If(in_rpc_l3if); + console.log(out_rpc_l3if); + console.log("End: Test_AddL3If"); + console.log("-----"); + console.log(); +} + +/** API test for 'DelL3If', Delete a virtual interface on virtual L3 switch */ +async function Test_DelL3If(): Promise +{ + console.log("Begin: Test_DelL3If"); + let in_rpc_l3if: VPN.VpnRpcL3If = new VPN.VpnRpcL3If( + { + Name_str: "L3SW1", + HubName_str: hub_name, + }); + let out_rpc_l3if: VPN.VpnRpcL3If = await api.DelL3If(in_rpc_l3if); + console.log(out_rpc_l3if); + console.log("End: Test_DelL3If"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumL3If', Enumerate virtual interfaces on virtual L3 switch */ +async function Test_EnumL3If(): Promise +{ + console.log("Begin: Test_EnumL3If"); + let in_rpc_enum_l3if: VPN.VpnRpcEnumL3If = new VPN.VpnRpcEnumL3If( + { + Name_str: "L3SW1", + }); + let out_rpc_enum_l3if: VPN.VpnRpcEnumL3If = await api.EnumL3If(in_rpc_enum_l3if); + console.log(out_rpc_enum_l3if); + console.log("End: Test_EnumL3If"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddL3Table', Add new routing table entry on virtual L3 switch */ +async function Test_AddL3Table(): Promise +{ + console.log("Begin: Test_AddL3Table"); + let in_rpc_l3table: VPN.VpnRpcL3Table = new VPN.VpnRpcL3Table( + { + Name_str: "L3SW1", + NetworkAddress_ip: "10.0.0.0", + SubnetMask_ip: "255.0.0.0", + GatewayAddress_ip: "192.168.7.1", + Metric_u32: 10, + }); + let out_rpc_l3table: VPN.VpnRpcL3Table = await api.AddL3Table(in_rpc_l3table); + console.log(out_rpc_l3table); + console.log("End: Test_AddL3Table"); + console.log("-----"); + console.log(); +} + +/** API test for 'DelL3Table', Delete routing table entry on virtual L3 switch */ +async function Test_DelL3Table(): Promise +{ + console.log("Begin: Test_DelL3Table"); + let in_rpc_l3table: VPN.VpnRpcL3Table = new VPN.VpnRpcL3Table( + { + Name_str: "L3SW1", + NetworkAddress_ip: "10.0.0.0", + SubnetMask_ip: "255.0.0.0", + GatewayAddress_ip: "192.168.7.1", + Metric_u32: 10, + }); + let out_rpc_l3table: VPN.VpnRpcL3Table = await api.DelL3Table(in_rpc_l3table); + console.log(out_rpc_l3table); + console.log("End: Test_DelL3Table"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumL3Table', Get routing table on virtual L3 switch */ +async function Test_EnumL3Table(): Promise +{ + console.log("Begin: Test_EnumL3Table"); + let in_rpc_enum_l3table: VPN.VpnRpcEnumL3Table = new VPN.VpnRpcEnumL3Table( + { + Name_str: "L3SW1", + }); + let out_rpc_enum_l3table: VPN.VpnRpcEnumL3Table = await api.EnumL3Table(in_rpc_enum_l3table); + console.log(out_rpc_enum_l3table); + console.log("End: Test_EnumL3Table"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumCrl', Get CRL (Certificate Revocation List) index */ +async function Test_EnumCrl(): Promise +{ + console.log("Begin: Test_EnumCrl"); + let in_rpc_enum_crl: VPN.VpnRpcEnumCrl = new VPN.VpnRpcEnumCrl( + { + HubName_str: hub_name, + }); + let out_rpc_enum_crl: VPN.VpnRpcEnumCrl = await api.EnumCrl(in_rpc_enum_crl); + console.log(out_rpc_enum_crl); + console.log("End: Test_EnumCrl"); + console.log("-----"); + console.log(); + return out_rpc_enum_crl; +} + +/** API test for 'AddCrl', Add new CRL (Certificate Revocation List) entry */ +async function Test_AddCrl(): Promise +{ + console.log("Begin: Test_AddCrl"); + let in_rpc_crl: VPN.VpnRpcCrl = new VPN.VpnRpcCrl( + { + HubName_str: hub_name, + CommonName_utf: "CN", + Organization_utf: "Org", + Unit_utf: "ICSCOE", + Country_utf: "JP", + State_utf: "Ibaraki", + Local_utf: "Tsukuba", + Serial_bin: new Uint8Array([ 1, 2, 3, 4, 5, ]), + DigestMD5_bin: new Uint8Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ]), + DigestSHA1_bin: new Uint8Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ]), + }); + let out_rpc_crl: VPN.VpnRpcCrl = await api.AddCrl(in_rpc_crl); + console.log(out_rpc_crl); + console.log("End: Test_AddCrl"); + console.log("-----"); + console.log(); +} + +/** API test for 'DelCrl', Delete CRL (Certificate Revocation List) entry */ +async function Test_DelCrl(key: number): Promise +{ + console.log("Begin: Test_DelCrl"); + let in_rpc_crl: VPN.VpnRpcCrl = new VPN.VpnRpcCrl( + { + HubName_str: hub_name, + Key_u32: key, + }); + let out_rpc_crl: VPN.VpnRpcCrl = await api.DelCrl(in_rpc_crl); + console.log(out_rpc_crl); + console.log("End: Test_DelCrl"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetCrl', Get CRL (Certificate Revocation List) entry */ +async function Test_GetCrl(key: number): Promise +{ + console.log("Begin: Test_GetCrl"); + let in_rpc_crl: VPN.VpnRpcCrl = new VPN.VpnRpcCrl( + { + HubName_str: hub_name, + Key_u32: key, + }); + let out_rpc_crl: VPN.VpnRpcCrl = await api.GetCrl(in_rpc_crl); + console.log(out_rpc_crl); + console.log("End: Test_GetCrl"); + console.log("-----"); + console.log(); + return out_rpc_crl; +} + +/** API test for 'SetCrl', Set CRL (Certificate Revocation List) entry */ +async function Test_SetCrl(crl: VPN.VpnRpcCrl): Promise +{ + console.log("Begin: Test_SetCrl"); + let out_rpc_crl: VPN.VpnRpcCrl = await api.SetCrl(crl); + console.log(out_rpc_crl); + console.log("End: Test_SetCrl"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetAcList', Set access control list */ +async function Test_SetAcList(): Promise +{ + console.log("Begin: Test_SetAcList"); + let in_rpc_ac_list: VPN.VpnRpcAcList = new VPN.VpnRpcAcList( + { + HubName_str: hub_name, + ACList: [ new VPN.VpnAc( + { + Deny_bool: true, + IpAddress_ip: "192.168.0.0", + SubnetMask_ip: "255.255.0.0", + Masked_bool: true, + Priority_u32: 123, + }), new VPN.VpnAc( + { + Deny_bool: false, + IpAddress_ip: "fe80::", + SubnetMask_ip: "8", + Masked_bool: true, + Priority_u32: 123, + }), ], + }); + let out_rpc_ac_list: VPN.VpnRpcAcList = await api.SetAcList(in_rpc_ac_list); + console.log(out_rpc_ac_list); + console.log("End: Test_SetAcList"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetAcList', Get access control list */ +async function Test_GetAcList(): Promise +{ + console.log("Begin: Test_GetAcList"); + let in_rpc_ac_list: VPN.VpnRpcAcList = new VPN.VpnRpcAcList( + { + HubName_str: hub_name, + }); + let out_rpc_ac_list: VPN.VpnRpcAcList = await api.GetAcList(in_rpc_ac_list); + console.log(out_rpc_ac_list); + console.log("End: Test_GetAcList"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumLogFile', Enumerate log files */ +async function Test_EnumLogFile(): Promise +{ + console.log("Begin: Test_EnumLogFile"); + let out_rpc_enum_log_file: VPN.VpnRpcEnumLogFile = await api.EnumLogFile(); + console.log(out_rpc_enum_log_file); + console.log("End: Test_EnumLogFile"); + console.log("-----"); + console.log(); + return out_rpc_enum_log_file; +} + +/** API test for 'ReadLogFile', Read a log file */ +async function Test_ReadLogFile(filename: string): Promise +{ + console.log("Begin: Test_ReadLogFile"); + let in_rpc_read_log_file: VPN.VpnRpcReadLogFile = new VPN.VpnRpcReadLogFile( + { + FilePath_str: filename, + }); + let out_rpc_read_log_file: VPN.VpnRpcReadLogFile = await api.ReadLogFile(in_rpc_read_log_file); + console.log(out_rpc_read_log_file); + console.log("End: Test_ReadLogFile"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetSysLog', Set syslog function setting */ +async function Test_SetSysLog(flag: boolean): Promise +{ + console.log("Begin: Test_SetSysLog"); + let in_syslog_setting: VPN.VpnSyslogSetting = new VPN.VpnSyslogSetting( + { + SaveType_u32: flag ? VPN.VpnSyslogSaveType.ServerAndHubAllLog : VPN.VpnSyslogSaveType.None, + Hostname_str: "1.2.3.4", + Port_u32: 123, + }); + let out_syslog_setting: VPN.VpnSyslogSetting = await api.SetSysLog(in_syslog_setting); + console.log(out_syslog_setting); + console.log("End: Test_SetSysLog"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetSysLog', Get syslog function setting */ +async function Test_GetSysLog(): Promise +{ + console.log("Begin: Test_GetSysLog"); + let in_syslog_setting: VPN.VpnSyslogSetting = new VPN.VpnSyslogSetting( + { + }); + let out_syslog_setting: VPN.VpnSyslogSetting = await api.GetSysLog(in_syslog_setting); + console.log(out_syslog_setting); + console.log("End: Test_GetSysLog"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubMsg', Set message of today on hub */ +async function Test_SetHubMsg(): Promise +{ + console.log("Begin: Test_SetHubMsg"); + let in_rpc_msg: VPN.VpnRpcMsg = new VPN.VpnRpcMsg( + { + HubName_str: hub_name, + Msg_bin: new Uint8Array([ 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x21, 0x20, 0xe4, 0xb8, 0x87, 0xe5, 0x9b, 0xbd, 0xe3, 0x81, 0xae, 0xe5, 0x8a, 0xb4, 0xe5, 0x83, 0x8d, 0xe8, 0x80, 0x85, 0xe3, 0x82, 0x88, 0xe3, 0x80, 0x81, 0xe5, 0x9b, 0xa3, 0xe7, 0xb5, 0x90, 0xe3, 0x81, 0x9b, 0xe3, 0x82, 0x88, 0x21, 0x20, 0xd7, 0x92, 0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x99, 0xd7, 0x9d, 0x20, 0xd7, 0xa2, 0xd7, 0x95, 0xd7, 0x91, 0xd7, 0x93, 0xd7, 0x99, 0xd7, 0x9d, 0x20, 0xd7, 0xa9, 0xd7, 0x9c, 0x20, 0xd7, 0x9b, 0xd7, 0x9c, 0x20, 0xd7, 0x94, 0xd7, 0x9e, 0xd7, 0x93, 0xd7, 0x99, 0xd7, 0xa0, 0xd7, 0x95, 0xd7, 0xaa, 0x2c, 0x20, 0xd7, 0x94, 0xd7, 0xaa, 0xd7, 0x90, 0xd7, 0x97, 0xd7, 0x93, 0xd7, 0x95, 0x21, ]), + }); + let out_rpc_msg: VPN.VpnRpcMsg = await api.SetHubMsg(in_rpc_msg); + console.log(out_rpc_msg); + console.log("End: Test_SetHubMsg"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubMsg', Get message of today on hub */ +async function Test_GetHubMsg(): Promise +{ + console.log("Begin: Test_GetHubMsg"); + let in_rpc_msg: VPN.VpnRpcMsg = new VPN.VpnRpcMsg( + { + HubName_str: hub_name, + }); + let out_rpc_msg: VPN.VpnRpcMsg = await api.GetHubMsg(in_rpc_msg); + console.log(out_rpc_msg); + console.log("End: Test_GetHubMsg"); + console.log("-----"); + console.log(); +} + +/** API test for 'Crash', Do Crash */ +async function Test_Crash(): Promise +{ + console.log("Begin: Test_Crash"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + }); + let out_rpc_test: VPN.VpnRpcTest = await api.Crash(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_Crash"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetAdminMsg', Get message for administrators */ +async function Test_GetAdminMsg(): Promise +{ + console.log("Begin: Test_GetAdminMsg"); + let out_rpc_msg: VPN.VpnRpcMsg = await api.GetAdminMsg(); + console.log(out_rpc_msg); + console.log("End: Test_GetAdminMsg"); + console.log("-----"); + console.log(); +} + +/** API test for 'Flush', Flush configuration file */ +async function Test_Flush(): Promise +{ + console.log("Begin: Test_Flush"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + }); + let out_rpc_test: VPN.VpnRpcTest = await api.Flush(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_Flush"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetIPsecServices', Set IPsec service configuration */ +async function Test_SetIPsecServices(): Promise +{ + console.log("Begin: Test_SetIPsecServices"); + let in_ipsec_services: VPN.VpnIPsecServices = new VPN.VpnIPsecServices( + { + L2TP_Raw_bool: false, + L2TP_IPsec_bool: false, + EtherIP_IPsec_bool: false, + IPsec_Secret_str: "vpn", + L2TP_DefaultHub_str: "HUB_ABC", + }); + let out_ipsec_services: VPN.VpnIPsecServices = await api.SetIPsecServices(in_ipsec_services); + console.log(out_ipsec_services); + console.log("End: Test_SetIPsecServices"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetIPsecServices', Get IPsec service configuration */ +async function Test_GetIPsecServices(): Promise +{ + console.log("Begin: Test_GetIPsecServices"); + let out_ipsec_services: VPN.VpnIPsecServices = await api.GetIPsecServices(); + console.log(out_ipsec_services); + console.log("End: Test_GetIPsecServices"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddEtherIpId', Add EtherIP ID setting */ +async function Test_AddEtherIpId(): Promise +{ + console.log("Begin: Test_AddEtherIpId"); + let in_etherip_id: VPN.VpnEtherIpId = new VPN.VpnEtherIpId( + { + Id_str: "testid", + HubName_str: hub_name, + UserName_str: "nekosan", + Password_str: "torisan", + }); + let out_etherip_id: VPN.VpnEtherIpId = await api.AddEtherIpId(in_etherip_id); + console.log(out_etherip_id); + console.log("End: Test_AddEtherIpId"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetEtherIpId', Get EtherIP ID setting */ +async function Test_GetEtherIpId(id: string): Promise +{ + console.log("Begin: Test_GetEtherIpId"); + let in_etherip_id: VPN.VpnEtherIpId = new VPN.VpnEtherIpId( + { + Id_str: id, + }); + let out_etherip_id: VPN.VpnEtherIpId = await api.GetEtherIpId(in_etherip_id); + console.log(out_etherip_id); + console.log("End: Test_GetEtherIpId"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteEtherIpId', Delete EtherIP ID setting */ +async function Test_DeleteEtherIpId(id: string): Promise +{ + console.log("Begin: Test_DeleteEtherIpId"); + let in_etherip_id: VPN.VpnEtherIpId = new VPN.VpnEtherIpId( + { + Id_str: id, + }); + let out_etherip_id: VPN.VpnEtherIpId = await api.DeleteEtherIpId(in_etherip_id); + console.log(out_etherip_id); + console.log("End: Test_DeleteEtherIpId"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumEtherIpId', Enumerate EtherIP ID settings */ +async function Test_EnumEtherIpId(): Promise +{ + console.log("Begin: Test_EnumEtherIpId"); + let out_rpc_enum_etherip_id: VPN.VpnRpcEnumEtherIpId = await api.EnumEtherIpId(); + console.log(out_rpc_enum_etherip_id); + console.log("End: Test_EnumEtherIpId"); + console.log("-----"); + console.log(); + return out_rpc_enum_etherip_id; +} + +/** API test for 'SetOpenVpnSstpConfig', Set configurations for OpenVPN and SSTP */ +async function Test_SetOpenVpnSstpConfig(): Promise +{ + console.log("Begin: Test_SetOpenVpnSstpConfig"); + let in_openvpn_sstp_config: VPN.VpnOpenVpnSstpConfig = new VPN.VpnOpenVpnSstpConfig( + { + EnableOpenVPN_bool: true, + OpenVPNPortList_str: "1 2 3 4 5", + EnableSSTP_bool: true, + }); + let out_openvpn_sstp_config: VPN.VpnOpenVpnSstpConfig = await api.SetOpenVpnSstpConfig(in_openvpn_sstp_config); + console.log(out_openvpn_sstp_config); + console.log("End: Test_SetOpenVpnSstpConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetOpenVpnSstpConfig', Get configurations for OpenVPN and SSTP */ +async function Test_GetOpenVpnSstpConfig(): Promise +{ + console.log("Begin: Test_GetOpenVpnSstpConfig"); + let out_openvpn_sstp_config: VPN.VpnOpenVpnSstpConfig = await api.GetOpenVpnSstpConfig(); + console.log(out_openvpn_sstp_config); + console.log("End: Test_GetOpenVpnSstpConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetDDnsClientStatus', Get status of DDNS client */ +async function Test_GetDDnsClientStatus(): Promise +{ + console.log("Begin: Test_GetDDnsClientStatus"); + let out_ddns_client_status: VPN.VpnDDnsClientStatus = await api.GetDDnsClientStatus(); + console.log(out_ddns_client_status); + console.log("End: Test_GetDDnsClientStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'ChangeDDnsClientHostname', Change host-name for DDNS client */ +async function Test_ChangeDDnsClientHostname(): Promise +{ + console.log("Begin: Test_ChangeDDnsClientHostname"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + StrValue_str: "nekotest" + Math.floor((Math.random() * (2100000000 - 1000000000)) + 1000000000), + }); + let out_rpc_test: VPN.VpnRpcTest = await api.ChangeDDnsClientHostname(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_ChangeDDnsClientHostname"); + console.log("-----"); + console.log(); +} + +/** API test for 'RegenerateServerCert', Regenerate server certification */ +async function Test_RegenerateServerCert(): Promise +{ + console.log("Begin: Test_RegenerateServerCert"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + StrValue_str: "abc.example.org", + }); + let out_rpc_test: VPN.VpnRpcTest = await api.RegenerateServerCert(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_RegenerateServerCert"); + console.log("-----"); + console.log(); +} + +/** API test for 'MakeOpenVpnConfigFile', Generate OpenVPN configuration files */ +async function Test_MakeOpenVpnConfigFile(): Promise +{ + console.log("Begin: Test_MakeOpenVpnConfigFile"); + let out_rpc_read_log_file: VPN.VpnRpcReadLogFile = await api.MakeOpenVpnConfigFile(); + console.log(out_rpc_read_log_file); + console.log("End: Test_MakeOpenVpnConfigFile"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetSpecialListener', Set special listener status */ +async function Test_SetSpecialListener(): Promise +{ + console.log("Begin: Test_SetSpecialListener"); + let in_rpc_special_listener: VPN.VpnRpcSpecialListener = new VPN.VpnRpcSpecialListener( + { + VpnOverDnsListener_bool: true, + VpnOverIcmpListener_bool: true, + }); + let out_rpc_special_listener: VPN.VpnRpcSpecialListener = await api.SetSpecialListener(in_rpc_special_listener); + console.log(out_rpc_special_listener); + console.log("End: Test_SetSpecialListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetSpecialListener', Get special listener status */ +async function Test_GetSpecialListener(): Promise +{ + console.log("Begin: Test_GetSpecialListener"); + let out_rpc_special_listener: VPN.VpnRpcSpecialListener = await api.GetSpecialListener(); + console.log(out_rpc_special_listener); + console.log("End: Test_GetSpecialListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetAzureStatus', Get Azure status */ +async function Test_GetAzureStatus(): Promise +{ + console.log("Begin: Test_GetAzureStatus"); + let out_rpc_azure_status: VPN.VpnRpcAzureStatus = await api.GetAzureStatus(); + console.log(out_rpc_azure_status); + console.log("End: Test_GetAzureStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetAzureStatus', Set Azure status */ +async function Test_SetAzureStatus(): Promise +{ + console.log("Begin: Test_SetAzureStatus"); + let in_rpc_azure_status: VPN.VpnRpcAzureStatus = new VPN.VpnRpcAzureStatus( + { + IsEnabled_bool: true, + }); + let out_rpc_azure_status: VPN.VpnRpcAzureStatus = await api.SetAzureStatus(in_rpc_azure_status); + console.log(out_rpc_azure_status); + console.log("End: Test_SetAzureStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetDDnsInternetSettng', Get DDNS proxy configuration */ +async function Test_GetDDnsInternetSettng(): Promise +{ + console.log("Begin: Test_GetDDnsInternetSettng"); + let out_internet_setting: VPN.VpnInternetSetting = await api.GetDDnsInternetSettng(); + console.log(out_internet_setting); + console.log("End: Test_GetDDnsInternetSettng"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetDDnsInternetSettng', Set DDNS proxy configuration */ +async function Test_SetDDnsInternetSettng(): Promise +{ + console.log("Begin: Test_SetDDnsInternetSettng"); + let in_internet_setting: VPN.VpnInternetSetting = new VPN.VpnInternetSetting( + { + ProxyType_u32: VPN.VpnRpcProxyType.Direct, + ProxyHostName_str: "1.2.3.4", + ProxyPort_u32: 1234, + ProxyUsername_str: "neko", + ProxyPassword_str: "dog", + }); + let out_internet_setting: VPN.VpnInternetSetting = await api.SetDDnsInternetSettng(in_internet_setting); + console.log(out_internet_setting); + console.log("End: Test_SetDDnsInternetSettng"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetVgsConfig', Setting VPN Gate Server Configuration */ +async function Test_SetVgsConfig(): Promise +{ + console.log("Begin: Test_SetVgsConfig"); + let in_vgs_config: VPN.VpnVgsConfig = new VPN.VpnVgsConfig( + { + IsEnabled_bool: false, + Message_utf: "Neko san!!!", + Owner_utf: "Go go go!!!", + Abuse_utf: "da.test@softether.co.jp", + NoLog_bool: false, + LogPermanent_bool: true, + EnableL2TP_bool: true, + }); + let out_vgs_config: VPN.VpnVgsConfig = await api.SetVgsConfig(in_vgs_config); + console.log(out_vgs_config); + console.log("End: Test_SetVgsConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetVgsConfig', Get VPN Gate configuration */ +async function Test_GetVgsConfig(): Promise +{ + console.log("Begin: Test_GetVgsConfig"); + let out_vgs_config: VPN.VpnVgsConfig = await api.GetVgsConfig(); + console.log(out_vgs_config); + console.log("End: Test_GetVgsConfig"); + console.log("-----"); + console.log(); +} + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/src/vpnrpc.ts softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/src/vpnrpc.ts --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/src/vpnrpc.ts 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/src/vpnrpc.ts 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,5167 @@ +// SoftEther VPN Server JSON-RPC Stub code for TypeScript +// +// vpnrpc.ts +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + + +// Trivial utility codes +let is_node_js = (typeof navigator === "undefined") || navigator.userAgent.indexOf("Node.js") !== -1 || navigator.userAgent.indexOf("jsdom") !== -1; +function is_null(obj: any) +{ + return (typeof obj === "undefined") || (obj === null); +} +let debug_mode: boolean = false; + +/** VPN Server RPC Stubs */ +export class VpnServerRpc +{ + /** Determine if this JavaScript environment is on the Node.js or not. */ + public static IsNodeJS(): boolean + { + return is_node_js; + } + + /** Set the debug mode flag */ + public static SetDebugMode(flag: boolean): void + { + debug_mode = flag; + } + + private rpc_url: string; + private rpc_client: JsonRpcClient; + + /** + * Constructor of the VpnServerRpc class + * @param vpnserver_hostname The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param vpnserver_port The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param hubname The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. + * @param password Specify the administration password. This value is valid only if vpnserver_hostname is sepcified. + * @param nodejs_https_client_reject_untrusted_server_cert In Node.js set this true to check the SSL server certificate on the destination VPN Server. Set this false to ignore the SSL server certification. + */ + constructor(vpnserver_hostname?: string, vpnserver_port?: number, hubname?: string, password?: string, nodejs_https_client_reject_untrusted_server_cert?: boolean) + { + let headers: { [name: string]: string } = {}; + let send_credentials: boolean = false; + + nodejs_https_client_reject_untrusted_server_cert = is_null(nodejs_https_client_reject_untrusted_server_cert) ? false : nodejs_https_client_reject_untrusted_server_cert!; + + if (is_null(vpnserver_hostname)) + { + this.rpc_url = "/api/"; + send_credentials = true; + } + else + { + if (is_null(vpnserver_port)) vpnserver_port = 443; + this.rpc_url = `https://${vpnserver_hostname}:${vpnserver_port}/api/`; + + + headers["X-VPNADMIN-HUBNAME"] = is_null(hubname) ? "" : hubname!; + headers["X-VPNADMIN-PASSWORD"] = is_null(password) ? "" : password!; + } + + if (is_null(nodejs_https_client_reject_untrusted_server_cert)) nodejs_https_client_reject_untrusted_server_cert = false; + + this.rpc_client = new JsonRpcClient(this.rpc_url, headers, send_credentials, nodejs_https_client_reject_untrusted_server_cert); + } + + // --- Stubs --- + /** Test RPC function. Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. */ + public Test = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("Test", in_param); + } + + /** Get server information. This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. */ + public GetServerInfo = (): Promise => + { + return this.CallAsync("GetServerInfo", new VpnRpcServerInfo()); + } + + /** Get Current Server Status. This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. */ + public GetServerStatus = (): Promise => + { + return this.CallAsync("GetServerStatus", new VpnRpcServerStatus()); + } + + /** Create New TCP Listener. This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. */ + public CreateListener = (in_param: VpnRpcListener): Promise => + { + return this.CallAsync("CreateListener", in_param); + } + + /** Get List of TCP Listeners. This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. */ + public EnumListener = (): Promise => + { + return this.CallAsync("EnumListener", new VpnRpcListenerList()); + } + + /** Delete TCP Listener. This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. */ + public DeleteListener = (in_param: VpnRpcListener): Promise => + { + return this.CallAsync("DeleteListener", in_param); + } + + /** Enable / Disable TCP Listener. This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. */ + public EnableListener = (in_param: VpnRpcListener): Promise => + { + return this.CallAsync("EnableListener", in_param); + } + + /** Set VPN Server Administrator Password. This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. */ + public SetServerPassword = (in_param: VpnRpcSetPassword): Promise => + { + return this.CallAsync("SetServerPassword", in_param); + } + + /** Set the VPN Server clustering configuration. Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. */ + public SetFarmSetting = (in_param: VpnRpcFarm): Promise => + { + return this.CallAsync("SetFarmSetting", in_param); + } + + /** Get Clustering Configuration of Current VPN Server. You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. */ + public GetFarmSetting = (): Promise => + { + return this.CallAsync("GetFarmSetting", new VpnRpcFarm()); + } + + /** Get Cluster Member Information. When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. */ + public GetFarmInfo = (in_param: VpnRpcFarmInfo): Promise => + { + return this.CallAsync("GetFarmInfo", in_param); + } + + /** Get List of Cluster Members. Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. */ + public EnumFarmMember = (): Promise => + { + return this.CallAsync("EnumFarmMember", new VpnRpcEnumFarm()); + } + + /** Get Connection Status to Cluster Controller. Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. */ + public GetFarmConnectionStatus = (): Promise => + { + return this.CallAsync("GetFarmConnectionStatus", new VpnRpcFarmConnectionStatus()); + } + + /** Set SSL Certificate and Private Key of VPN Server. You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. */ + public SetServerCert = (in_param: VpnRpcKeyPair): Promise => + { + return this.CallAsync("SetServerCert", in_param); + } + + /** Get SSL Certificate and Private Key of VPN Server. Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. */ + public GetServerCert = (): Promise => + { + return this.CallAsync("GetServerCert", new VpnRpcKeyPair()); + } + + /** Get the Encrypted Algorithm Used for VPN Communication. Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. */ + public GetServerCipher = (): Promise => + { + return this.CallAsync("GetServerCipher", new VpnRpcStr()); + } + + /** Set the Encrypted Algorithm Used for VPN Communication. Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. */ + public SetServerCipher = (in_param: VpnRpcStr): Promise => + { + return this.CallAsync("SetServerCipher", in_param); + } + + /** Create New Virtual Hub. Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. */ + public CreateHub = (in_param: VpnRpcCreateHub): Promise => + { + return this.CallAsync("CreateHub", in_param); + } + + /** Set the Virtual Hub configuration. You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. */ + public SetHub = (in_param: VpnRpcCreateHub): Promise => + { + return this.CallAsync("SetHub", in_param); + } + + /** Get the Virtual Hub configuration. You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. */ + public GetHub = (in_param: VpnRpcCreateHub): Promise => + { + return this.CallAsync("GetHub", in_param); + } + + /** Get List of Virtual Hubs. Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. */ + public EnumHub = (): Promise => + { + return this.CallAsync("EnumHub", new VpnRpcEnumHub()); + } + + /** Delete Virtual Hub. Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. */ + public DeleteHub = (in_param: VpnRpcDeleteHub): Promise => + { + return this.CallAsync("DeleteHub", in_param); + } + + /** Get Setting of RADIUS Server Used for User Authentication. Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetHubRadius = (in_param: VpnRpcRadius): Promise => + { + return this.CallAsync("GetHubRadius", in_param); + } + + /** Set RADIUS Server to use for User Authentication. To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetHubRadius = (in_param: VpnRpcRadius): Promise => + { + return this.CallAsync("SetHubRadius", in_param); + } + + /** Get List of TCP Connections Connecting to the VPN Server. Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. */ + public EnumConnection = (): Promise => + { + return this.CallAsync("EnumConnection", new VpnRpcEnumConnection()); + } + + /** Disconnect TCP Connections Connecting to the VPN Server. Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. */ + public DisconnectConnection = (in_param: VpnRpcDisconnectConnection): Promise => + { + return this.CallAsync("DisconnectConnection", in_param); + } + + /** Get Information of TCP Connections Connecting to the VPN Server. Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. */ + public GetConnectionInfo = (in_param: VpnRpcConnectionInfo): Promise => + { + return this.CallAsync("GetConnectionInfo", in_param); + } + + /** Switch Virtual Hub to Online or Offline. Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetHubOnline = (in_param: VpnRpcSetHubOnline): Promise => + { + return this.CallAsync("SetHubOnline", in_param); + } + + /** Get Current Status of Virtual Hub. Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. */ + public GetHubStatus = (in_param: VpnRpcHubStatus): Promise => + { + return this.CallAsync("GetHubStatus", in_param); + } + + /** Set the logging configuration of the Virtual Hub. Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. */ + public SetHubLog = (in_param: VpnRpcHubLog): Promise => + { + return this.CallAsync("SetHubLog", in_param); + } + + /** Get the logging configuration of the Virtual Hub. Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. */ + public GetHubLog = (in_param: VpnRpcHubLog): Promise => + { + return this.CallAsync("GetHubLog", in_param); + } + + /** Add Trusted CA Certificate. Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public AddCa = (in_param: VpnRpcHubAddCA): Promise => + { + return this.CallAsync("AddCa", in_param); + } + + /** Get List of Trusted CA Certificates. Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public EnumCa = (in_param: VpnRpcHubEnumCA): Promise => + { + return this.CallAsync("EnumCa", in_param); + } + + /** Get Trusted CA Certificate. Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public GetCa = (in_param: VpnRpcHubGetCA): Promise => + { + return this.CallAsync("GetCa", in_param); + } + + /** Delete Trusted CA Certificate. Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public DeleteCa = (in_param: VpnRpcHubDeleteCA): Promise => + { + return this.CallAsync("DeleteCa", in_param); + } + + /** Create New Cascade Connection. Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public CreateLink = (in_param: VpnRpcCreateLink): Promise => + { + return this.CallAsync("CreateLink", in_param); + } + + /** Get the Cascade Connection Setting. Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetLink = (in_param: VpnRpcCreateLink): Promise => + { + return this.CallAsync("GetLink", in_param); + } + + /** Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. */ + public SetLink = (in_param: VpnRpcCreateLink): Promise => + { + return this.CallAsync("SetLink", in_param); + } + + /** Get List of Cascade Connections. Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumLink = (in_param: VpnRpcEnumLink): Promise => + { + return this.CallAsync("EnumLink", in_param); + } + + /** Switch Cascade Connection to Online Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetLinkOnline = (in_param: VpnRpcLink): Promise => + { + return this.CallAsync("SetLinkOnline", in_param); + } + + /** Switch Cascade Connection to Offline Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetLinkOffline = (in_param: VpnRpcLink): Promise => + { + return this.CallAsync("SetLinkOffline", in_param); + } + + /** Delete Cascade Connection Setting. Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public DeleteLink = (in_param: VpnRpcLink): Promise => + { + return this.CallAsync("DeleteLink", in_param); + } + + /** Change Name of Cascade Connection. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public RenameLink = (in_param: VpnRpcRenameLink): Promise => + { + return this.CallAsync("RenameLink", in_param); + } + + /** Get Current Cascade Connection Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetLinkStatus = (in_param: VpnRpcLinkStatus): Promise => + { + return this.CallAsync("GetLinkStatus", in_param); + } + + /** Add Access List Rule. Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public AddAccess = (in_param: VpnRpcAddAccess): Promise => + { + return this.CallAsync("AddAccess", in_param); + } + + /** Delete Rule from Access List. Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public DeleteAccess = (in_param: VpnRpcDeleteAccess): Promise => + { + return this.CallAsync("DeleteAccess", in_param); + } + + /** Get Access List Rule List. Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public EnumAccess = (in_param: VpnRpcEnumAccessList): Promise => + { + return this.CallAsync("EnumAccess", in_param); + } + + /** Replace all access lists on a single bulk API call. This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. */ + public SetAccessList = (in_param: VpnRpcEnumAccessList): Promise => + { + return this.CallAsync("SetAccessList", in_param); + } + + /** Create a user. Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public CreateUser = (in_param: VpnRpcSetUser): Promise => + { + return this.CallAsync("CreateUser", in_param); + } + + /** Change User Settings. Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public SetUser = (in_param: VpnRpcSetUser): Promise => + { + return this.CallAsync("SetUser", in_param); + } + + /** Get User Settings. Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public GetUser = (in_param: VpnRpcSetUser): Promise => + { + return this.CallAsync("GetUser", in_param); + } + + /** Delete a user. Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public DeleteUser = (in_param: VpnRpcDeleteUser): Promise => + { + return this.CallAsync("DeleteUser", in_param); + } + + /** Get List of Users. Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public EnumUser = (in_param: VpnRpcEnumUser): Promise => + { + return this.CallAsync("EnumUser", in_param); + } + + /** Create Group. Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public CreateGroup = (in_param: VpnRpcSetGroup): Promise => + { + return this.CallAsync("CreateGroup", in_param); + } + + /** Set group settings. Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public SetGroup = (in_param: VpnRpcSetGroup): Promise => + { + return this.CallAsync("SetGroup", in_param); + } + + /** Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public GetGroup = (in_param: VpnRpcSetGroup): Promise => + { + return this.CallAsync("GetGroup", in_param); + } + + /** Delete User from Group. Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public DeleteGroup = (in_param: VpnRpcDeleteUser): Promise => + { + return this.CallAsync("DeleteGroup", in_param); + } + + /** Get List of Groups. Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public EnumGroup = (in_param: VpnRpcEnumGroup): Promise => + { + return this.CallAsync("EnumGroup", in_param); + } + + /** Get List of Connected VPN Sessions. Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. */ + public EnumSession = (in_param: VpnRpcEnumSession): Promise => + { + return this.CallAsync("EnumSession", in_param); + } + + /** Get Session Status. Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. */ + public GetSessionStatus = (in_param: VpnRpcSessionStatus): Promise => + { + return this.CallAsync("GetSessionStatus", in_param); + } + + /** Disconnect Session. Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. */ + public DeleteSession = (in_param: VpnRpcDeleteSession): Promise => + { + return this.CallAsync("DeleteSession", in_param); + } + + /** Get the MAC Address Table Database. Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. */ + public EnumMacTable = (in_param: VpnRpcEnumMacTable): Promise => + { + return this.CallAsync("EnumMacTable", in_param); + } + + /** Delete MAC Address Table Entry. Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. */ + public DeleteMacTable = (in_param: VpnRpcDeleteTable): Promise => + { + return this.CallAsync("DeleteMacTable", in_param); + } + + /** Get the IP Address Table Database. Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. */ + public EnumIpTable = (in_param: VpnRpcEnumIpTable): Promise => + { + return this.CallAsync("EnumIpTable", in_param); + } + + /** Delete IP Address Table Entry. Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. */ + public DeleteIpTable = (in_param: VpnRpcDeleteTable): Promise => + { + return this.CallAsync("DeleteIpTable", in_param); + } + + /** Set the Keep Alive Internet Connection Function. Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. */ + public SetKeep = (in_param: VpnRpcKeep): Promise => + { + return this.CallAsync("SetKeep", in_param); + } + + /** Get the Keep Alive Internet Connection Function. Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. */ + public GetKeep = (in_param: VpnRpcKeep): Promise => + { + return this.CallAsync("GetKeep", in_param); + } + + /** Enable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnableSecureNAT = (in_param: VpnRpcHub): Promise => + { + return this.CallAsync("EnableSecureNAT", in_param); + } + + /** Disable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public DisableSecureNAT = (in_param: VpnRpcHub): Promise => + { + return this.CallAsync("DisableSecureNAT", in_param); + } + + /** Change Settings of SecureNAT Function. Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetSecureNATOption = (in_param: VpnVhOption): Promise => + { + return this.CallAsync("SetSecureNATOption", in_param); + } + + /** Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. */ + public GetSecureNATOption = (in_param: VpnVhOption): Promise => + { + return this.CallAsync("GetSecureNATOption", in_param); + } + + /** Get Virtual NAT Function Session Table of SecureNAT Function. Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumNAT = (in_param: VpnRpcEnumNat): Promise => + { + return this.CallAsync("EnumNAT", in_param); + } + + /** Get Virtual DHCP Server Function Lease Table of SecureNAT Function. Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumDHCP = (in_param: VpnRpcEnumDhcp): Promise => + { + return this.CallAsync("EnumDHCP", in_param); + } + + /** Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetSecureNATStatus = (in_param: VpnRpcNatStatus): Promise => + { + return this.CallAsync("GetSecureNATStatus", in_param); + } + + /** Get List of Network Adapters Usable as Local Bridge. Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. */ + public EnumEthernet = (): Promise => + { + return this.CallAsync("EnumEthernet", new VpnRpcEnumEth()); + } + + /** Create Local Bridge Connection. Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. */ + public AddLocalBridge = (in_param: VpnRpcLocalBridge): Promise => + { + return this.CallAsync("AddLocalBridge", in_param); + } + + /** Delete Local Bridge Connection. Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. */ + public DeleteLocalBridge = (in_param: VpnRpcLocalBridge): Promise => + { + return this.CallAsync("DeleteLocalBridge", in_param); + } + + /** Get List of Local Bridge Connection. Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. */ + public EnumLocalBridge = (): Promise => + { + return this.CallAsync("EnumLocalBridge", new VpnRpcEnumLocalBridge()); + } + + /** Get whether the localbridge function is supported on the current system. */ + public GetBridgeSupport = (): Promise => + { + return this.CallAsync("GetBridgeSupport", new VpnRpcBridgeSupport()); + } + + /** Reboot VPN Server Service. Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. */ + public RebootServer = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("RebootServer", in_param); + } + + /** Get List of Server Functions / Capability. Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. */ + public GetCaps = (): Promise => + { + return this.CallAsync("GetCaps", new VpnCapslist()); + } + + /** Get the current configuration of the VPN Server. Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. */ + public GetConfig = (): Promise => + { + return this.CallAsync("GetConfig", new VpnRpcConfig()); + } + + /** Write Configuration File to VPN Server. Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. */ + public SetConfig = (in_param: VpnRpcConfig): Promise => + { + return this.CallAsync("SetConfig", in_param); + } + + /** Get Virtual Hub Administration Option default values. */ + public GetDefaultHubAdminOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("GetDefaultHubAdminOptions", in_param); + } + + /** Get List of Virtual Hub Administration Options. Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + public GetHubAdminOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("GetHubAdminOptions", in_param); + } + + /** Set Values of Virtual Hub Administration Options. Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + public SetHubAdminOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("SetHubAdminOptions", in_param); + } + + /** Get List of Virtual Hub Extended Options. Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + public GetHubExtOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("GetHubExtOptions", in_param); + } + + /** Set a Value of Virtual Hub Extended Options. Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + public SetHubExtOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("SetHubExtOptions", in_param); + } + + /** Define New Virtual Layer 3 Switch. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + public AddL3Switch = (in_param: VpnRpcL3Sw): Promise => + { + return this.CallAsync("AddL3Switch", in_param); + } + + /** Delete Virtual Layer 3 Switch. Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + public DelL3Switch = (in_param: VpnRpcL3Sw): Promise => + { + return this.CallAsync("DelL3Switch", in_param); + } + + /** Get List of Virtual Layer 3 Switches. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + public EnumL3Switch = (): Promise => + { + return this.CallAsync("EnumL3Switch", new VpnRpcEnumL3Sw()); + } + + /** Start Virtual Layer 3 Switch Operation. Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + public StartL3Switch = (in_param: VpnRpcL3Sw): Promise => + { + return this.CallAsync("StartL3Switch", in_param); + } + + /** Stop Virtual Layer 3 Switch Operation. Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. */ + public StopL3Switch = (in_param: VpnRpcL3Sw): Promise => + { + return this.CallAsync("StopL3Switch", in_param); + } + + /** Add Virtual Interface to Virtual Layer 3 Switch. Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + public AddL3If = (in_param: VpnRpcL3If): Promise => + { + return this.CallAsync("AddL3If", in_param); + } + + /** Delete Virtual Interface of Virtual Layer 3 Switch. Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + public DelL3If = (in_param: VpnRpcL3If): Promise => + { + return this.CallAsync("DelL3If", in_param); + } + + /** Get List of Interfaces Registered on the Virtual Layer 3 Switch. Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + public EnumL3If = (in_param: VpnRpcEnumL3If): Promise => + { + return this.CallAsync("EnumL3If", in_param); + } + + /** Add Routing Table Entry for Virtual Layer 3 Switch. Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + public AddL3Table = (in_param: VpnRpcL3Table): Promise => + { + return this.CallAsync("AddL3Table", in_param); + } + + /** Delete Routing Table Entry of Virtual Layer 3 Switch. Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + public DelL3Table = (in_param: VpnRpcL3Table): Promise => + { + return this.CallAsync("DelL3Table", in_param); + } + + /** Get List of Routing Tables of Virtual Layer 3 Switch. Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + public EnumL3Table = (in_param: VpnRpcEnumL3Table): Promise => + { + return this.CallAsync("EnumL3Table", in_param); + } + + /** Get List of Certificates Revocation List. Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumCrl = (in_param: VpnRpcEnumCrl): Promise => + { + return this.CallAsync("EnumCrl", in_param); + } + + /** Add a Revoked Certificate. Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public AddCrl = (in_param: VpnRpcCrl): Promise => + { + return this.CallAsync("AddCrl", in_param); + } + + /** Delete a Revoked Certificate. Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public DelCrl = (in_param: VpnRpcCrl): Promise => + { + return this.CallAsync("DelCrl", in_param); + } + + /** Get a Revoked Certificate. Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetCrl = (in_param: VpnRpcCrl): Promise => + { + return this.CallAsync("GetCrl", in_param); + } + + /** Change Existing CRL (Certificate Revocation List) Entry. Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetCrl = (in_param: VpnRpcCrl): Promise => + { + return this.CallAsync("SetCrl", in_param); + } + + /** Add Rule to Source IP Address Limit List. Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetAcList = (in_param: VpnRpcAcList): Promise => + { + return this.CallAsync("SetAcList", in_param); + } + + /** Get List of Rule Items of Source IP Address Limit List. Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetAcList = (in_param: VpnRpcAcList): Promise => + { + return this.CallAsync("GetAcList", in_param); + } + + /** Get List of Log Files. Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. */ + public EnumLogFile = (): Promise => + { + return this.CallAsync("EnumLogFile", new VpnRpcEnumLogFile()); + } + + /** Download a part of Log File. Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. */ + public ReadLogFile = (in_param: VpnRpcReadLogFile): Promise => + { + return this.CallAsync("ReadLogFile", in_param); + } + + /** Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use. */ + public SetSysLog = (in_param: VpnSyslogSetting): Promise => + { + return this.CallAsync("SetSysLog", in_param); + } + + /** Get syslog Send Function. This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. */ + public GetSysLog = (in_param: VpnSyslogSetting): Promise => + { + return this.CallAsync("GetSysLog", in_param); + } + + /** Set Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. */ + public SetHubMsg = (in_param: VpnRpcMsg): Promise => + { + return this.CallAsync("SetHubMsg", in_param); + } + + /** Get Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. */ + public GetHubMsg = (in_param: VpnRpcMsg): Promise => + { + return this.CallAsync("GetHubMsg", in_param); + } + + /** Raise a vital error on the VPN Server / Bridge to terminate the process forcefully. This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. */ + public Crash = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("Crash", in_param); + } + + /** Get the message for administrators. */ + public GetAdminMsg = (): Promise => + { + return this.CallAsync("GetAdminMsg", new VpnRpcMsg()); + } + + /** Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. */ + public Flush = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("Flush", in_param); + } + + /** Enable or Disable IPsec VPN Server Function. Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetIPsecServices = (in_param: VpnIPsecServices): Promise => + { + return this.CallAsync("SetIPsecServices", in_param); + } + + /** Get the Current IPsec VPN Server Settings. Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetIPsecServices = (): Promise => + { + return this.CallAsync("GetIPsecServices", new VpnIPsecServices()); + } + + /** Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices. Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public AddEtherIpId = (in_param: VpnEtherIpId): Promise => + { + return this.CallAsync("AddEtherIpId", in_param); + } + + /** Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetEtherIpId = (in_param: VpnEtherIpId): Promise => + { + return this.CallAsync("GetEtherIpId", in_param); + } + + /** Delete an EtherIP / L2TPv3 over IPsec Client Setting. This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public DeleteEtherIpId = (in_param: VpnEtherIpId): Promise => + { + return this.CallAsync("DeleteEtherIpId", in_param); + } + + /** Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumEtherIpId = (): Promise => + { + return this.CallAsync("EnumEtherIpId", new VpnRpcEnumEtherIpId()); + } + + /** Set Settings for OpenVPN Clone Server Function. The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetOpenVpnSstpConfig = (in_param: VpnOpenVpnSstpConfig): Promise => + { + return this.CallAsync("SetOpenVpnSstpConfig", in_param); + } + + /** Get the Current Settings of OpenVPN Clone Server Function. Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetOpenVpnSstpConfig = (): Promise => + { + return this.CallAsync("GetOpenVpnSstpConfig", new VpnOpenVpnSstpConfig()); + } + + /** Show the Current Status of Dynamic DNS Function. Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + public GetDDnsClientStatus = (): Promise => + { + return this.CallAsync("GetDDnsClientStatus", new VpnDDnsClientStatus()); + } + + /** Set the Dynamic DNS Hostname. You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + public ChangeDDnsClientHostname = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("ChangeDDnsClientHostname", in_param); + } + + /** Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server. You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public RegenerateServerCert = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("RegenerateServerCert", in_param); + } + + /** Generate a Sample Setting File for OpenVPN Client. Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public MakeOpenVpnConfigFile = (): Promise => + { + return this.CallAsync("MakeOpenVpnConfigFile", new VpnRpcReadLogFile()); + } + + /** Enable / Disable the VPN over ICMP / VPN over DNS Server Function. You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + public SetSpecialListener = (in_param: VpnRpcSpecialListener): Promise => + { + return this.CallAsync("SetSpecialListener", in_param); + } + + /** Get Current Setting of the VPN over ICMP / VPN over DNS Function. Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + public GetSpecialListener = (): Promise => + { + return this.CallAsync("GetSpecialListener", new VpnRpcSpecialListener()); + } + + /** Show the current status of VPN Azure function. Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetAzureStatus = (): Promise => + { + return this.CallAsync("GetAzureStatus", new VpnRpcAzureStatus()); + } + + /** Enable / Disable VPN Azure Function. Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetAzureStatus = (in_param: VpnRpcAzureStatus): Promise => + { + return this.CallAsync("SetAzureStatus", in_param); + } + + /** Get the Proxy Settings for Connecting to the DDNS server. */ + public GetDDnsInternetSettng = (): Promise => + { + return this.CallAsync("GetDDnsInternetSettng", new VpnInternetSetting()); + } + + /** Set the Proxy Settings for Connecting to the DDNS server. */ + public SetDDnsInternetSettng = (in_param: VpnInternetSetting): Promise => + { + return this.CallAsync("SetDDnsInternetSettng", in_param); + } + + /** Set the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */ + public SetVgsConfig = (in_param: VpnVgsConfig): Promise => + { + return this.CallAsync("SetVgsConfig", in_param); + } + + /** Get the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */ + public GetVgsConfig = (): Promise => + { + return this.CallAsync("GetVgsConfig", new VpnVgsConfig()); + } + + + + // -- Utility functions -- + /** Call a RPC procedure */ + public async CallAsync(method_name: string, request: T): Promise + { + let response: T = await this.rpc_client.CallAsync(method_name, request); + + return response; + } +} + + + + +// --- Types --- +/** IP Protocol Numbers */ +export enum VpnIpProtocolNumber +{ + /** ICMP for IPv4 */ + ICMPv4 = 1, + + /** TCP */ + TCP = 6, + + /** UDP */ + UDP = 17, + + /** ICMP for IPv6 */ + ICMPv6 = 58, + +} + +/** The body of the Access list */ +export class VpnAccess +{ + /** ID */ + public Id_u32: number = 0; + + /** Specify a description (note) for this rule */ + public Note_utf: string = ""; + + /** Enabled flag (true: enabled, false: disabled) */ + public Active_bool: boolean = false; + + /** Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. */ + public Priority_u32: number = 0; + + /** The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. */ + public Discard_bool: boolean = false; + + /** The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. */ + public IsIPv6_bool: boolean = false; + + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. */ + public SrcIpAddress_ip: string = ""; + + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. */ + public SrcSubnetMask_ip: string = ""; + + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. */ + public DestIpAddress_ip: string = ""; + + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. */ + public DestSubnetMask_ip: string = ""; + + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. */ + public SrcIpAddress6_bin: Uint8Array = new Uint8Array([]); + + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. */ + public SrcSubnetMask6_bin: Uint8Array = new Uint8Array([]); + + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. */ + public DestIpAddress6_bin: Uint8Array = new Uint8Array([]); + + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. */ + public DestSubnetMask6_bin: Uint8Array = new Uint8Array([]); + + /** The IP protocol number */ + public Protocol_u32: VpnIpProtocolNumber = 0; + + /** The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + public SrcPortStart_u32: number = 0; + + /** The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + public SrcPortEnd_u32: number = 0; + + /** The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + public DestPortStart_u32: number = 0; + + /** The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + public DestPortEnd_u32: number = 0; + + /** Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. */ + public SrcUsername_str: string = ""; + + /** Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. */ + public DestUsername_str: string = ""; + + /** Specify true if you want to check the source MAC address. */ + public CheckSrcMac_bool: boolean = false; + + /** Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */ + public SrcMacAddress_bin: Uint8Array = new Uint8Array([]); + + /** Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */ + public SrcMacMask_bin: Uint8Array = new Uint8Array([]); + + /** Specify true if you want to check the destination MAC address. */ + public CheckDstMac_bool: boolean = false; + + /** Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */ + public DstMacAddress_bin: Uint8Array = new Uint8Array([]); + + /** Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */ + public DstMacMask_bin: Uint8Array = new Uint8Array([]); + + /** Specify true if you want to check the state of the TCP connection. */ + public CheckTcpState_bool: boolean = false; + + /** Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. */ + public Established_bool: boolean = false; + + /** Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. */ + public Delay_u32: number = 0; + + /** Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. */ + public Jitter_u32: number = 0; + + /** Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. */ + public Loss_u32: number = 0; + + /** The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. */ + public RedirectUrl_str: string = ""; + + /** Constructor for the 'VpnAccess' class: The body of the Access list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Add an item to Access List */ +export class VpnRpcAddAccess +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Access list (Must be a single item) */ + public AccessListSingle: VpnAccess[] = []; + + /** Constructor for the 'VpnRpcAddAccess' class: Add an item to Access List */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Add CA to HUB */ +export class VpnRpcHubAddCA +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The body of the X.509 certificate */ + public Cert_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcHubAddCA' class: Add CA to HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** CRL entry */ +export class VpnRpcCrl +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Key ID */ + public Key_u32: number = 0; + + /** CN, optional */ + public CommonName_utf: string = ""; + + /** O, optional */ + public Organization_utf: string = ""; + + /** OU, optional */ + public Unit_utf: string = ""; + + /** C, optional */ + public Country_utf: string = ""; + + /** ST, optional */ + public State_utf: string = ""; + + /** L, optional */ + public Local_utf: string = ""; + + /** Serial, optional */ + public Serial_bin: Uint8Array = new Uint8Array([]); + + /** MD5 Digest, optional */ + public DigestMD5_bin: Uint8Array = new Uint8Array([]); + + /** SHA1 Digest, optional */ + public DigestSHA1_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcCrl' class: CRL entry */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** EtherIP key list entry */ +export class VpnEtherIpId +{ + /** Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. */ + public Id_str: string = ""; + + /** Specify the name of the Virtual Hub to connect. */ + public HubName_str: string = ""; + + /** Specify the username to login to the destination Virtual Hub. */ + public UserName_str: string = ""; + + /** Specify the password to login to the destination Virtual Hub. */ + public Password_str: string = ""; + + /** Constructor for the 'VpnEtherIpId' class: EtherIP key list entry */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 virtual interface */ +export class VpnRpcL3If +{ + /** L3 switch name */ + public Name_str: string = ""; + + /** Virtual HUB name */ + public HubName_str: string = ""; + + /** IP address */ + public IpAddress_ip: string = ""; + + /** Subnet mask */ + public SubnetMask_ip: string = ""; + + /** Constructor for the 'VpnRpcL3If' class: Layer-3 virtual interface */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 switch */ +export class VpnRpcL3Sw +{ + /** Layer-3 Switch name */ + public Name_str: string = ""; + + /** Constructor for the 'VpnRpcL3Sw' class: Layer-3 switch */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Routing table */ +export class VpnRpcL3Table +{ + /** L3 switch name */ + public Name_str: string = ""; + + /** Network address */ + public NetworkAddress_ip: string = ""; + + /** Subnet mask */ + public SubnetMask_ip: string = ""; + + /** Gateway address */ + public GatewayAddress_ip: string = ""; + + /** Metric */ + public Metric_u32: number = 0; + + /** Constructor for the 'VpnRpcL3Table' class: Routing table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Generic parameter to contain u32, u64, ascii_string and unicode string */ +export class VpnRpcTest +{ + /** A 32-bit integer field */ + public IntValue_u32: number = 0; + + /** A 64-bit integer field */ + public Int64Value_u64: number = 0; + + /** An Ascii string field */ + public StrValue_str: string = ""; + + /** An UTF-8 string field */ + public UniStrValue_utf: string = ""; + + /** Constructor for the 'VpnRpcTest' class: Generic parameter to contain u32, u64, ascii_string and unicode string */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Local Bridge list item */ +export class VpnRpcLocalBridge +{ + /** Physical Ethernet device name */ + public DeviceName_str: string = ""; + + /** The Virtual Hub name */ + public HubNameLB_str: string = ""; + + /** Online flag */ + public Online_bool: boolean = false; + + /** Running flag */ + public Active_bool: boolean = false; + + /** Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). */ + public TapMode_bool: boolean = false; + + /** Constructor for the 'VpnRpcLocalBridge' class: Local Bridge list item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Create, configure, and get the group */ +export class VpnRpcSetGroup +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The group name */ + public Name_str: string = ""; + + /** Optional real name (full name) of the group, allow using any Unicode characters */ + public Realname_utf: string = ""; + + /** Optional, specify a description of the group */ + public Note_utf: string = ""; + + /** Number of broadcast packets (Recv) */ + public ["Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastCount_u64"]: number = 0; + + /** The flag whether to use security policy */ + public UsePolicy_bool: boolean = false; + + /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */ + public ["policy:Access_bool"]: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPFilter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + public ["policy:DHCPNoServer_bool"]: boolean = false; + + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + public ["policy:DHCPForce_bool"]: boolean = false; + + /** Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. */ + public ["policy:NoBridge_bool"]: boolean = false; + + /** Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + public ["policy:NoRouting_bool"]: boolean = false; + + /** Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckMac_bool"]: boolean = false; + + /** Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckIP_bool"]: boolean = false; + + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + public ["policy:ArpDhcpOnly_bool"]: boolean = false; + + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + public ["policy:PrivacyFilter_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + public ["policy:NoServer_bool"]: boolean = false; + + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + public ["policy:NoBroadcastLimiter_bool"]: boolean = false; + + /** Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. */ + public ["policy:MonitorPort_bool"]: boolean = false; + + /** Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. */ + public ["policy:MaxConnection_u32"]: number = 0; + + /** Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. */ + public ["policy:TimeOut_u32"]: number = 0; + + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + public ["policy:MaxMac_u32"]: number = 0; + + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + public ["policy:MaxIP_u32"]: number = 0; + + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + public ["policy:MaxUpload_u32"]: number = 0; + + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + public ["policy:MaxDownload_u32"]: number = 0; + + /** Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. */ + public ["policy:FixPassword_bool"]: boolean = false; + + /** Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. */ + public ["policy:MultiLogins_u32"]: number = 0; + + /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */ + public ["policy:NoQoS_bool"]: boolean = false; + + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + public ["policy:RSandRAFilter_bool"]: boolean = false; + + /** Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. */ + public ["policy:RAFilter_bool"]: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPv6Filter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + public ["policy:DHCPv6NoServer_bool"]: boolean = false; + + /** Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + public ["policy:NoRoutingV6_bool"]: boolean = false; + + /** Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckIPv6_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + public ["policy:NoServerV6_bool"]: boolean = false; + + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + public ["policy:MaxIPv6_u32"]: number = 0; + + /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + public ["policy:NoSavePassword_bool"]: boolean = false; + + /** Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + public ["policy:AutoDisconnect_u32"]: number = 0; + + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv4_bool"]: boolean = false; + + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv6_bool"]: boolean = false; + + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + public ["policy:FilterNonIP_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: boolean = false; + + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + public ["policy:VLanId_u32"]: number = 0; + + /** Security policy: Whether version 3.0 (must be true) */ + public ["policy:Ver3_bool"]: boolean = false; + + /** Constructor for the 'VpnRpcSetGroup' class: Create, configure, and get the group */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Hub types */ +export enum VpnRpcHubType +{ + /** Stand-alone HUB */ + Standalone = 0, + + /** Static HUB */ + FarmStatic = 1, + + /** Dynamic HUB */ + FarmDynamic = 2, + +} + +/** Create a HUB */ +export class VpnRpcCreateHub +{ + /** Specify the name of the Virtual Hub to create / update. */ + public HubName_str: string = ""; + + /** Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. */ + public AdminPasswordPlainText_str: string = ""; + + /** Online flag */ + public Online_bool: boolean = false; + + /** Maximum number of VPN sessions */ + public MaxSession_u32: number = 0; + + /** No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. */ + public NoEnum_bool: boolean = false; + + /** Type of the Virtual Hub (Valid only for Clustered VPN Servers) */ + public HubType_u32: VpnRpcHubType = 0; + + /** Constructor for the 'VpnRpcCreateHub' class: Create a HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +export enum VpnRpcClientAuthType +{ + /** Anonymous authentication */ + Anonymous = 0, + + /** SHA-0 hashed password authentication */ + SHA0_Hashed_Password = 1, + + /** Plain password authentication */ + PlainPassword = 2, + + /** Certificate authentication */ + Cert = 3, + +} + +/** Create and set of link */ +export class VpnRpcCreateLink +{ + /** The Virtual Hub name */ + public HubName_Ex_str: string = ""; + + /** Online flag */ + public Online_bool: boolean = false; + + /** The flag to enable validation for the server certificate */ + public CheckServerCert_bool: boolean = false; + + /** The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. */ + public ServerCert_bin: Uint8Array = new Uint8Array([]); + + /** Client Option Parameters: Specify the name of the Cascade Connection */ + public AccountName_utf: string = ""; + + /** Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. */ + public Hostname_str: string = ""; + + /** Client Option Parameters: Specify the port number of the destination VPN Server. */ + public Port_u32: number = 0; + + /** Client Option Parameters: The type of the proxy server */ + public ProxyType_u32: VpnRpcProxyType = 0; + + /** Client Option Parameters: The hostname or IP address of the proxy server name */ + public ProxyName_str: string = ""; + + /** Client Option Parameters: The port number of the proxy server */ + public ProxyPort_u32: number = 0; + + /** Client Option Parameters: The username to connect to the proxy server */ + public ProxyUsername_str: string = ""; + + /** Client Option Parameters: The password to connect to the proxy server */ + public ProxyPassword_str: string = ""; + + /** Client Option Parameters: The Virtual Hub on the destination VPN Server */ + public HubName_str: string = ""; + + /** Client Option Parameters: Number of TCP Connections to Use in VPN Communication */ + public MaxConnection_u32: number = 0; + + /** Client Option Parameters: The flag to enable the encryption on the communication */ + public UseEncrypt_bool: boolean = false; + + /** Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection */ + public UseCompress_bool: boolean = false; + + /** Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. */ + public HalfConnection_bool: boolean = false; + + /** Client Option Parameters: Connection attempt interval when additional connection will be established */ + public AdditionalConnectionInterval_u32: number = 0; + + /** Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) */ + public ConnectionDisconnectSpan_u32: number = 0; + + /** Client Option Parameters: Disable QoS Control Function if the value is true */ + public DisableQoS_bool: boolean = false; + + /** Client Option Parameters: Do not use TLS 1.x of the value is true */ + public NoTls1_bool: boolean = false; + + /** Client Option Parameters: Do not use UDP acceleration mode if the value is true */ + public NoUdpAcceleration_bool: boolean = false; + + /** Authentication type */ + public AuthType_u32: VpnRpcClientAuthType = 0; + + /** User name */ + public Username_str: string = ""; + + /** SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). */ + public HashedPassword_bin: Uint8Array = new Uint8Array([]); + + /** Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). */ + public PlainPassword_str: string = ""; + + /** Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */ + public ClientX_bin: Uint8Array = new Uint8Array([]); + + /** Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */ + public ClientK_bin: Uint8Array = new Uint8Array([]); + + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPFilter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + public ["policy:DHCPNoServer_bool"]: boolean = false; + + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + public ["policy:DHCPForce_bool"]: boolean = false; + + /** Security policy: Prohibit the duplicate MAC address */ + public SecPol_CheckMac_bool: boolean = false; + + /** Security policy: Prohibit a duplicate IP address (IPv4) */ + public SecPol_CheckIP_bool: boolean = false; + + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + public ["policy:ArpDhcpOnly_bool"]: boolean = false; + + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + public ["policy:PrivacyFilter_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + public ["policy:NoServer_bool"]: boolean = false; + + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + public ["policy:NoBroadcastLimiter_bool"]: boolean = false; + + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + public ["policy:MaxMac_u32"]: number = 0; + + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + public ["policy:MaxIP_u32"]: number = 0; + + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + public ["policy:MaxUpload_u32"]: number = 0; + + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + public ["policy:MaxDownload_u32"]: number = 0; + + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + public ["policy:RSandRAFilter_bool"]: boolean = false; + + /** Security policy: Filter the router advertisement packet (IPv6) */ + public SecPol_RAFilter_bool: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPv6Filter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + public ["policy:DHCPv6NoServer_bool"]: boolean = false; + + /** Security policy: Prohibit the duplicate IP address (IPv6) */ + public SecPol_CheckIPv6_bool: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + public ["policy:NoServerV6_bool"]: boolean = false; + + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + public ["policy:MaxIPv6_u32"]: number = 0; + + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv4_bool"]: boolean = false; + + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv6_bool"]: boolean = false; + + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + public ["policy:FilterNonIP_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean = false; + + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + public ["policy:VLanId_u32"]: number = 0; + + /** Security policy: Whether version 3.0 (must be true) */ + public ["policy:Ver3_bool"]: boolean = false; + + /** Constructor for the 'VpnRpcCreateLink' class: Create and set of link */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Listener */ +export class VpnRpcListener +{ + /** Port number (Range: 1 - 65535) */ + public Port_u32: number = 0; + + /** Active state */ + public Enable_bool: boolean = false; + + /** Constructor for the 'VpnRpcListener' class: Listener */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** User authentication type (server side) */ +export enum VpnRpcUserAuthType +{ + /** Anonymous authentication */ + Anonymous = 0, + + /** Password authentication */ + Password = 1, + + /** User certificate authentication */ + UserCert = 2, + + /** Root certificate which is issued by trusted Certificate Authority */ + RootCert = 3, + + /** Radius authentication */ + Radius = 4, + + /** Windows NT authentication */ + NTDomain = 5, + +} + +/** Create, configure, and get the user */ +export class VpnRpcSetUser +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Specify the user name of the user */ + public Name_str: string = ""; + + /** Assigned group name for the user */ + public GroupName_str: string = ""; + + /** Optional real name (full name) of the user, allow using any Unicode characters */ + public Realname_utf: string = ""; + + /** Optional User Description */ + public Note_utf: string = ""; + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Last modified date and time */ + public UpdatedTime_dt: Date = new Date(); + + /** Expiration date and time */ + public ExpireTime_dt: Date = new Date(); + + /** Authentication method of the user */ + public AuthType_u32: VpnRpcUserAuthType = 0; + + /** User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. */ + public Auth_Password_str: string = ""; + + /** User certificate, valid only if AuthType_u32 == UserCert(2). */ + public UserX_bin: Uint8Array = new Uint8Array([]); + + /** Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). */ + public Serial_bin: Uint8Array = new Uint8Array([]); + + /** Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). */ + public CommonName_utf: string = ""; + + /** Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). */ + public RadiusUsername_utf: string = ""; + + /** Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). */ + public NtUsername_utf: string = ""; + + /** Number of total logins of the user */ + public NumLogin_u32: number = 0; + + /** Number of broadcast packets (Recv) */ + public ["Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastCount_u64"]: number = 0; + + /** The flag whether to use security policy */ + public UsePolicy_bool: boolean = false; + + /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */ + public ["policy:Access_bool"]: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPFilter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + public ["policy:DHCPNoServer_bool"]: boolean = false; + + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + public ["policy:DHCPForce_bool"]: boolean = false; + + /** Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. */ + public ["policy:NoBridge_bool"]: boolean = false; + + /** Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + public ["policy:NoRouting_bool"]: boolean = false; + + /** Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckMac_bool"]: boolean = false; + + /** Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckIP_bool"]: boolean = false; + + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + public ["policy:ArpDhcpOnly_bool"]: boolean = false; + + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + public ["policy:PrivacyFilter_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + public ["policy:NoServer_bool"]: boolean = false; + + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + public ["policy:NoBroadcastLimiter_bool"]: boolean = false; + + /** Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. */ + public ["policy:MonitorPort_bool"]: boolean = false; + + /** Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. */ + public ["policy:MaxConnection_u32"]: number = 0; + + /** Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. */ + public ["policy:TimeOut_u32"]: number = 0; + + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + public ["policy:MaxMac_u32"]: number = 0; + + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + public ["policy:MaxIP_u32"]: number = 0; + + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + public ["policy:MaxUpload_u32"]: number = 0; + + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + public ["policy:MaxDownload_u32"]: number = 0; + + /** Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. */ + public ["policy:FixPassword_bool"]: boolean = false; + + /** Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. */ + public ["policy:MultiLogins_u32"]: number = 0; + + /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */ + public ["policy:NoQoS_bool"]: boolean = false; + + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + public ["policy:RSandRAFilter_bool"]: boolean = false; + + /** Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. */ + public ["policy:RAFilter_bool"]: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPv6Filter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + public ["policy:DHCPv6NoServer_bool"]: boolean = false; + + /** Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + public ["policy:NoRoutingV6_bool"]: boolean = false; + + /** Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckIPv6_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + public ["policy:NoServerV6_bool"]: boolean = false; + + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + public ["policy:MaxIPv6_u32"]: number = 0; + + /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + public ["policy:NoSavePassword_bool"]: boolean = false; + + /** Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + public ["policy:AutoDisconnect_u32"]: number = 0; + + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv4_bool"]: boolean = false; + + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv6_bool"]: boolean = false; + + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + public ["policy:FilterNonIP_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: boolean = false; + + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + public ["policy:VLanId_u32"]: number = 0; + + /** Security policy: Whether version 3.0 (must be true) */ + public ["policy:Ver3_bool"]: boolean = false; + + /** Constructor for the 'VpnRpcSetUser' class: Create, configure, and get the user */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Delete the access list */ +export class VpnRpcDeleteAccess +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** ID */ + public Id_u32: number = 0; + + /** Constructor for the 'VpnRpcDeleteAccess' class: Delete the access list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Delete the CA of HUB */ +export class VpnRpcHubDeleteCA +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Certificate key id to be deleted */ + public Key_u32: number = 0; + + /** Constructor for the 'VpnRpcHubDeleteCA' class: Delete the CA of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Deleting a user or group */ +export class VpnRpcDeleteUser +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** User or group name */ + public Name_str: string = ""; + + /** Constructor for the 'VpnRpcDeleteUser' class: Deleting a user or group */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Delete the HUB */ +export class VpnRpcDeleteHub +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Constructor for the 'VpnRpcDeleteHub' class: Delete the HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Delete the table */ +export class VpnRpcDeleteTable +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Key ID */ + public Key_u32: number = 0; + + /** Constructor for the 'VpnRpcDeleteTable' class: Delete the table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Specify the Link */ +export class VpnRpcLink +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The name of the cascade connection */ + public AccountName_utf: string = ""; + + /** Constructor for the 'VpnRpcLink' class: Specify the Link */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Disconnect the session */ +export class VpnRpcDeleteSession +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Session name */ + public Name_str: string = ""; + + /** Constructor for the 'VpnRpcDeleteSession' class: Disconnect the session */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Specify the HUB */ +export class VpnRpcHub +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Constructor for the 'VpnRpcHub' class: Specify the HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Disconnect a connection */ +export class VpnRpcDisconnectConnection +{ + /** Connection name */ + public Name_str: string = ""; + + /** Constructor for the 'VpnRpcDisconnectConnection' class: Disconnect a connection */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of the access list */ +export class VpnRpcEnumAccessList +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Access list */ + public AccessList: VpnAccess[] = []; + + /** Constructor for the 'VpnRpcEnumAccessList' class: Enumeration of the access list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** CA enumeration items of HUB */ +export class VpnRpcHubEnumCAItem +{ + /** The key id of the item */ + public Key_u32: number = 0; + + /** Subject */ + public SubjectName_utf: string = ""; + + /** Issuer */ + public IssuerName_utf: string = ""; + + /** Expiration date */ + public Expires_dt: Date = new Date(); + + /** Constructor for the 'VpnRpcHubEnumCAItem' class: CA enumeration items of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** CA enumeration of HUB */ +export class VpnRpcHubEnumCA +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The list of CA */ + public CAList: VpnRpcHubEnumCAItem[] = []; + + /** Constructor for the 'VpnRpcHubEnumCA' class: CA enumeration of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Type of connection */ +export enum VpnRpcConnectionType +{ + /** VPN Client */ + Client = 0, + + /** During initialization */ + Init = 1, + + /** Login connection */ + Login = 2, + + /** Additional connection */ + Additional = 3, + + /** RPC for server farm */ + FarmRpc = 4, + + /** RPC for Management */ + AdminRpc = 5, + + /** HUB enumeration */ + EnumHub = 6, + + /** Password change */ + Password = 7, + + /** SSTP */ + SSTP = 8, + + /** OpenVPN */ + OpenVPN = 9, + +} + +/** Connection enumeration items */ +export class VpnRpcEnumConnectionItem +{ + /** Connection name */ + public Name_str: string = ""; + + /** Host name */ + public Hostname_str: string = ""; + + /** IP address */ + public Ip_ip: string = ""; + + /** Port number */ + public Port_u32: number = 0; + + /** Connected time */ + public ConnectedTime_dt: Date = new Date(); + + /** Connection type */ + public Type_u32: VpnRpcConnectionType = 0; + + /** Constructor for the 'VpnRpcEnumConnectionItem' class: Connection enumeration items */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Connection enumeration */ +export class VpnRpcEnumConnection +{ + /** Number of connections */ + public NumConnection_u32: number = 0; + + /** Connection list */ + public ConnectionList: VpnRpcEnumConnectionItem[] = []; + + /** Constructor for the 'VpnRpcEnumConnection' class: Connection enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enum CRL Item */ +export class VpnRpcEnumCrlItem +{ + /** Key ID */ + public Key_u32: number = 0; + + /** The contents of the CRL item */ + public CrlInfo_utf: string = ""; + + /** Constructor for the 'VpnRpcEnumCrlItem' class: Enum CRL Item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enum CRL */ +export class VpnRpcEnumCrl +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** CRL list */ + public CRLList: VpnRpcEnumCrlItem[] = []; + + /** Constructor for the 'VpnRpcEnumCrl' class: Enum CRL */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RPC_ENUM_DHCP_ITEM */ +export class VpnRpcEnumDhcpItem +{ + /** ID */ + public Id_u32: number = 0; + + /** Lease time */ + public LeasedTime_dt: Date = new Date(); + + /** Expiration date */ + public ExpireTime_dt: Date = new Date(); + + /** MAC address */ + public MacAddress_bin: Uint8Array = new Uint8Array([]); + + /** IP address */ + public IpAddress_ip: string = ""; + + /** Subnet mask */ + public Mask_u32: number = 0; + + /** Host name */ + public Hostname_str: string = ""; + + /** Constructor for the 'VpnRpcEnumDhcpItem' class: RPC_ENUM_DHCP_ITEM */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RPC_ENUM_DHCP */ +export class VpnRpcEnumDhcp +{ + /** Virtual Hub Name */ + public HubName_str: string = ""; + + /** DHCP Item */ + public DhcpTable: VpnRpcEnumDhcpItem[] = []; + + /** Constructor for the 'VpnRpcEnumDhcp' class: RPC_ENUM_DHCP */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** EtherIP setting list */ +export class VpnRpcEnumEtherIpId +{ + /** Setting list */ + public Settings: VpnEtherIpId[] = []; + + /** Constructor for the 'VpnRpcEnumEtherIpId' class: EtherIP setting list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Ethernet Network Adapters list item */ +export class VpnRpcEnumEthItem +{ + /** Device name */ + public DeviceName_str: string = ""; + + /** Network connection name (description) */ + public NetworkConnectionName_utf: string = ""; + + /** Constructor for the 'VpnRpcEnumEthItem' class: Ethernet Network Adapters list item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Ethernet Network Adapters list */ +export class VpnRpcEnumEth +{ + /** Ethernet Network Adapters list */ + public EthList: VpnRpcEnumEthItem[] = []; + + /** Constructor for the 'VpnRpcEnumEth' class: Ethernet Network Adapters list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server farm members enumeration items */ +export class VpnRpcEnumFarmItem +{ + /** ID */ + public Id_u32: number = 0; + + /** Controller */ + public Controller_bool: boolean = false; + + /** Connection time */ + public ConnectedTime_dt: Date = new Date(); + + /** IP address */ + public Ip_ip: string = ""; + + /** Host name */ + public Hostname_str: string = ""; + + /** Point */ + public Point_u32: number = 0; + + /** Number of sessions */ + public NumSessions_u32: number = 0; + + /** Number of TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Number of HUBs */ + public NumHubs_u32: number = 0; + + /** Number of assigned client licenses */ + public AssignedClientLicense_u32: number = 0; + + /** Number of assigned bridge licenses */ + public AssignedBridgeLicense_u32: number = 0; + + /** Constructor for the 'VpnRpcEnumFarmItem' class: Server farm members enumeration items */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server farm member enumeration */ +export class VpnRpcEnumFarm +{ + /** Number of Cluster Members */ + public NumFarm_u32: number = 0; + + /** Cluster Members list */ + public FarmMemberList: VpnRpcEnumFarmItem[] = []; + + /** Constructor for the 'VpnRpcEnumFarm' class: Server farm member enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration items in the group */ +export class VpnRpcEnumGroupItem +{ + /** User name */ + public Name_str: string = ""; + + /** Real name */ + public Realname_utf: string = ""; + + /** Note */ + public Note_utf: string = ""; + + /** Number of users */ + public NumUsers_u32: number = 0; + + /** Access denied */ + public DenyAccess_bool: boolean = false; + + /** Constructor for the 'VpnRpcEnumGroupItem' class: Enumeration items in the group */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Group enumeration */ +export class VpnRpcEnumGroup +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Group list */ + public GroupList: VpnRpcEnumGroupItem[] = []; + + /** Constructor for the 'VpnRpcEnumGroup' class: Group enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration items of HUB */ +export class VpnRpcEnumHubItem +{ + /** The name of the Virtual Hub */ + public HubName_str: string = ""; + + /** Online state */ + public Online_bool: boolean = false; + + /** Type of HUB (Valid only for Clustered VPN Servers) */ + public HubType_u32: VpnRpcHubType = 0; + + /** Number of users */ + public NumUsers_u32: number = 0; + + /** Number of registered groups */ + public NumGroups_u32: number = 0; + + /** Number of registered sessions */ + public NumSessions_u32: number = 0; + + /** Number of current MAC table entries */ + public NumMacTables_u32: number = 0; + + /** Number of current IP table entries */ + public NumIpTables_u32: number = 0; + + /** Last communication date and time */ + public LastCommTime_dt: Date = new Date(); + + /** Last login date and time */ + public LastLoginTime_dt: Date = new Date(); + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Number of accumulated logins */ + public NumLogin_u32: number = 0; + + /** Whether the traffic information is provided */ + public IsTrafficFilled_bool: boolean = false; + + /** Number of broadcast packets (Recv) */ + public ["Ex.Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Ex.Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Ex.Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Ex.Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Ex.Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Ex.Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Ex.Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Ex.Send.UnicastCount_u64"]: number = 0; + + /** Constructor for the 'VpnRpcEnumHubItem' class: Enumeration items of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of HUB */ +export class VpnRpcEnumHub +{ + /** Number of Virtual Hubs */ + public NumHub_u32: number = 0; + + /** Virtual Hubs */ + public HubList: VpnRpcEnumHubItem[] = []; + + /** Constructor for the 'VpnRpcEnumHub' class: Enumeration of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration items of IP table */ +export class VpnRpcEnumIpTableItem +{ + /** Key ID */ + public Key_u32: number = 0; + + /** Session name */ + public SessionName_str: string = ""; + + /** IP address */ + public IpAddress_ip: string = ""; + + /** Assigned by the DHCP */ + public DhcpAllocated_bool: boolean = false; + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Updating date */ + public UpdatedTime_dt: Date = new Date(); + + /** Remote items */ + public RemoteItem_bool: boolean = false; + + /** Remote host name */ + public RemoteHostname_str: string = ""; + + /** Constructor for the 'VpnRpcEnumIpTableItem' class: Enumeration items of IP table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of IP table */ +export class VpnRpcEnumIpTable +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** MAC table */ + public IpTable: VpnRpcEnumIpTableItem[] = []; + + /** Constructor for the 'VpnRpcEnumIpTable' class: Enumeration of IP table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 interface enumeration */ +export class VpnRpcEnumL3If +{ + /** Layer-3 switch name */ + public Name_str: string = ""; + + /** Layer-3 interface list */ + public L3IFList: VpnRpcL3If[] = []; + + /** Constructor for the 'VpnRpcEnumL3If' class: Layer-3 interface enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 switch enumeration item */ +export class VpnRpcEnumL3SwItem +{ + /** Name of the layer-3 switch */ + public Name_str: string = ""; + + /** Number of layer-3 switch virtual interfaces */ + public NumInterfaces_u32: number = 0; + + /** Number of routing tables */ + public NumTables_u32: number = 0; + + /** Activated flag */ + public Active_bool: boolean = false; + + /** Online flag */ + public Online_bool: boolean = false; + + /** Constructor for the 'VpnRpcEnumL3SwItem' class: Layer-3 switch enumeration item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 switch enumeration */ +export class VpnRpcEnumL3Sw +{ + /** Layer-3 switch list */ + public L3SWList: VpnRpcEnumL3SwItem[] = []; + + /** Constructor for the 'VpnRpcEnumL3Sw' class: Layer-3 switch enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Routing table enumeration */ +export class VpnRpcEnumL3Table +{ + /** L3 switch name */ + public Name_str: string = ""; + + /** Routing table item list */ + public L3Table: VpnRpcL3Table[] = []; + + /** Constructor for the 'VpnRpcEnumL3Table' class: Routing table enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Cascade Connection Enumeration */ +export class VpnRpcEnumLinkItem +{ + /** The name of cascade connection */ + public AccountName_utf: string = ""; + + /** Online flag */ + public Online_bool: boolean = false; + + /** The flag indicates whether the cascade connection is established */ + public Connected_bool: boolean = false; + + /** The error last occurred if the cascade connection is in the fail state */ + public LastError_u32: number = 0; + + /** Connection completion time */ + public ConnectedTime_dt: Date = new Date(); + + /** Host name of the destination VPN server */ + public Hostname_str: string = ""; + + /** The Virtual Hub name */ + public TargetHubName_str: string = ""; + + /** Constructor for the 'VpnRpcEnumLinkItem' class: Cascade Connection Enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of the link */ +export class VpnRpcEnumLink +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Number of cascade connections */ + public NumLink_u32: number = 0; + + /** The list of cascade connections */ + public LinkList: VpnRpcEnumLinkItem[] = []; + + /** Constructor for the 'VpnRpcEnumLink' class: Enumeration of the link */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** List of listeners item */ +export class VpnRpcListenerListItem +{ + /** TCP port number (range: 1 - 65535) */ + public Ports_u32: number = 0; + + /** Active state */ + public Enables_bool: boolean = false; + + /** The flag to indicate if the error occurred on the listener port */ + public Errors_bool: boolean = false; + + /** Constructor for the 'VpnRpcListenerListItem' class: List of listeners item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** List of listeners */ +export class VpnRpcListenerList +{ + /** List of listener items */ + public ListenerList: VpnRpcListenerListItem[] = []; + + /** Constructor for the 'VpnRpcListenerList' class: List of listeners */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Local Bridge enumeration */ +export class VpnRpcEnumLocalBridge +{ + /** Local Bridge list */ + public LocalBridgeList: VpnRpcLocalBridge[] = []; + + /** Constructor for the 'VpnRpcEnumLocalBridge' class: Local Bridge enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Log file enumeration */ +export class VpnRpcEnumLogFileItem +{ + /** Server name */ + public ServerName_str: string = ""; + + /** File path */ + public FilePath_str: string = ""; + + /** File size */ + public FileSize_u32: number = 0; + + /** Last write date */ + public UpdatedTime_dt: Date = new Date(); + + /** Constructor for the 'VpnRpcEnumLogFileItem' class: Log file enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Log file enumeration */ +export class VpnRpcEnumLogFile +{ + /** Log file list */ + public LogFiles: VpnRpcEnumLogFileItem[] = []; + + /** Constructor for the 'VpnRpcEnumLogFile' class: Log file enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration items of the MAC table */ +export class VpnRpcEnumMacTableItem +{ + /** Key ID */ + public Key_u32: number = 0; + + /** Session name */ + public SessionName_str: string = ""; + + /** MAC address */ + public MacAddress_bin: Uint8Array = new Uint8Array([]); + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Updating date */ + public UpdatedTime_dt: Date = new Date(); + + /** Remote items */ + public RemoteItem_bool: boolean = false; + + /** Remote host name */ + public RemoteHostname_str: string = ""; + + /** VLAN ID */ + public VlanId_u32: number = 0; + + /** Constructor for the 'VpnRpcEnumMacTableItem' class: Enumeration items of the MAC table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of the MAC table */ +export class VpnRpcEnumMacTable +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** MAC table */ + public MacTable: VpnRpcEnumMacTableItem[] = []; + + /** Constructor for the 'VpnRpcEnumMacTable' class: Enumeration of the MAC table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** NAT Entry Protocol Number */ +export enum VpnRpcNatProtocol +{ + /** TCP */ + TCP = 0, + + /** UDP */ + UDP = 1, + + /** DNS */ + DNS = 2, + + /** ICMP */ + ICMP = 3, + +} + +/** State of NAT session (TCP) */ +export enum VpnRpcNatTcpState +{ + /** Connecting */ + Connecting = 0, + + /** Send the RST (Connection failure or disconnected) */ + SendReset = 1, + + /** Connection complete */ + Connected = 2, + + /** Connection established */ + Established = 3, + + /** Wait for socket disconnection */ + WaitDisconnect = 4, + +} + +/** VpnRpcEnumNat List Item */ +export class VpnRpcEnumNatItem +{ + /** ID */ + public Id_u32: number = 0; + + /** Protocol */ + public Protocol_u32: VpnRpcNatProtocol = 0; + + /** Source IP address */ + public SrcIp_ip: string = ""; + + /** Source host name */ + public SrcHost_str: string = ""; + + /** Source port number */ + public SrcPort_u32: number = 0; + + /** Destination IP address */ + public DestIp_ip: string = ""; + + /** Destination host name */ + public DestHost_str: string = ""; + + /** Destination port number */ + public DestPort_u32: number = 0; + + /** Connection time */ + public CreatedTime_dt: Date = new Date(); + + /** Last communication time */ + public LastCommTime_dt: Date = new Date(); + + /** Transmission size */ + public SendSize_u64: number = 0; + + /** Receive size */ + public RecvSize_u64: number = 0; + + /** TCP state */ + public TcpStatus_u32: VpnRpcNatTcpState = 0; + + /** Constructor for the 'VpnRpcEnumNatItem' class: VpnRpcEnumNat List Item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RPC_ENUM_NAT */ +export class VpnRpcEnumNat +{ + /** Virtual Hub Name */ + public HubName_str: string = ""; + + /** NAT item */ + public NatTable: VpnRpcEnumNatItem[] = []; + + /** Constructor for the 'VpnRpcEnumNat' class: RPC_ENUM_NAT */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration item of VPN session */ +export class VpnRpcEnumSessionItem +{ + /** Session name */ + public Name_str: string = ""; + + /** Remote session */ + public RemoteSession_bool: boolean = false; + + /** Remote server name */ + public RemoteHostname_str: string = ""; + + /** User name */ + public Username_str: string = ""; + + /** IP address */ + public ClientIP_ip: string = ""; + + /** Host name */ + public Hostname_str: string = ""; + + /** Maximum number of underlying TCP connections */ + public MaxNumTcp_u32: number = 0; + + /** Number of current underlying TCP connections */ + public CurrentNumTcp_u32: number = 0; + + /** Packet size transmitted */ + public PacketSize_u64: number = 0; + + /** Number of packets transmitted */ + public PacketNum_u64: number = 0; + + /** Is a Cascade VPN session */ + public LinkMode_bool: boolean = false; + + /** Is a SecureNAT VPN session */ + public SecureNATMode_bool: boolean = false; + + /** Is the VPN session for Local Bridge */ + public BridgeMode_bool: boolean = false; + + /** Is a Layer-3 Switch VPN session */ + public Layer3Mode_bool: boolean = false; + + /** Is in Bridge Mode */ + public Client_BridgeMode_bool: boolean = false; + + /** Is in Monitor Mode */ + public Client_MonitorMode_bool: boolean = false; + + /** VLAN ID */ + public VLanId_u32: number = 0; + + /** Unique ID of the VPN Session */ + public UniqueId_bin: Uint8Array = new Uint8Array([]); + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Last communication date and time */ + public LastCommTime_dt: Date = new Date(); + + /** Constructor for the 'VpnRpcEnumSessionItem' class: Enumeration item of VPN session */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumerate VPN sessions */ +export class VpnRpcEnumSession +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** VPN sessions list */ + public SessionList: VpnRpcEnumSessionItem[] = []; + + /** Constructor for the 'VpnRpcEnumSession' class: Enumerate VPN sessions */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration item of user */ +export class VpnRpcEnumUserItem +{ + /** User name */ + public Name_str: string = ""; + + /** Group name */ + public GroupName_str: string = ""; + + /** Real name */ + public Realname_utf: string = ""; + + /** Note */ + public Note_utf: string = ""; + + /** Authentication method */ + public AuthType_u32: VpnRpcUserAuthType = 0; + + /** Number of logins */ + public NumLogin_u32: number = 0; + + /** Last login date and time */ + public LastLoginTime_dt: Date = new Date(); + + /** Access denied */ + public DenyAccess_bool: boolean = false; + + /** Flag of whether the traffic variable is set */ + public IsTrafficFilled_bool: boolean = false; + + /** Flag of whether expiration date variable is set */ + public IsExpiresFilled_bool: boolean = false; + + /** Expiration date */ + public Expires_dt: Date = new Date(); + + /** Number of broadcast packets (Recv) */ + public ["Ex.Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Ex.Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Ex.Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Ex.Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Ex.Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Ex.Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Ex.Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Ex.Send.UnicastCount_u64"]: number = 0; + + /** Constructor for the 'VpnRpcEnumUserItem' class: Enumeration item of user */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of user */ +export class VpnRpcEnumUser +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** User list */ + public UserList: VpnRpcEnumUserItem[] = []; + + /** Constructor for the 'VpnRpcEnumUser' class: Enumeration of user */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Source IP Address Limit List Item */ +export class VpnAc +{ + /** ID */ + public Id_u32: number = 0; + + /** Priority */ + public Priority_u32: number = 0; + + /** Deny access */ + public Deny_bool: boolean = false; + + /** Set true if you want to specify the SubnetMask_ip item. */ + public Masked_bool: boolean = false; + + /** IP address */ + public IpAddress_ip: string = ""; + + /** Subnet mask, valid only if Masked_bool == true */ + public SubnetMask_ip: string = ""; + + /** Constructor for the 'VpnAc' class: Source IP Address Limit List Item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Source IP Address Limit List */ +export class VpnRpcAcList +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Source IP Address Limit List */ + public ACList: VpnAc[] = []; + + /** Constructor for the 'VpnRpcAcList' class: Source IP Address Limit List */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Message */ +export class VpnRpcMsg +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Message (Unicode strings acceptable) */ + public Msg_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcMsg' class: Message */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Get / Set the Azure state */ +export class VpnRpcAzureStatus +{ + /** Whether VPN Azure Function is Enabled */ + public IsEnabled_bool: boolean = false; + + /** Whether connection to VPN Azure Cloud Server is established */ + public IsConnected_bool: boolean = false; + + /** Constructor for the 'VpnRpcAzureStatus' class: Get / Set the Azure state */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Local Bridge support information */ +export class VpnRpcBridgeSupport +{ + /** Whether the OS supports the Local Bridge function */ + public IsBridgeSupportedOs_bool: boolean = false; + + /** Whether WinPcap is necessary to install */ + public IsWinPcapNeeded_bool: boolean = false; + + /** Constructor for the 'VpnRpcBridgeSupport' class: Local Bridge support information */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Get the CA of HUB */ +export class VpnRpcHubGetCA +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The key id of the certificate */ + public Key_u32: number = 0; + + /** The body of the X.509 certificate */ + public Cert_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcHubGetCA' class: Get the CA of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Caps item of the VPN Server */ +export class VpnCaps +{ + /** Name */ + public CapsName_str: string = ""; + + /** Value */ + public CapsValue_u32: number = 0; + + /** Descrption */ + public CapsDescrption_utf: string = ""; + + /** Constructor for the 'VpnCaps' class: Caps item of the VPN Server */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Caps list of the VPN Server */ +export class VpnCapslist +{ + /** Caps list of the VPN Server */ + public CapsList: VpnCaps[] = []; + + /** Constructor for the 'VpnCapslist' class: Caps list of the VPN Server */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Config operation */ +export class VpnRpcConfig +{ + /** File name (valid only for returning from the server) */ + public FileName_str: string = ""; + + /** File data */ + public FileData_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcConfig' class: Config operation */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Connection information */ +export class VpnRpcConnectionInfo +{ + /** Connection name */ + public Name_str: string = ""; + + /** Type */ + public Type_u32: VpnRpcConnectionType = 0; + + /** Host name */ + public Hostname_str: string = ""; + + /** IP address */ + public Ip_ip: string = ""; + + /** Port number */ + public Port_u32: number = 0; + + /** Connected time */ + public ConnectedTime_dt: Date = new Date(); + + /** Server string */ + public ServerStr_str: string = ""; + + /** Server version */ + public ServerVer_u32: number = 0; + + /** Server build number */ + public ServerBuild_u32: number = 0; + + /** Client string */ + public ClientStr_str: string = ""; + + /** Client version */ + public ClientVer_u32: number = 0; + + /** Client build number */ + public ClientBuild_u32: number = 0; + + /** Constructor for the 'VpnRpcConnectionInfo' class: Connection information */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Proxy type */ +export enum VpnRpcProxyType +{ + /** Direct TCP connection */ + Direct = 0, + + /** Connection via HTTP proxy server */ + HTTP = 1, + + /** Connection via SOCKS proxy server */ + SOCKS = 2, + +} + +/** The current status of the DDNS */ +export class VpnDDnsClientStatus +{ + /** Last error code (IPv4) */ + public Err_IPv4_u32: number = 0; + + /** Last error string (IPv4) */ + public ErrStr_IPv4_utf: string = ""; + + /** Last error code (IPv6) */ + public Err_IPv6_u32: number = 0; + + /** Last error string (IPv6) */ + public ErrStr_IPv6_utf: string = ""; + + /** Current DDNS host name */ + public CurrentHostName_str: string = ""; + + /** Current FQDN of the DDNS hostname */ + public CurrentFqdn_str: string = ""; + + /** DDNS suffix */ + public DnsSuffix_str: string = ""; + + /** Current IPv4 address of the VPN Server */ + public CurrentIPv4_str: string = ""; + + /** Current IPv6 address of the VPN Server */ + public CurrentIPv6_str: string = ""; + + /** Constructor for the 'VpnDDnsClientStatus' class: The current status of the DDNS */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Internet connection settings */ +export class VpnInternetSetting +{ + /** Type of proxy server */ + public ProxyType_u32: VpnRpcProxyType = 0; + + /** Proxy server host name */ + public ProxyHostName_str: string = ""; + + /** Proxy server port number */ + public ProxyPort_u32: number = 0; + + /** Proxy server user name */ + public ProxyUsername_str: string = ""; + + /** Proxy server password */ + public ProxyPassword_str: string = ""; + + /** Constructor for the 'VpnInternetSetting' class: Internet connection settings */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Administration options */ +export class VpnAdminOption +{ + /** Name */ + public Name_str: string = ""; + + /** Data */ + public Value_u32: number = 0; + + /** Descrption */ + public Descrption_utf: string = ""; + + /** Constructor for the 'VpnAdminOption' class: Administration options */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Administration options list */ +export class VpnRpcAdminOption +{ + /** Virtual HUB name */ + public HubName_str: string = ""; + + /** List data */ + public AdminOptionList: VpnAdminOption[] = []; + + /** Constructor for the 'VpnRpcAdminOption' class: Administration options list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Connection state to the controller */ +export class VpnRpcFarmConnectionStatus +{ + /** IP address */ + public Ip_ip: string = ""; + + /** Port number */ + public Port_u32: number = 0; + + /** Online state */ + public Online_bool: boolean = false; + + /** Last error code */ + public LastError_u32: number = 0; + + /** Connection start time */ + public StartedTime_dt: Date = new Date(); + + /** First connection time */ + public FirstConnectedTime_dt: Date = new Date(); + + /** Connection time of this time */ + public CurrentConnectedTime_dt: Date = new Date(); + + /** Number of retries */ + public NumTry_u32: number = 0; + + /** Number of connection count */ + public NumConnected_u32: number = 0; + + /** Connection failure count */ + public NumFailed_u32: number = 0; + + /** Constructor for the 'VpnRpcFarmConnectionStatus' class: Connection state to the controller */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** HUB item of each farm member */ +export class VpnRpcFarmHub +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Dynamic HUB */ + public DynamicHub_bool: boolean = false; + + /** Constructor for the 'VpnRpcFarmHub' class: HUB item of each farm member */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server farm member information acquisition */ +export class VpnRpcFarmInfo +{ + /** ID */ + public Id_u32: number = 0; + + /** The flag if the server is Cluster Controller (false: Cluster Member servers) */ + public Controller_bool: boolean = false; + + /** Connection Established Time */ + public ConnectedTime_dt: Date = new Date(); + + /** IP address */ + public Ip_ip: string = ""; + + /** Host name */ + public Hostname_str: string = ""; + + /** Point */ + public Point_u32: number = 0; + + /** Number of Public Ports */ + public NumPort_u32: number = 0; + + /** Public Ports */ + public Ports_u32: number[] = []; + + /** Server certificate */ + public ServerCert_bin: Uint8Array = new Uint8Array([]); + + /** Number of farm HUB */ + public NumFarmHub_u32: number = 0; + + /** The hosted Virtual Hub list */ + public HubsList: VpnRpcFarmHub[] = []; + + /** Number of hosted VPN sessions */ + public NumSessions_u32: number = 0; + + /** Number of TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Performance Standard Ratio */ + public Weight_u32: number = 0; + + /** Constructor for the 'VpnRpcFarmInfo' class: Server farm member information acquisition */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server farm configuration */ +export class VpnRpcFarm +{ + /** Type of server */ + public ServerType_u32: VpnRpcServerType = 0; + + /** Valid only for Cluster Member servers. Number of the Ports_u32 element. */ + public NumPort_u32: number = 0; + + /** Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers. */ + public Ports_u32: number[] = []; + + /** Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used. */ + public PublicIp_ip: string = ""; + + /** Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. */ + public ControllerName_str: string = ""; + + /** Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. */ + public ControllerPort_u32: number = 0; + + /** Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller. */ + public MemberPasswordPlaintext_str: string = ""; + + /** This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used. */ + public Weight_u32: number = 0; + + /** Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments. */ + public ControllerOnly_bool: boolean = false; + + /** Constructor for the 'VpnRpcFarm' class: Server farm configuration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Log switch type */ +export enum VpnRpcLogSwitchType +{ + /** No switching */ + No = 0, + + /** Secondly basis */ + Second = 1, + + /** Minutely basis */ + Minute = 2, + + /** Hourly basis */ + Hour = 3, + + /** Daily basis */ + Day = 4, + + /** Monthly basis */ + Month = 5, + +} + +/** Packet log settings */ +export enum VpnRpcPacketLogSetting +{ + /** Not save */ + None = 0, + + /** Only header */ + Header = 1, + + /** All payloads */ + All = 2, + +} + +/** Packet log settings array index */ +export enum VpnRpcPacketLogSettingIndex +{ + /** TCP connection log */ + TcpConnection = 0, + + /** TCP packet log */ + TcpAll = 1, + + /** DHCP Log */ + Dhcp = 2, + + /** UDP log */ + Udp = 3, + + /** ICMP log */ + Icmp = 4, + + /** IP log */ + Ip = 5, + + /** ARP log */ + Arp = 6, + + /** Ethernet log */ + Ethernet = 7, + +} + +/** HUB log settings */ +export class VpnRpcHubLog +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The flag to enable / disable saving the security log */ + public SaveSecurityLog_bool: boolean = false; + + /** The log filename switching setting of the security log */ + public SecurityLogSwitchType_u32: VpnRpcLogSwitchType = 0; + + /** The flag to enable / disable saving the security log */ + public SavePacketLog_bool: boolean = false; + + /** The log filename switching settings of the packet logs */ + public PacketLogSwitchType_u32: VpnRpcLogSwitchType = 0; + + /** Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7. */ + public PacketLogConfig_u32: VpnRpcPacketLogSetting[] = []; + + /** Constructor for the 'VpnRpcHubLog' class: HUB log settings */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RADIUS server options */ +export class VpnRpcRadius +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** RADIUS server name */ + public RadiusServerName_str: string = ""; + + /** RADIUS port number */ + public RadiusPort_u32: number = 0; + + /** Secret key */ + public RadiusSecret_str: string = ""; + + /** Radius retry interval */ + public RadiusRetryInterval_u32: number = 0; + + /** Constructor for the 'VpnRpcRadius' class: RADIUS server options */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Get the state HUB */ +export class VpnRpcHubStatus +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Online */ + public Online_bool: boolean = false; + + /** Type of HUB */ + public HubType_u32: VpnRpcHubType = 0; + + /** Number of sessions */ + public NumSessions_u32: number = 0; + + /** Number of sessions (client mode) */ + public NumSessionsClient_u32: number = 0; + + /** Number of sessions (bridge mode) */ + public NumSessionsBridge_u32: number = 0; + + /** Number of Access list entries */ + public NumAccessLists_u32: number = 0; + + /** Number of users */ + public NumUsers_u32: number = 0; + + /** Number of groups */ + public NumGroups_u32: number = 0; + + /** Number of MAC table entries */ + public NumMacTables_u32: number = 0; + + /** Number of IP table entries */ + public NumIpTables_u32: number = 0; + + /** Number of broadcast packets (Recv) */ + public ["Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastCount_u64"]: number = 0; + + /** Whether SecureNAT is enabled */ + public SecureNATEnabled_bool: boolean = false; + + /** Last communication date and time */ + public LastCommTime_dt: Date = new Date(); + + /** Last login date and time */ + public LastLoginTime_dt: Date = new Date(); + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Number of logins */ + public NumLogin_u32: number = 0; + + /** Constructor for the 'VpnRpcHubStatus' class: Get the state HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** List of services provided by IPsec server */ +export class VpnIPsecServices +{ + /** Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. */ + public L2TP_Raw_bool: boolean = false; + + /** Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option. */ + public L2TP_IPsec_bool: boolean = false; + + /** Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging. */ + public EtherIP_IPsec_bool: boolean = false; + + /** Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters. */ + public IPsec_Secret_str: string = ""; + + /** Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. */ + public L2TP_DefaultHub_str: string = ""; + + /** Constructor for the 'VpnIPsecServices' class: List of services provided by IPsec server */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Keep alive protocol */ +export enum VpnRpcKeepAliveProtocol +{ + /** TCP */ + TCP = 0, + + /** UDP */ + UDP = 1, + +} + +/** Keep Alive settings */ +export class VpnRpcKeep +{ + /** The flag to enable keep-alive to the Internet */ + public UseKeepConnect_bool: boolean = false; + + /** Specify the host name or IP address of the destination */ + public KeepConnectHost_str: string = ""; + + /** Specify the port number of the destination */ + public KeepConnectPort_u32: number = 0; + + /** Protocol type */ + public KeepConnectProtocol_u32: VpnRpcKeepAliveProtocol = 0; + + /** Interval Between Packets Sends (Seconds) */ + public KeepConnectInterval_u32: number = 0; + + /** Constructor for the 'VpnRpcKeep' class: Keep Alive settings */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** State of the client session */ +export enum VpnRpcClientSessionStatus +{ + /** Connecting */ + Connecting = 0, + + /** Negotiating */ + Negotiation = 1, + + /** During user authentication */ + Auth = 2, + + /** Connection complete */ + Established = 3, + + /** Wait to retry */ + Retry = 4, + + /** Idle state */ + Idle = 5, + +} + +/** Get the link state */ +export class VpnRpcLinkStatus +{ + /** The Virtual Hub name */ + public HubName_Ex_str: string = ""; + + /** The name of the cascade connection */ + public AccountName_utf: string = ""; + + /** The flag whether the cascade connection is enabled */ + public Active_bool: boolean = false; + + /** The flag whether the cascade connection is established */ + public Connected_bool: boolean = false; + + /** The session status */ + public SessionStatus_u32: VpnRpcClientSessionStatus = 0; + + /** The destination VPN server name */ + public ServerName_str: string = ""; + + /** The port number of the server */ + public ServerPort_u32: number = 0; + + /** Server product name */ + public ServerProductName_str: string = ""; + + /** Server product version */ + public ServerProductVer_u32: number = 0; + + /** Server product build number */ + public ServerProductBuild_u32: number = 0; + + /** Server's X.509 certificate */ + public ServerX_bin: Uint8Array = new Uint8Array([]); + + /** Client certificate */ + public ClientX_bin: Uint8Array = new Uint8Array([]); + + /** Connection start time */ + public StartTime_dt: Date = new Date(); + + /** Connection completion time of the first connection */ + public FirstConnectionEstablisiedTime_dt: Date = new Date(); + + /** Connection completion time of this connection */ + public CurrentConnectionEstablishTime_dt: Date = new Date(); + + /** Number of connections have been established so far */ + public NumConnectionsEatablished_u32: number = 0; + + /** Half-connection */ + public HalfConnection_bool: boolean = false; + + /** VoIP / QoS */ + public QoS_bool: boolean = false; + + /** Maximum number of the underlying TCP connections */ + public MaxTcpConnections_u32: number = 0; + + /** Number of current underlying TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Number of underlying inbound TCP connections */ + public NumTcpConnectionsUpload_u32: number = 0; + + /** Number of underlying outbound TCP connections */ + public NumTcpConnectionsDownload_u32: number = 0; + + /** Use of encryption */ + public UseEncrypt_bool: boolean = false; + + /** Cipher algorithm name */ + public CipherName_str: string = ""; + + /** Use of compression */ + public UseCompress_bool: boolean = false; + + /** The flag whether this is a R-UDP session */ + public IsRUDPSession_bool: boolean = false; + + /** Underlying physical communication protocol */ + public UnderlayProtocol_str: string = ""; + + /** The UDP acceleration is enabled */ + public IsUdpAccelerationEnabled_bool: boolean = false; + + /** The UDP acceleration is being actually used */ + public IsUsingUdpAcceleration_bool: boolean = false; + + /** Session name */ + public SessionName_str: string = ""; + + /** Connection name */ + public ConnectionName_str: string = ""; + + /** Session key */ + public SessionKey_bin: Uint8Array = new Uint8Array([]); + + /** Total transmitted data size */ + public TotalSendSize_u64: number = 0; + + /** Total received data size */ + public TotalRecvSize_u64: number = 0; + + /** Total transmitted data size (no compression) */ + public TotalSendSizeReal_u64: number = 0; + + /** Total received data size (no compression) */ + public TotalRecvSizeReal_u64: number = 0; + + /** The flag whether the VPN session is Bridge Mode */ + public IsBridgeMode_bool: boolean = false; + + /** The flag whether the VPN session is Monitor mode */ + public IsMonitorMode_bool: boolean = false; + + /** VLAN ID */ + public VLanId_u32: number = 0; + + /** Constructor for the 'VpnRpcLinkStatus' class: Get the link state */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Setting of SSTP and OpenVPN */ +export class VpnOpenVpnSstpConfig +{ + /** Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. */ + public EnableOpenVPN_bool: boolean = false; + + /** Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. */ + public OpenVPNPortList_str: string = ""; + + /** pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. */ + public EnableSSTP_bool: boolean = false; + + /** Constructor for the 'VpnOpenVpnSstpConfig' class: Setting of SSTP and OpenVPN */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Virtual host option */ +export class VpnVhOption +{ + /** Target Virtual HUB name */ + public RpcHubName_str: string = ""; + + /** MAC address */ + public MacAddress_bin: Uint8Array = new Uint8Array([]); + + /** IP address */ + public Ip_ip: string = ""; + + /** Subnet mask */ + public Mask_ip: string = ""; + + /** Use flag of the Virtual NAT function */ + public UseNat_bool: boolean = false; + + /** MTU value (Standard: 1500) */ + public Mtu_u32: number = 0; + + /** NAT TCP timeout in seconds */ + public NatTcpTimeout_u32: number = 0; + + /** NAT UDP timeout in seconds */ + public NatUdpTimeout_u32: number = 0; + + /** Using flag of DHCP function */ + public UseDhcp_bool: boolean = false; + + /** Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) */ + public DhcpLeaseIPStart_ip: string = ""; + + /** Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) */ + public DhcpLeaseIPEnd_ip: string = ""; + + /** Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) */ + public DhcpSubnetMask_ip: string = ""; + + /** Specify the expiration date in second units for leasing an IP address to a client. */ + public DhcpExpireTimeSpan_u32: number = 0; + + /** Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway. */ + public DhcpGatewayAddress_ip: string = ""; + + /** Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. */ + public DhcpDnsServerAddress_ip: string = ""; + + /** Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. */ + public DhcpDnsServerAddress2_ip: string = ""; + + /** Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name. */ + public DhcpDomainName_str: string = ""; + + /** Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting. */ + public SaveLog_bool: boolean = false; + + /** The flag to enable the DhcpPushRoutes_str field. */ + public ApplyDhcpPushRoutes_bool: boolean = false; + + /** Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes. */ + public DhcpPushRoutes_str: string = ""; + + /** Constructor for the 'VpnVhOption' class: Virtual host option */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RPC_NAT_STATUS */ +export class VpnRpcNatStatus +{ + /** Virtual Hub Name */ + public HubName_str: string = ""; + + /** Number of TCP sessions */ + public NumTcpSessions_u32: number = 0; + + /** Ntmber of UDP sessions */ + public NumUdpSessions_u32: number = 0; + + /** Nymber of ICMP sessions */ + public NumIcmpSessions_u32: number = 0; + + /** Number of DNS sessions */ + public NumDnsSessions_u32: number = 0; + + /** Number of DHCP clients */ + public NumDhcpClients_u32: number = 0; + + /** Whether the NAT is operating in the Kernel Mode */ + public IsKernelMode_bool: boolean = false; + + /** Whether the NAT is operating in the Raw IP Mode */ + public IsRawIpMode_bool: boolean = false; + + /** Constructor for the 'VpnRpcNatStatus' class: RPC_NAT_STATUS */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Key pair */ +export class VpnRpcKeyPair +{ + /** The body of the certificate */ + public Cert_bin: Uint8Array = new Uint8Array([]); + + /** The body of the private key */ + public Key_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcKeyPair' class: Key pair */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Single string value */ +export class VpnRpcStr +{ + /** A string value */ + public String_str: string = ""; + + /** Constructor for the 'VpnRpcStr' class: Single string value */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Type of VPN Server */ +export enum VpnRpcServerType +{ + /** Stand-alone server */ + Standalone = 0, + + /** Farm controller server */ + FarmController = 1, + + /** Farm member server */ + FarmMember = 2, + +} + +/** Operating system type */ +export enum VpnRpcOsType +{ + /** Windows 95 */ + WINDOWS_95 = 1100, + + /** Windows 98 */ + WINDOWS_98 = 1200, + + /** Windows Me */ + WINDOWS_ME = 1300, + + /** Windows (unknown) */ + WINDOWS_UNKNOWN = 1400, + + /** Windows NT 4.0 Workstation */ + WINDOWS_NT_4_WORKSTATION = 2100, + + /** Windows NT 4.0 Server */ + WINDOWS_NT_4_SERVER = 2110, + + /** Windows NT 4.0 Server, Enterprise Edition */ + WINDOWS_NT_4_SERVER_ENTERPRISE = 2111, + + /** Windows NT 4.0 Terminal Server */ + WINDOWS_NT_4_TERMINAL_SERVER = 2112, + + /** BackOffice Server 4.5 */ + WINDOWS_NT_4_BACKOFFICE = 2113, + + /** Small Business Server 4.5 */ + WINDOWS_NT_4_SMS = 2114, + + /** Windows 2000 Professional */ + WINDOWS_2000_PROFESSIONAL = 2200, + + /** Windows 2000 Server */ + WINDOWS_2000_SERVER = 2211, + + /** Windows 2000 Advanced Server */ + WINDOWS_2000_ADVANCED_SERVER = 2212, + + /** Windows 2000 Datacenter Server */ + WINDOWS_2000_DATACENTER_SERVER = 2213, + + /** BackOffice Server 2000 */ + WINDOWS_2000_BACKOFFICE = 2214, + + /** Small Business Server 2000 */ + WINDOWS_2000_SBS = 2215, + + /** Windows XP Home Edition */ + WINDOWS_XP_HOME = 2300, + + /** Windows XP Professional */ + WINDOWS_XP_PROFESSIONAL = 2301, + + /** Windows Server 2003 Web Edition */ + WINDOWS_2003_WEB = 2410, + + /** Windows Server 2003 Standard Edition */ + WINDOWS_2003_STANDARD = 2411, + + /** Windows Server 2003 Enterprise Edition */ + WINDOWS_2003_ENTERPRISE = 2412, + + /** Windows Server 2003 DataCenter Edition */ + WINDOWS_2003_DATACENTER = 2413, + + /** BackOffice Server 2003 */ + WINDOWS_2003_BACKOFFICE = 2414, + + /** Small Business Server 2003 */ + WINDOWS_2003_SBS = 2415, + + /** Windows Vista */ + WINDOWS_LONGHORN_PROFESSIONAL = 2500, + + /** Windows Server 2008 */ + WINDOWS_LONGHORN_SERVER = 2510, + + /** Windows 7 */ + WINDOWS_7 = 2600, + + /** Windows Server 2008 R2 */ + WINDOWS_SERVER_2008_R2 = 2610, + + /** Windows 8 */ + WINDOWS_8 = 2700, + + /** Windows Server 2012 */ + WINDOWS_SERVER_8 = 2710, + + /** Windows 8.1 */ + WINDOWS_81 = 2701, + + /** Windows Server 2012 R2 */ + WINDOWS_SERVER_81 = 2711, + + /** Windows 10 */ + WINDOWS_10 = 2702, + + /** Windows Server 10 */ + WINDOWS_SERVER_10 = 2712, + + /** Windows 11 or later */ + WINDOWS_11 = 2800, + + /** Windows Server 11 or later */ + WINDOWS_SERVER_11 = 2810, + + /** Unknown UNIX */ + UNIX_UNKNOWN = 3000, + + /** Linux */ + LINUX = 3100, + + /** Solaris */ + SOLARIS = 3200, + + /** Cygwin */ + CYGWIN = 3300, + + /** BSD */ + BSD = 3400, + + /** MacOS X */ + MACOS_X = 3500, + +} + +/** VPN Server Information */ +export class VpnRpcServerInfo +{ + /** Server product name */ + public ServerProductName_str: string = ""; + + /** Server version string */ + public ServerVersionString_str: string = ""; + + /** Server build information string */ + public ServerBuildInfoString_str: string = ""; + + /** Server version integer value */ + public ServerVerInt_u32: number = 0; + + /** Server build number integer value */ + public ServerBuildInt_u32: number = 0; + + /** Server host name */ + public ServerHostName_str: string = ""; + + /** Type of server */ + public ServerType_u32: VpnRpcServerType = 0; + + /** Build date and time of the server */ + public ServerBuildDate_dt: Date = new Date(); + + /** Family name */ + public ServerFamilyName_str: string = ""; + + /** OS type */ + public OsType_u32: VpnRpcOsType = 0; + + /** Service pack number */ + public OsServicePack_u32: number = 0; + + /** OS system name */ + public OsSystemName_str: string = ""; + + /** OS product name */ + public OsProductName_str: string = ""; + + /** OS vendor name */ + public OsVendorName_str: string = ""; + + /** OS version */ + public OsVersion_str: string = ""; + + /** Kernel name */ + public KernelName_str: string = ""; + + /** Kernel version */ + public KernelVersion_str: string = ""; + + /** Constructor for the 'VpnRpcServerInfo' class: VPN Server Information */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server status */ +export class VpnRpcServerStatus +{ + /** Type of server */ + public ServerType_u32: VpnRpcServerType = 0; + + /** Total number of TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Number of Local TCP connections */ + public NumTcpConnectionsLocal_u32: number = 0; + + /** Number of remote TCP connections */ + public NumTcpConnectionsRemote_u32: number = 0; + + /** Total number of HUBs */ + public NumHubTotal_u32: number = 0; + + /** Nymber of stand-alone HUB */ + public NumHubStandalone_u32: number = 0; + + /** Number of static HUBs */ + public NumHubStatic_u32: number = 0; + + /** Number of Dynamic HUBs */ + public NumHubDynamic_u32: number = 0; + + /** Total number of sessions */ + public NumSessionsTotal_u32: number = 0; + + /** Number of local VPN sessions */ + public NumSessionsLocal_u32: number = 0; + + /** The number of remote sessions */ + public NumSessionsRemote_u32: number = 0; + + /** Number of MAC table entries (total sum of all Virtual Hubs) */ + public NumMacTables_u32: number = 0; + + /** Number of IP table entries (total sum of all Virtual Hubs) */ + public NumIpTables_u32: number = 0; + + /** Number of users (total sum of all Virtual Hubs) */ + public NumUsers_u32: number = 0; + + /** Number of groups (total sum of all Virtual Hubs) */ + public NumGroups_u32: number = 0; + + /** Number of assigned bridge licenses (Useful to make a commercial version) */ + public AssignedBridgeLicenses_u32: number = 0; + + /** Number of assigned client licenses (Useful to make a commercial version) */ + public AssignedClientLicenses_u32: number = 0; + + /** Number of Assigned bridge license (cluster-wide), useful to make a commercial version */ + public AssignedBridgeLicensesTotal_u32: number = 0; + + /** Number of assigned client licenses (cluster-wide), useful to make a commercial version */ + public AssignedClientLicensesTotal_u32: number = 0; + + /** Number of broadcast packets (Recv) */ + public ["Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastCount_u64"]: number = 0; + + /** Current time */ + public CurrentTime_dt: Date = new Date(); + + /** 64 bit High-Precision Logical System Clock */ + public CurrentTick_u64: number = 0; + + /** VPN Server Start-up time */ + public StartTime_dt: Date = new Date(); + + /** Memory information: Total Memory */ + public TotalMemory_u64: number = 0; + + /** Memory information: Used Memory */ + public UsedMemory_u64: number = 0; + + /** Memory information: Free Memory */ + public FreeMemory_u64: number = 0; + + /** Memory information: Total Phys */ + public TotalPhys_u64: number = 0; + + /** Memory information: Used Phys */ + public UsedPhys_u64: number = 0; + + /** Memory information: Free Phys */ + public FreePhys_u64: number = 0; + + /** Constructor for the 'VpnRpcServerStatus' class: Server status */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** VPN Session status */ +export class VpnRpcSessionStatus +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** VPN session name */ + public Name_str: string = ""; + + /** User name */ + public Username_str: string = ""; + + /** Real user name which was used for the authentication */ + public RealUsername_str: string = ""; + + /** Group name */ + public GroupName_str: string = ""; + + /** Is Cascade Session */ + public LinkMode_bool: boolean = false; + + /** Client IP address */ + public Client_Ip_Address_ip: string = ""; + + /** Client host name */ + public SessionStatus_ClientHostName_str: string = ""; + + /** Operation flag */ + public Active_bool: boolean = false; + + /** Connected flag */ + public Connected_bool: boolean = false; + + /** State of the client session */ + public SessionStatus_u32: VpnRpcClientSessionStatus = 0; + + /** Server name */ + public ServerName_str: string = ""; + + /** Port number of the server */ + public ServerPort_u32: number = 0; + + /** Server product name */ + public ServerProductName_str: string = ""; + + /** Server product version */ + public ServerProductVer_u32: number = 0; + + /** Server product build number */ + public ServerProductBuild_u32: number = 0; + + /** Connection start time */ + public StartTime_dt: Date = new Date(); + + /** Connection completion time of the first connection */ + public FirstConnectionEstablisiedTime_dt: Date = new Date(); + + /** Connection completion time of this connection */ + public CurrentConnectionEstablishTime_dt: Date = new Date(); + + /** Number of connections have been established so far */ + public NumConnectionsEatablished_u32: number = 0; + + /** Half-connection */ + public HalfConnection_bool: boolean = false; + + /** VoIP / QoS */ + public QoS_bool: boolean = false; + + /** Maximum number of the underlying TCP connections */ + public MaxTcpConnections_u32: number = 0; + + /** Number of current underlying TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Number of inbound underlying connections */ + public NumTcpConnectionsUpload_u32: number = 0; + + /** Number of outbound underlying connections */ + public NumTcpConnectionsDownload_u32: number = 0; + + /** Use of encryption */ + public UseEncrypt_bool: boolean = false; + + /** Cipher algorithm name */ + public CipherName_str: string = ""; + + /** Use of compression */ + public UseCompress_bool: boolean = false; + + /** Is R-UDP session */ + public IsRUDPSession_bool: boolean = false; + + /** Physical underlying communication protocol */ + public UnderlayProtocol_str: string = ""; + + /** The UDP acceleration is enabled */ + public IsUdpAccelerationEnabled_bool: boolean = false; + + /** Using the UDP acceleration function */ + public IsUsingUdpAcceleration_bool: boolean = false; + + /** VPN session name */ + public SessionName_str: string = ""; + + /** Connection name */ + public ConnectionName_str: string = ""; + + /** Session key */ + public SessionKey_bin: Uint8Array = new Uint8Array([]); + + /** Total transmitted data size */ + public TotalSendSize_u64: number = 0; + + /** Total received data size */ + public TotalRecvSize_u64: number = 0; + + /** Total transmitted data size (no compression) */ + public TotalSendSizeReal_u64: number = 0; + + /** Total received data size (no compression) */ + public TotalRecvSizeReal_u64: number = 0; + + /** Is Bridge Mode */ + public IsBridgeMode_bool: boolean = false; + + /** Is Monitor mode */ + public IsMonitorMode_bool: boolean = false; + + /** VLAN ID */ + public VLanId_u32: number = 0; + + /** Client product name */ + public ClientProductName_str: string = ""; + + /** Client version */ + public ClientProductVer_u32: number = 0; + + /** Client build number */ + public ClientProductBuild_u32: number = 0; + + /** Client OS name */ + public ClientOsName_str: string = ""; + + /** Client OS version */ + public ClientOsVer_str: string = ""; + + /** Client OS Product ID */ + public ClientOsProductId_str: string = ""; + + /** Client host name */ + public ClientHostname_str: string = ""; + + /** Unique ID */ + public UniqueId_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcSessionStatus' class: VPN Session status */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Set the special listener */ +export class VpnRpcSpecialListener +{ + /** The flag to activate the VPN over ICMP server function */ + public VpnOverIcmpListener_bool: boolean = false; + + /** The flag to activate the VPN over DNS function */ + public VpnOverDnsListener_bool: boolean = false; + + /** Constructor for the 'VpnRpcSpecialListener' class: Set the special listener */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Syslog configuration */ +export enum VpnSyslogSaveType +{ + /** Do not use syslog */ + None = 0, + + /** Only server log */ + ServerLog = 1, + + /** Server and Virtual HUB security log */ + ServerAndHubSecurityLog = 2, + + /** Server, Virtual HUB security, and packet log */ + ServerAndHubAllLog = 3, + +} + +/** Syslog configuration */ +export class VpnSyslogSetting +{ + /** The behavior of the syslog function */ + public SaveType_u32: VpnSyslogSaveType = 0; + + /** Specify the host name or IP address of the syslog server */ + public Hostname_str: string = ""; + + /** Specify the port number of the syslog server */ + public Port_u32: number = 0; + + /** Constructor for the 'VpnSyslogSetting' class: Syslog configuration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** VPN Gate Server Config */ +export class VpnVgsConfig +{ + /** Active flag */ + public IsEnabled_bool: boolean = false; + + /** Message */ + public Message_utf: string = ""; + + /** Owner name */ + public Owner_utf: string = ""; + + /** Abuse email */ + public Abuse_utf: string = ""; + + /** Log save flag */ + public NoLog_bool: boolean = false; + + /** Save log permanently */ + public LogPermanent_bool: boolean = false; + + /** Enable the L2TP VPN function */ + public EnableL2TP_bool: boolean = false; + + /** Constructor for the 'VpnVgsConfig' class: VPN Gate Server Config */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Read a Log file */ +export class VpnRpcReadLogFile +{ + /** Server name */ + public ServerName_str: string = ""; + + /** File Path */ + public FilePath_str: string = ""; + + /** Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field. */ + public Offset_u32: number = 0; + + /** Received buffer */ + public Buffer_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcReadLogFile' class: Read a Log file */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Rename link */ +export class VpnRpcRenameLink +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The old name of the cascade connection */ + public OldAccountName_utf: string = ""; + + /** The new name of the cascade connection */ + public NewAccountName_utf: string = ""; + + /** Constructor for the 'VpnRpcRenameLink' class: Rename link */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Online or offline the HUB */ +export class VpnRpcSetHubOnline +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Online / offline flag */ + public Online_bool: boolean = false; + + /** Constructor for the 'VpnRpcSetHubOnline' class: Online or offline the HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Set Password */ +export class VpnRpcSetPassword +{ + /** The plaintext password */ + public PlainTextPassword_str: string = ""; + + /** Constructor for the 'VpnRpcSetPassword' class: Set Password */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + + + + + +// --- Utility codes --- + +/** JSON-RPC request class. See https://www.jsonrpc.org/specification */ +export class JsonRpcRequest +{ + public jsonrpc: string = "2.0"; + public method: string; + public params: any; + public id: string; + + constructor(method: string = "", param: any = null, id: string = "") + { + this.method = method; + this.params = param; + this.id = id; + } +} + +/** JSON-RPC error class. See https://www.jsonrpc.org/specification */ +export class JsonRpcError +{ + public code: number; + public message: string; + public data: any; + + constructor(code: number = 0, message: string = "", data: any = null) + { + this.code = code; + this.message = message; + this.data = data; + } +} + +/** JSON-RPC response class with generics */ +export class JsonRpcResponse +{ + public jsonrpc: string = "2.0"; + public result: TResult = null!; + public error: JsonRpcError = null!; + public id: string = ""; +} + +/** JSON-RPC client class. See https://www.jsonrpc.org/specification */ +export class JsonRpcClient +{ + /** A utility function to convert any object to JSON string */ + public static ObjectToJson(obj: any): string + { + return JSON.stringify(obj, + (key, value) => + { + if (key.endsWith("_bin")) + { + return Util_Base64_Encode(value); + } + return value; + } + , 4); + } + + /** A utility function to convert JSON string to object */ + public static JsonToObject(str: string): any + { + return JSON.parse(str, + (key, value) => + { + if (key.endsWith("_bin")) + { + return Util_Base64_Decode(value); + } + else if (key.endsWith("_dt")) + { + return new Date(value); + } + return value; + }); + } + + /** Base URL */ + public BaseUrl: string; + + /** The instance of HTTP client */ + private client: HttpClient; + + /** Additional HTTP headers */ + private headers: { [name: string]: string }; + + /** + * JSON-RPC client class constructor + * @param url The URL + * @param headers Additional HTTP headers + * @param send_credential Set true to use the same credential with the browsing web site. Valid only if the code is running on the web browser. + */ + constructor(url: string, headers: { [name: string]: string }, send_credential: boolean, nodejs_https_client_reject_untrusted_server_cert: boolean) + { + this.BaseUrl = url; + this.headers = headers; + + this.client = new HttpClient(); + this.client.SendCredential = send_credential; + this.client.NodeJS_HTTPS_Client_Reject_Unauthorized = nodejs_https_client_reject_untrusted_server_cert; + } + + /** + * Call a single RPC call (without error check). You can wait for the response with Promise or await statement. + * @param method_name The name of RPC method + * @param param The parameters + */ + public async CallInternalAsync(method_name: string, param: any): Promise + { + let id = "1"; + + let req = new JsonRpcRequest(method_name, param, id); + + let req_string = JsonRpcClient.ObjectToJson(req); + + if (debug_mode) + { + console.log("--- RPC Request Body ---"); + console.log(req_string); + console.log("------------------------"); + } + + let http_response = await this.client.PostAsync(this.BaseUrl, this.headers, + req_string, "application/json"); + + let ret_string = http_response.Body; + + if (debug_mode) + { + console.log("--- RPC Response Body ---"); + console.log(ret_string); + console.log("-------------------------"); + } + + return ret_string; + } + + /** + * Call a single RPC call (with error check). You can wait for the response with Promise or await statement. In the case of error, it will be thrown. + * @param method_name The name of RPC method + * @param param The parameters + */ + public async CallAsync(method_name: string, param: any): Promise + { + let ret_string = await this.CallInternalAsync(method_name, param); + + let ret: JsonRpcResponse = JSON.parse(ret_string); + + if (is_null(ret.error) === false) + { + throw new JsonRpcException(ret.error); + } + + return ret.result; + } +} + +/** JSON-RPC exception class */ +export class JsonRpcException extends Error +{ + public Error: JsonRpcError; + + constructor(error: JsonRpcError) + { + super(`Code=${error.code}, Message=${error.message}`); + this.Error = error; + } +} + +/** HTTP client exception class */ +export class HttpClientException extends Error +{ + constructor(message: string) + { + super(message); + } +} + +/** HTTP client response class */ +export class HttpClientResponse +{ + public Body: string = ""; +} + +/** An HTTP client which can be used in both web browsers and Node.js */ +export class HttpClient +{ + public TimeoutMsecs: number = 60 * 5 * 1000; + public SendCredential: boolean = true; + public NodeJS_HTTPS_Client_Reject_Unauthorized: boolean = false; + + /** Post method. In web browsers this function will process the request by itself. In Node.js this function will call PostAsync_NodeJS() instead. */ + public async PostAsync(url: string, headers: { [name: string]: string }, + req_body: string, req_media_type: string): Promise + { + if (is_node_js) + { + return this.PostAsync_NodeJS(url, headers, req_body, req_media_type); + } + + let fetch_header_list = new Headers(); + + for (let name of Object.keys(headers)) + { + fetch_header_list.append(name, headers[name]); + } + + let fetch_init: RequestInit = + { + mode: "cors", + headers: fetch_header_list, + credentials: (this.SendCredential ? "include" : "omit"), + method: "POST", + cache: "no-cache", + keepalive: true, + redirect: "follow", + body: req_body, + }; + + let fetch_response = await fetch(url, fetch_init); + + if (fetch_response.ok === false) + { + throw new HttpClientException("HTTP Error: " + fetch_response.status + " " + fetch_response.statusText); + } + + let ret = new HttpClientResponse(); + + ret.Body = await fetch_response.text(); + + return ret; + } + + /** Post method for Node.js. */ + public PostAsync_NodeJS(url: string, headers: { [name: string]: string }, + req_body: string, req_media_type: string): Promise + { + const https = require("https"); + const keepAliveAgent = new https.Agent({ keepAlive: true }); + const urlparse = require("url"); + + const urlobj = urlparse.parse(url); + + if (is_null(urlobj.host)) throw new Error("URL is invalid."); + + let options = + { + host: urlobj.hostname, + port: urlobj.port, + path: urlobj.path, + rejectUnauthorized: this.NodeJS_HTTPS_Client_Reject_Unauthorized, + method: "POST", + timeout: this.TimeoutMsecs, + agent: keepAliveAgent, + }; + + return new Promise(function (resolve, reject) + { + let req = https.request(options, (res: any) => + { + if (res.statusCode !== 200) + { + reject(new HttpClientException("HTTP Error: " + res.statusCode + " " + res.statusMessage)); + } + + let recv_str: string = ""; + + res.on("data", (body: any) => + { + recv_str += body; + }); + + res.on("end", () => + { + let ret = new HttpClientResponse(); + + ret.Body = recv_str; + + resolve(ret); + }); + }).on("error", (err: any) => + { + throw err; + } + ); + + for (let name of Object.keys(headers)) + { + req.setHeader(name, !is_null(headers[name]) ? headers[name] : ""); + } + req.setHeader("Content-Type", req_media_type); + req.setHeader("Content-Length", Buffer.byteLength(req_body)); + req.write(req_body); + req.end(); + }); + } +} + + + + +//////// BEGIN: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js +// The MIT License(MIT) +// Copyright(c) 2014 +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +var lookup: any = []; +var revLookup: any = []; + +var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +for (var i = 0, len = code.length; i < len; ++i) +{ + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup["-".charCodeAt(0)] = 62; +revLookup["_".charCodeAt(0)] = 63; + +function getLens(b64: any) +{ + var len = b64.length; + + if (len % 4 > 0) + { + throw new Error("Invalid string. Length must be a multiple of 4"); + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf("="); + if (validLen === -1) validLen = len; + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4); + + return [validLen, placeHoldersLen]; +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength(b64: any) +{ + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen; +} + +function _byteLength(b64: any, validLen: any, placeHoldersLen: any) +{ + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen; +} + +export function Util_Base64_Decode(b64: any) +{ + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + + var arr = new Uint8Array(_byteLength(b64, validLen, placeHoldersLen)); + + var curByte = 0; + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen; + + for (var i = 0; i < len; i += 4) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)]; + arr[curByte++] = (tmp >> 16) & 0xFF; + arr[curByte++] = (tmp >> 8) & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 2) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4); + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 1) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2); + arr[curByte++] = (tmp >> 8) & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + return arr; +} + +function tripletToBase64(num: any) +{ + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F]; +} + +function encodeChunk(uint8: any, start: any, end: any) +{ + var tmp; + var output = []; + for (var i = start; i < end; i += 3) + { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF); + output.push(tripletToBase64(tmp)); + } + return output.join(""); +} + +export function Util_Base64_Encode(uint8: any) +{ + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) + { + parts.push(encodeChunk( + uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) + )); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) + { + tmp = uint8[len - 1]; + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + "==" + ); + } else if (extraBytes === 2) + { + tmp = (uint8[len - 2] << 8) + uint8[len - 1]; + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + "=" + ); + } + + return parts.join(""); +} +//////// END: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/tsconfig.json softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/tsconfig.json --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/tsconfig.json 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/tsconfig.json 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,72 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "ES3", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "lib": [ + "dom", + "es2015.promise", + "es5" + ], // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist/", /* Redirect output structure to the directory. */ + "rootDir": "./src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "incremental": true, /* Enable incremental compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules" + ] +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/tslint.json softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/tslint.json --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/tslint.json 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/tslint.json 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,20 @@ +{ + "defaultSeverity": "warn", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "comment-format": false, + "no-consecutive-blank-lines": false, + "no-trailing-whitespace": false, + "no-console": false, + "prefer-const": false, + "one-line": false, + "only-arrow-functions": false, + "space-before-function-paren": false, + "trailing-comma": false, + "no-empty": false, + }, + "rulesDirectory": [] +} \ No newline at end of file diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,2690 @@ +// Test sample code for SoftEther VPN Server JSON-RPC Stub +// Runs on both web browsers and Node.js +// +// sample.ts +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// This sample code shows how to call all available RPC functions. +// You can copy and paste test code to write your own web browser TypeScript / JavaScript codes. +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + +// On the web browser uncomment below imports as necessary to support old browsers. +// import "core-js/es6/promise"; +// import "core-js/es6/string"; +// import "whatwg-fetch"; + + +// Import the vpnrpc.ts RPC stub. +import * as VPN from "./vpnrpc"; + +// Output JSON-RPC request / reply strings to the debug console. +VPN.VpnServerRpc.SetDebugMode(true); + +let api: VPN.VpnServerRpc; +// Creating the VpnServerRpc class instance here. +if (VPN.VpnServerRpc.IsNodeJS() === false) // // Determine if this JavaScript environment is on the Node.js or not +{ + // On the web browser. We do not need to specify any hostname, port or credential as the web browser already knows it. + api = new VPN.VpnServerRpc(); +} +else +{ + // On the Node.js. We need to specify the target VPN Server's hostname, port and credential. + api = new VPN.VpnServerRpc("127.0.0.1", 443, "", "PASSWORD_HERE", false); +} + +// A variable for test +let hub_name = "test"; + +// Call the Test_All() function to test almost all VPN APIs. +Test_All(); + + + + +/** Tests all VPN APIs */ +async function Test_All(): Promise +{ + hub_name = "TEST"; + await Test_Test(); + await Test_GetServerInfo(); + await Test_GetServerStatus(); + let new_listener_port: number = await Test_CreateListener(); + await Test_EnableListener(new_listener_port, false); + await Test_EnumListener(); + await Test_EnableListener(new_listener_port, true); + await Test_EnumListener(); + await Test_DeleteListener(new_listener_port); + await Test_SetServerPassword(); + await Test_GetFarmSetting(); + if (false) + { + await Test_SetFarmSetting(); + let farm_members: VPN.VpnRpcEnumFarm = await Test_EnumFarmMember(); + for (let farm_member of farm_members.FarmMemberList) + { + await Test_GetFarmInfo(farm_member.Id_u32); + } + await Test_GetFarmConnectionStatus(); + } + else if (false) + { + console.log("abc"); + } + else + { + console.log("def"); + } + await Test_GetServerCert(); + await Test_SetServerCert(); + await Test_GetServerCipher(); + await Test_SetServerCipher(); + let enum_connection: VPN.VpnRpcEnumConnection = await Test_EnumConnection(); + for (let connecton of enum_connection.ConnectionList) + { + await Test_GetConnectionInfo(connecton.Name_str); + } + hub_name = await Test_CreateHub(); + await Test_SetHub(); + await Test_GetHub(); + await Test_EnumHub(); + await Test_SetHubRadius(); + await Test_GetHubRadius(); + await Test_SetHubOnline(); + await Test_GetHubStatus(); + let hub_log_settings: VPN.VpnRpcHubLog = await Test_GetHubLog(); + await Test_SetHubLog(hub_log_settings); + await Test_AddCa(); + let enum_ca: VPN.VpnRpcHubEnumCA = await Test_EnumCa(); + for (let ca of enum_ca.CAList) + { + await Test_GetCa(ca.Key_u32); + await Test_DeleteCa(ca.Key_u32); + } + await Test_CreateLink(); + await Test_GetLink(); + await Test_SetLink(); + await Test_SetLinkOffline(); + await Test_SetLinkOnline(); + let enum_link: VPN.VpnRpcEnumLink = await Test_EnumLink(); + for (let link of enum_link.LinkList) + { + await Test_GetLinkStatus(link.AccountName_utf); + } + await new Promise((r) => setTimeout(r, 3000)); + await Test_RenameLink(); + await Test_DeleteLink(); + await Test_AddAccess(); + await Test_EnumAccess(); + await Test_DeleteAccess(); + await Test_SetAccessList(); + await Test_CreateGroup(); + await Test_SetGroup(); + await Test_GetGroup(); + await Test_CreateUser(); + await Test_SetUser(); + await Test_GetUser(); + await Test_EnumUser(); + await Test_EnumGroup(); + await Test_DeleteUser(); + await Test_DeleteGroup(); + let enum_session: VPN.VpnRpcEnumSession = await Test_EnumSession(); + for (let session of enum_session.SessionList) + { + await Test_GetSessionStatus(session.Name_str); + await Test_DeleteSession(session.Name_str); + } + let enum_mac: VPN.VpnRpcEnumMacTable = await Test_EnumMacTable(); + for (let mac of enum_mac.MacTable) + { + await Test_DeleteMacTable(mac.Key_u32); + } + let enum_ip: VPN.VpnRpcEnumIpTable = await Test_EnumIpTable(); + for (let ip of enum_ip.IpTable) + { + await Test_DeleteIpTable(ip.Key_u32); + } + await Test_SetKeep(); + await Test_GetKeep(); + await Test_EnableSecureNAT(); + await Test_GetSecureNATOption(); + await Test_SetSecureNATOption(); + await Test_EnumNAT(); + await Test_EnumDHCP(); + await Test_GetSecureNATStatus(); + await Test_DisableSecureNAT(); + await Test_EnumEthernet(); + await Test_EnumLocalBridge(); + await Test_GetBridgeSupport(); + await Test_GetCaps(); + await Test_GetConfig(); + await Test_GetDefaultHubAdminOptions(); + await Test_GetHubAdminOptions(); + await Test_SetHubAdminOptions(); + await Test_GetHubExtOptions(); + await Test_SetHubExtOptions(); + await Test_AddL3Switch(); + await Test_AddL3If(); + await Test_EnumL3Switch(); + await Test_EnumL3If(); + await Test_AddL3Table(); + await Test_EnumL3Table(); + await Test_DelL3Table(); + await Test_StartL3Switch(); + await Test_StopL3Switch(); + await Test_DelL3If(); + await Test_DelL3Switch(); + await Test_AddCrl(); + let enum_crl: VPN.VpnRpcEnumCrl = await Test_EnumCrl(); + for (let crl of enum_crl.CRLList) + { + let got_crl: VPN.VpnRpcCrl = await Test_GetCrl(crl.Key_u32); + got_crl.CommonName_utf = got_crl.CommonName_utf + "_a"; + await Test_SetCrl(got_crl); + } + enum_crl = await Test_EnumCrl(); + for (let crl of enum_crl.CRLList) + { + await Test_DelCrl(crl.Key_u32); + } + await Test_SetAcList(); + await Test_GetAcList(); + let enum_log_file: VPN.VpnRpcEnumLogFile = await Test_EnumLogFile(); + for (let log of enum_log_file.LogFiles) + { + await Test_ReadLogFile(log.FilePath_str); + break; + } + await Test_SetSysLog(true); + await Test_GetSysLog(); + await Test_SetSysLog(false); + await Test_SetHubMsg(); + await Test_GetHubMsg(); + await Test_GetAdminMsg(); + await Test_Flush(); + await Test_SetIPsecServices(); + await Test_GetIPsecServices(); + await Test_AddEtherIpId(); + let enum_etherip_id: VPN.VpnRpcEnumEtherIpId = await Test_EnumEtherIpId(); + for (let etherip_id of enum_etherip_id.Settings) + { + await Test_GetEtherIpId(etherip_id.Id_str); + await Test_DeleteEtherIpId(etherip_id.Id_str); + } + await Test_SetOpenVpnSstpConfig(); + await Test_GetOpenVpnSstpConfig(); + await Test_GetDDnsClientStatus(); + await Test_SetDDnsInternetSettng(); + await Test_GetDDnsInternetSettng(); + await Test_ChangeDDnsClientHostname(); + await Test_RegenerateServerCert(); + await Test_MakeOpenVpnConfigFile(); + await Test_SetSpecialListener(); + await Test_GetSpecialListener(); + await Test_GetAzureStatus(); + await Test_SetAzureStatus(); + await Test_SetVgsConfig(); + await Test_GetVgsConfig(); + await Test_DeleteHub(); + return; +} + +/** API test for 'Test', test RPC function */ +async function Test_Test(): Promise +{ + console.log("Begin: Test_Test"); + let a: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + IntValue_u32: 12345, + }); + let b: VPN.VpnRpcTest = await api.Test(a); + console.log(b); + console.log("End: Test_Test"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetServerInfo', Get server information */ +async function Test_GetServerInfo(): Promise +{ + console.log("Begin: Test_GetServerInfo"); + let info: VPN.VpnRpcServerInfo = await api.GetServerInfo(); + console.log(info); + console.log("End: Test_GetServerInfo"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetServerStatus', Get server status */ +async function Test_GetServerStatus(): Promise +{ + console.log("Begin: Test_GetServerStatus"); + let out_rpc_server_status: VPN.VpnRpcServerStatus = await api.GetServerStatus(); + console.log(out_rpc_server_status); + console.log("End: Test_GetServerStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateListener', Create a listener */ +async function Test_CreateListener(): Promise +{ + console.log("Begin: Test_CreateListener"); + let port: number = Math.floor((Math.random() * (65534 - 1025)) + 1025); + console.log("Creating a new listener port: Port " + port); + let in_rpc_listener: VPN.VpnRpcListener = new VPN.VpnRpcListener( + { + Enable_bool: true, + Port_u32: port, + }); + let out_rpc_listener: VPN.VpnRpcListener = await api.CreateListener(in_rpc_listener); + console.log("Done."); + console.log("End: Test_CreateListener"); + console.log("-----"); + console.log(); + return port; +} + +/** API test for 'EnumListener', Enumerating listeners */ +async function Test_EnumListener(): Promise +{ + console.log("Begin: Test_EnumListener"); + let out_rpc_listener_list: VPN.VpnRpcListenerList = await api.EnumListener(); + console.log(out_rpc_listener_list); + console.log("End: Test_EnumListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteListener', Delete a listener */ +async function Test_DeleteListener(port: number): Promise +{ + console.log("Begin: Test_DeleteListener"); + console.log("Deleting a new listener port: Port" + port); + let in_rpc_listener: VPN.VpnRpcListener = new VPN.VpnRpcListener( + { + Port_u32: port, + }); + let out_rpc_listener: VPN.VpnRpcListener = await api.DeleteListener(in_rpc_listener); + console.log("Done."); + console.log("End: Test_DeleteListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnableListener', Enable / Disable listener */ +async function Test_EnableListener(port: number, enabled: boolean): Promise +{ + console.log("Begin: Test_EnableListener"); + if (enabled) + { + console.log("Enabling listener port = " + port); + } + else + { + console.log("Disabling listener port = " + port); + } + let in_rpc_listener: VPN.VpnRpcListener = new VPN.VpnRpcListener( + { + Port_u32: port, + Enable_bool: enabled, + }); + let out_rpc_listener: VPN.VpnRpcListener = await api.EnableListener(in_rpc_listener); + console.log("Done."); + console.log("End: Test_EnableListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetServerPassword', Set server password */ +async function Test_SetServerPassword(): Promise +{ + let password: string = "microsoft"; + console.log("Begin: Test_SetServerPassword"); + console.log("Set the server administrator password to '" + password + "'."); + let in_rpc_set_password: VPN.VpnRpcSetPassword = new VPN.VpnRpcSetPassword( + { + PlainTextPassword_str: password, + }); + let out_rpc_set_password: VPN.VpnRpcSetPassword = await api.SetServerPassword(in_rpc_set_password); + console.log("Done."); + console.log("End: Test_SetServerPassword"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetFarmSetting', Set clustering configuration */ +async function Test_SetFarmSetting(): Promise +{ + console.log("Begin: Test_SetFarmSetting"); + let in_rpc_farm: VPN.VpnRpcFarm = new VPN.VpnRpcFarm( + { + ServerType_u32: VPN.VpnRpcServerType.FarmController, + NumPort_u32: 2, + Ports_u32: [ 443, 444, 445, ], + PublicIp_ip: "1.2.3.4", + ControllerName_str: "controller", + MemberPasswordPlaintext_str: "microsoft", + ControllerPort_u32: 443, + Weight_u32: 100, + ControllerOnly_bool: false, + }); + let out_rpc_farm: VPN.VpnRpcFarm = await api.SetFarmSetting(in_rpc_farm); + console.log("End: Test_SetFarmSetting"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetFarmSetting', Get clustering configuration */ +async function Test_GetFarmSetting(): Promise +{ + console.log("Begin: Test_GetFarmSetting"); + let out_rpc_farm: VPN.VpnRpcFarm = await api.GetFarmSetting(); + console.log(out_rpc_farm); + console.log("End: Test_GetFarmSetting"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetFarmInfo', Get cluster member information */ +async function Test_GetFarmInfo(id: number): Promise +{ + console.log("Begin: Test_GetFarmInfo"); + let in_rpc_farm_info: VPN.VpnRpcFarmInfo = new VPN.VpnRpcFarmInfo( + { + Id_u32: id, + }); + let out_rpc_farm_info: VPN.VpnRpcFarmInfo = await api.GetFarmInfo(in_rpc_farm_info); + console.log(out_rpc_farm_info); + console.log("End: Test_GetFarmInfo"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumFarmMember', Enumerate cluster members */ +async function Test_EnumFarmMember(): Promise +{ + console.log("Begin: Test_EnumFarmMember"); + let out_rpc_enum_farm: VPN.VpnRpcEnumFarm = await api.EnumFarmMember(); + console.log(out_rpc_enum_farm); + console.log("End: Test_EnumFarmMember"); + console.log("-----"); + console.log(); + return out_rpc_enum_farm; +} + +/** API test for 'GetFarmConnectionStatus', Get status of connection to cluster controller */ +async function Test_GetFarmConnectionStatus(): Promise +{ + console.log("Begin: Test_GetFarmConnectionStatus"); + let out_rpc_farm_connection_status: VPN.VpnRpcFarmConnectionStatus = await api.GetFarmConnectionStatus(); + console.log(out_rpc_farm_connection_status); + console.log("End: Test_GetFarmConnectionStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetServerCert', Set the server certification */ +async function Test_SetServerCert(): Promise +{ + console.log("Begin: Test_SetServerCert"); + let in_rpc_key_pair: VPN.VpnRpcKeyPair = new VPN.VpnRpcKeyPair( + { + Cert_bin: new Uint8Array([ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x72, 0x6a, 0x43, 0x43, 0x41, 0x70, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x0a, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x0a, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4e, 0x4d, 0x54, 0x67, 0x78, 0x4d, 0x44, 0x45, 0x78, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x68, 0x63, 0x4e, 0x4e, 0x44, 0x49, 0x78, 0x4d, 0x44, 0x41, 0x31, 0x0a, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x6a, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x0a, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x0a, 0x67, 0x67, 0x45, 0x69, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4b, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x0a, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x0a, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x0a, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x0a, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x0a, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x0a, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, 0x67, 0x59, 0x59, 0x77, 0x67, 0x59, 0x4d, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2f, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2f, 0x7a, 0x41, 0x4c, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4d, 0x43, 0x41, 0x66, 0x59, 0x77, 0x59, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6c, 0x0a, 0x42, 0x46, 0x77, 0x77, 0x57, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x45, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x43, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x41, 0x77, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x51, 0x47, 0x43, 0x43, 0x73, 0x47, 0x0a, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x46, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x42, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x63, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x49, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x43, 0x54, 0x41, 0x4e, 0x0a, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x45, 0x41, 0x46, 0x6d, 0x34, 0x37, 0x47, 0x55, 0x70, 0x50, 0x57, 0x35, 0x2b, 0x37, 0x69, 0x46, 0x74, 0x69, 0x6c, 0x6f, 0x6b, 0x35, 0x32, 0x49, 0x6f, 0x54, 0x57, 0x72, 0x74, 0x46, 0x67, 0x32, 0x79, 0x69, 0x36, 0x6b, 0x49, 0x32, 0x69, 0x52, 0x4e, 0x51, 0x0a, 0x4b, 0x75, 0x67, 0x48, 0x55, 0x49, 0x4f, 0x34, 0x4b, 0x53, 0x71, 0x4a, 0x56, 0x42, 0x50, 0x38, 0x61, 0x4b, 0x4f, 0x61, 0x54, 0x5a, 0x47, 0x45, 0x31, 0x4b, 0x4d, 0x68, 0x2f, 0x59, 0x6a, 0x68, 0x36, 0x71, 0x2f, 0x67, 0x50, 0x61, 0x6c, 0x67, 0x64, 0x2f, 0x38, 0x44, 0x6d, 0x72, 0x78, 0x53, 0x4a, 0x6d, 0x55, 0x78, 0x33, 0x62, 0x4e, 0x62, 0x38, 0x52, 0x59, 0x36, 0x70, 0x4b, 0x7a, 0x74, 0x0a, 0x5a, 0x64, 0x75, 0x53, 0x61, 0x53, 0x2b, 0x57, 0x55, 0x30, 0x59, 0x74, 0x2b, 0x6c, 0x47, 0x35, 0x76, 0x56, 0x67, 0x61, 0x70, 0x48, 0x45, 0x71, 0x36, 0x79, 0x71, 0x4c, 0x62, 0x65, 0x56, 0x78, 0x51, 0x4c, 0x75, 0x62, 0x54, 0x69, 0x6e, 0x4f, 0x66, 0x56, 0x56, 0x5a, 0x58, 0x79, 0x45, 0x43, 0x59, 0x47, 0x4d, 0x73, 0x59, 0x71, 0x65, 0x6e, 0x4a, 0x6a, 0x4e, 0x63, 0x62, 0x49, 0x5a, 0x4e, 0x0a, 0x79, 0x4d, 0x75, 0x72, 0x46, 0x63, 0x67, 0x30, 0x34, 0x36, 0x4f, 0x34, 0x59, 0x79, 0x68, 0x56, 0x79, 0x71, 0x53, 0x69, 0x74, 0x43, 0x59, 0x37, 0x68, 0x2f, 0x65, 0x71, 0x67, 0x6b, 0x50, 0x4a, 0x51, 0x30, 0x68, 0x6b, 0x70, 0x39, 0x45, 0x64, 0x51, 0x77, 0x62, 0x6e, 0x38, 0x56, 0x6c, 0x66, 0x78, 0x64, 0x42, 0x58, 0x77, 0x51, 0x34, 0x4e, 0x48, 0x4b, 0x30, 0x4a, 0x56, 0x46, 0x2f, 0x33, 0x0a, 0x71, 0x48, 0x61, 0x68, 0x4e, 0x48, 0x4f, 0x35, 0x64, 0x62, 0x4a, 0x5a, 0x57, 0x59, 0x41, 0x62, 0x42, 0x44, 0x70, 0x32, 0x51, 0x45, 0x53, 0x70, 0x76, 0x6f, 0x2b, 0x38, 0x33, 0x6c, 0x68, 0x34, 0x64, 0x6e, 0x58, 0x6a, 0x46, 0x58, 0x4d, 0x43, 0x48, 0x76, 0x52, 0x68, 0x35, 0x31, 0x79, 0x2f, 0x54, 0x71, 0x79, 0x42, 0x34, 0x56, 0x76, 0x72, 0x52, 0x4b, 0x49, 0x4b, 0x74, 0x54, 0x6f, 0x7a, 0x0a, 0x5a, 0x6a, 0x48, 0x59, 0x49, 0x63, 0x62, 0x6a, 0x76, 0x53, 0x58, 0x4d, 0x7a, 0x61, 0x44, 0x50, 0x6a, 0x50, 0x63, 0x5a, 0x47, 0x6a, 0x42, 0x4a, 0x6c, 0x47, 0x36, 0x43, 0x76, 0x44, 0x34, 0x4c, 0x6d, 0x59, 0x7a, 0x72, 0x6b, 0x48, 0x34, 0x31, 0x63, 0x7a, 0x72, 0x34, 0x57, 0x41, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, ]), + Key_bin: new Uint8Array([ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x45, 0x76, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x53, 0x43, 0x42, 0x4b, 0x67, 0x77, 0x67, 0x67, 0x53, 0x6b, 0x41, 0x67, 0x45, 0x41, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x0a, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x0a, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x0a, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x0a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x0a, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x0a, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x45, 0x43, 0x67, 0x67, 0x45, 0x41, 0x54, 0x77, 0x34, 0x52, 0x6f, 0x52, 0x4c, 0x6a, 0x73, 0x68, 0x72, 0x42, 0x56, 0x6f, 0x59, 0x69, 0x78, 0x4f, 0x4a, 0x2b, 0x57, 0x4c, 0x6d, 0x2f, 0x45, 0x51, 0x57, 0x65, 0x37, 0x6f, 0x6a, 0x38, 0x31, 0x51, 0x50, 0x73, 0x39, 0x56, 0x45, 0x49, 0x32, 0x62, 0x53, 0x4f, 0x0a, 0x34, 0x4a, 0x51, 0x42, 0x55, 0x42, 0x53, 0x6b, 0x70, 0x64, 0x48, 0x34, 0x57, 0x32, 0x77, 0x51, 0x75, 0x2f, 0x61, 0x58, 0x57, 0x38, 0x75, 0x75, 0x53, 0x39, 0x45, 0x43, 0x6d, 0x6d, 0x41, 0x41, 0x75, 0x45, 0x79, 0x4a, 0x54, 0x56, 0x7a, 0x75, 0x31, 0x32, 0x35, 0x58, 0x73, 0x65, 0x63, 0x6c, 0x44, 0x41, 0x55, 0x38, 0x49, 0x55, 0x70, 0x54, 0x2b, 0x70, 0x4c, 0x35, 0x79, 0x70, 0x37, 0x34, 0x0a, 0x45, 0x62, 0x76, 0x4e, 0x48, 0x48, 0x33, 0x67, 0x65, 0x72, 0x4f, 0x67, 0x78, 0x76, 0x49, 0x6a, 0x50, 0x64, 0x67, 0x77, 0x62, 0x66, 0x6d, 0x4d, 0x49, 0x59, 0x48, 0x62, 0x56, 0x70, 0x6e, 0x49, 0x30, 0x77, 0x32, 0x42, 0x43, 0x44, 0x51, 0x76, 0x74, 0x64, 0x64, 0x57, 0x6f, 0x42, 0x74, 0x41, 0x33, 0x43, 0x54, 0x6a, 0x63, 0x2f, 0x43, 0x56, 0x67, 0x73, 0x47, 0x77, 0x33, 0x43, 0x4e, 0x72, 0x0a, 0x46, 0x78, 0x41, 0x46, 0x35, 0x73, 0x4a, 0x34, 0x63, 0x5a, 0x4c, 0x6e, 0x5a, 0x31, 0x45, 0x36, 0x69, 0x74, 0x4c, 0x54, 0x50, 0x69, 0x6f, 0x6a, 0x74, 0x76, 0x48, 0x48, 0x34, 0x61, 0x64, 0x6d, 0x68, 0x68, 0x43, 0x61, 0x42, 0x49, 0x78, 0x76, 0x47, 0x2f, 0x53, 0x6e, 0x59, 0x77, 0x4e, 0x35, 0x38, 0x37, 0x55, 0x5a, 0x6d, 0x37, 0x4c, 0x57, 0x50, 0x61, 0x67, 0x4c, 0x41, 0x33, 0x67, 0x69, 0x0a, 0x48, 0x4b, 0x4f, 0x2b, 0x4b, 0x79, 0x42, 0x51, 0x39, 0x33, 0x31, 0x4e, 0x4d, 0x61, 0x65, 0x6a, 0x36, 0x6d, 0x75, 0x75, 0x46, 0x32, 0x30, 0x32, 0x76, 0x34, 0x37, 0x6c, 0x57, 0x6b, 0x64, 0x50, 0x4f, 0x6e, 0x52, 0x43, 0x69, 0x6f, 0x4d, 0x58, 0x30, 0x63, 0x31, 0x6a, 0x36, 0x76, 0x32, 0x61, 0x59, 0x34, 0x34, 0x77, 0x55, 0x4b, 0x71, 0x39, 0x4d, 0x52, 0x67, 0x6f, 0x52, 0x76, 0x4a, 0x37, 0x0a, 0x41, 0x39, 0x77, 0x65, 0x72, 0x4c, 0x6b, 0x68, 0x35, 0x78, 0x78, 0x35, 0x35, 0x32, 0x4f, 0x74, 0x71, 0x50, 0x36, 0x73, 0x61, 0x6d, 0x75, 0x47, 0x44, 0x52, 0x78, 0x31, 0x42, 0x70, 0x36, 0x53, 0x4f, 0x70, 0x68, 0x43, 0x45, 0x50, 0x48, 0x59, 0x67, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x36, 0x33, 0x65, 0x2b, 0x52, 0x75, 0x6c, 0x36, 0x46, 0x78, 0x47, 0x43, 0x76, 0x67, 0x70, 0x6b, 0x33, 0x0a, 0x57, 0x67, 0x2f, 0x54, 0x31, 0x77, 0x2f, 0x59, 0x4b, 0x6b, 0x79, 0x4f, 0x49, 0x46, 0x4c, 0x63, 0x46, 0x4c, 0x57, 0x71, 0x42, 0x44, 0x71, 0x6c, 0x6e, 0x58, 0x65, 0x63, 0x6c, 0x6b, 0x50, 0x4b, 0x6a, 0x57, 0x4e, 0x2f, 0x32, 0x70, 0x4a, 0x6d, 0x4f, 0x31, 0x63, 0x46, 0x63, 0x44, 0x4a, 0x46, 0x59, 0x64, 0x32, 0x45, 0x49, 0x45, 0x72, 0x76, 0x42, 0x57, 0x54, 0x34, 0x51, 0x39, 0x4d, 0x42, 0x0a, 0x4e, 0x35, 0x6c, 0x44, 0x6b, 0x47, 0x75, 0x6a, 0x34, 0x2f, 0x6b, 0x68, 0x56, 0x6c, 0x79, 0x6e, 0x77, 0x62, 0x64, 0x42, 0x6e, 0x47, 0x43, 0x34, 0x61, 0x34, 0x48, 0x4a, 0x49, 0x4a, 0x76, 0x61, 0x35, 0x63, 0x70, 0x49, 0x63, 0x57, 0x65, 0x4a, 0x72, 0x35, 0x61, 0x57, 0x33, 0x69, 0x44, 0x36, 0x68, 0x53, 0x73, 0x61, 0x6c, 0x79, 0x55, 0x76, 0x4a, 0x4d, 0x6d, 0x64, 0x4d, 0x42, 0x6e, 0x47, 0x0a, 0x37, 0x2b, 0x50, 0x65, 0x53, 0x2b, 0x4e, 0x73, 0x4b, 0x30, 0x61, 0x63, 0x31, 0x67, 0x33, 0x4d, 0x6c, 0x56, 0x35, 0x42, 0x41, 0x32, 0x70, 0x55, 0x54, 0x77, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x62, 0x65, 0x46, 0x6d, 0x2b, 0x46, 0x46, 0x35, 0x62, 0x76, 0x6f, 0x4b, 0x7a, 0x49, 0x4c, 0x6c, 0x31, 0x62, 0x79, 0x6b, 0x6c, 0x52, 0x6b, 0x69, 0x76, 0x7a, 0x6b, 0x62, 0x7a, 0x49, 0x6b, 0x41, 0x78, 0x0a, 0x35, 0x56, 0x6b, 0x74, 0x67, 0x36, 0x4a, 0x35, 0x63, 0x76, 0x38, 0x44, 0x35, 0x2b, 0x72, 0x71, 0x50, 0x75, 0x6a, 0x4f, 0x66, 0x39, 0x67, 0x42, 0x6a, 0x4e, 0x37, 0x70, 0x64, 0x78, 0x39, 0x39, 0x35, 0x6b, 0x47, 0x49, 0x78, 0x5a, 0x39, 0x6d, 0x31, 0x68, 0x57, 0x69, 0x78, 0x55, 0x55, 0x31, 0x55, 0x6f, 0x38, 0x72, 0x70, 0x39, 0x4a, 0x69, 0x47, 0x4f, 0x36, 0x72, 0x65, 0x31, 0x77, 0x69, 0x0a, 0x6a, 0x56, 0x2f, 0x4c, 0x31, 0x64, 0x37, 0x55, 0x66, 0x39, 0x48, 0x6a, 0x65, 0x61, 0x70, 0x4f, 0x46, 0x62, 0x34, 0x6b, 0x72, 0x71, 0x52, 0x58, 0x54, 0x65, 0x75, 0x4d, 0x6e, 0x35, 0x35, 0x44, 0x33, 0x64, 0x70, 0x79, 0x6a, 0x51, 0x4e, 0x43, 0x30, 0x5a, 0x50, 0x72, 0x61, 0x6d, 0x58, 0x64, 0x38, 0x31, 0x57, 0x6f, 0x6f, 0x56, 0x77, 0x58, 0x59, 0x41, 0x66, 0x69, 0x46, 0x76, 0x4c, 0x49, 0x0a, 0x6f, 0x66, 0x31, 0x37, 0x51, 0x67, 0x67, 0x49, 0x59, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x59, 0x55, 0x67, 0x67, 0x43, 0x34, 0x58, 0x49, 0x67, 0x5a, 0x76, 0x58, 0x34, 0x59, 0x65, 0x55, 0x38, 0x6c, 0x61, 0x79, 0x51, 0x50, 0x79, 0x4b, 0x71, 0x67, 0x38, 0x37, 0x2f, 0x76, 0x31, 0x2b, 0x7a, 0x35, 0x79, 0x65, 0x2f, 0x4d, 0x32, 0x5a, 0x65, 0x36, 0x53, 0x6e, 0x37, 0x48, 0x4a, 0x66, 0x59, 0x0a, 0x55, 0x5a, 0x4d, 0x36, 0x37, 0x48, 0x37, 0x52, 0x4b, 0x4e, 0x6f, 0x68, 0x46, 0x6c, 0x35, 0x43, 0x39, 0x65, 0x44, 0x4e, 0x7a, 0x67, 0x72, 0x50, 0x6b, 0x52, 0x63, 0x2f, 0x2f, 0x54, 0x77, 0x32, 0x45, 0x48, 0x74, 0x59, 0x68, 0x33, 0x42, 0x4b, 0x49, 0x6f, 0x72, 0x77, 0x39, 0x45, 0x64, 0x78, 0x59, 0x4e, 0x6c, 0x6b, 0x2b, 0x6a, 0x4e, 0x73, 0x30, 0x30, 0x64, 0x57, 0x35, 0x34, 0x64, 0x39, 0x0a, 0x65, 0x69, 0x69, 0x7a, 0x7a, 0x78, 0x59, 0x34, 0x34, 0x2f, 0x41, 0x32, 0x70, 0x39, 0x52, 0x49, 0x4d, 0x67, 0x79, 0x35, 0x49, 0x52, 0x77, 0x76, 0x53, 0x73, 0x6d, 0x50, 0x67, 0x61, 0x71, 0x34, 0x6f, 0x4b, 0x4d, 0x64, 0x54, 0x4e, 0x4d, 0x4f, 0x73, 0x30, 0x4a, 0x77, 0x65, 0x79, 0x50, 0x72, 0x42, 0x65, 0x49, 0x41, 0x72, 0x62, 0x46, 0x43, 0x67, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x43, 0x71, 0x0a, 0x57, 0x30, 0x34, 0x56, 0x33, 0x49, 0x75, 0x74, 0x33, 0x55, 0x42, 0x6f, 0x75, 0x50, 0x4d, 0x63, 0x63, 0x38, 0x2f, 0x56, 0x62, 0x69, 0x77, 0x48, 0x77, 0x79, 0x2b, 0x52, 0x6c, 0x4c, 0x6d, 0x4e, 0x77, 0x59, 0x41, 0x71, 0x63, 0x79, 0x35, 0x50, 0x35, 0x58, 0x4b, 0x4c, 0x33, 0x70, 0x36, 0x62, 0x65, 0x33, 0x2b, 0x4d, 0x6f, 0x76, 0x48, 0x52, 0x71, 0x6a, 0x35, 0x78, 0x72, 0x4a, 0x54, 0x57, 0x0a, 0x54, 0x6a, 0x2f, 0x36, 0x59, 0x61, 0x51, 0x73, 0x31, 0x2b, 0x72, 0x74, 0x63, 0x51, 0x45, 0x61, 0x74, 0x64, 0x34, 0x4b, 0x50, 0x66, 0x64, 0x78, 0x53, 0x2f, 0x63, 0x66, 0x52, 0x74, 0x38, 0x71, 0x74, 0x75, 0x42, 0x77, 0x51, 0x61, 0x2f, 0x34, 0x39, 0x4d, 0x72, 0x41, 0x4c, 0x76, 0x57, 0x43, 0x4c, 0x53, 0x42, 0x75, 0x4b, 0x74, 0x33, 0x49, 0x49, 0x75, 0x53, 0x2f, 0x51, 0x44, 0x74, 0x43, 0x0a, 0x5a, 0x4e, 0x67, 0x6d, 0x36, 0x4d, 0x78, 0x71, 0x4e, 0x6e, 0x49, 0x43, 0x58, 0x35, 0x46, 0x34, 0x36, 0x6d, 0x52, 0x49, 0x52, 0x42, 0x42, 0x4f, 0x32, 0x4b, 0x7a, 0x6c, 0x30, 0x33, 0x68, 0x62, 0x51, 0x6c, 0x71, 0x58, 0x4c, 0x5a, 0x63, 0x38, 0x6f, 0x51, 0x4b, 0x42, 0x67, 0x43, 0x53, 0x77, 0x66, 0x46, 0x7a, 0x68, 0x48, 0x76, 0x78, 0x36, 0x68, 0x69, 0x64, 0x57, 0x67, 0x48, 0x4a, 0x63, 0x0a, 0x77, 0x79, 0x76, 0x64, 0x6e, 0x70, 0x58, 0x78, 0x36, 0x5a, 0x4c, 0x6e, 0x6f, 0x61, 0x7a, 0x61, 0x6f, 0x48, 0x47, 0x74, 0x4d, 0x47, 0x43, 0x45, 0x5a, 0x49, 0x50, 0x66, 0x6a, 0x4c, 0x42, 0x63, 0x30, 0x4d, 0x74, 0x79, 0x45, 0x64, 0x53, 0x4c, 0x78, 0x54, 0x6c, 0x35, 0x59, 0x70, 0x78, 0x6f, 0x6d, 0x43, 0x46, 0x55, 0x4d, 0x33, 0x55, 0x63, 0x59, 0x4e, 0x2f, 0x50, 0x5a, 0x66, 0x58, 0x41, 0x0a, 0x6d, 0x36, 0x31, 0x45, 0x6d, 0x71, 0x53, 0x53, 0x4d, 0x56, 0x63, 0x47, 0x50, 0x67, 0x65, 0x2f, 0x43, 0x34, 0x44, 0x42, 0x5a, 0x59, 0x6a, 0x53, 0x45, 0x71, 0x62, 0x67, 0x37, 0x6d, 0x73, 0x52, 0x30, 0x33, 0x37, 0x42, 0x58, 0x54, 0x48, 0x6b, 0x78, 0x44, 0x62, 0x33, 0x71, 0x48, 0x46, 0x54, 0x6f, 0x30, 0x6b, 0x48, 0x57, 0x4a, 0x66, 0x34, 0x39, 0x59, 0x77, 0x32, 0x73, 0x77, 0x6a, 0x54, 0x0a, 0x72, 0x4f, 0x38, 0x46, 0x46, 0x44, 0x52, 0x56, 0x50, 0x44, 0x4c, 0x5a, 0x61, 0x37, 0x36, 0x47, 0x67, 0x79, 0x41, 0x55, 0x4a, 0x38, 0x55, 0x63, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, ]), + }); + let out_rpc_key_pair: VPN.VpnRpcKeyPair = await api.SetServerCert(in_rpc_key_pair); + console.log(out_rpc_key_pair); + console.log("End: Test_SetServerCert"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetServerCert', Get the server certification */ +async function Test_GetServerCert(): Promise +{ + console.log("Begin: Test_GetServerCert"); + let out_rpc_key_pair: VPN.VpnRpcKeyPair = await api.GetServerCert(); + console.log(out_rpc_key_pair); + console.log("End: Test_GetServerCert"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetServerCipher', Get cipher for SSL */ +async function Test_GetServerCipher(): Promise +{ + console.log("Begin: Test_GetServerCipher"); + let out_rpc_str: VPN.VpnRpcStr = await api.GetServerCipher(); + console.log(out_rpc_str); + console.log("End: Test_GetServerCipher"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetServerCipher', Set cipher for SSL to the server */ +async function Test_SetServerCipher(): Promise +{ + console.log("Begin: Test_SetServerCipher"); + let in_rpc_str: VPN.VpnRpcStr = new VPN.VpnRpcStr( + { + String_str: "RC4-MD5", + }); + let out_rpc_str: VPN.VpnRpcStr = await api.SetServerCipher(in_rpc_str); + console.log(out_rpc_str); + console.log("End: Test_SetServerCipher"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateHub', Create a hub */ +async function Test_CreateHub(): Promise +{ + let hub_name: string = "Test_" + Math.floor((Math.random() * (999999 - 100000)) + 100000); + console.log("Begin: Test_CreateHub"); + let in_rpc_create_hub: VPN.VpnRpcCreateHub = new VPN.VpnRpcCreateHub( + { + HubName_str: hub_name, + HubType_u32: VPN.VpnRpcHubType.Standalone, + Online_bool: true, + AdminPasswordPlainText_str: "microsoft", + MaxSession_u32: 123, + NoEnum_bool: false, + }); + let out_rpc_create_hub: VPN.VpnRpcCreateHub = await api.CreateHub(in_rpc_create_hub); + console.log(out_rpc_create_hub); + console.log("End: Test_CreateHub"); + console.log("-----"); + console.log(); + return hub_name; +} + +/** API test for 'SetHub', Set hub configuration */ +async function Test_SetHub(): Promise +{ + console.log("Begin: Test_SetHub"); + let in_rpc_create_hub: VPN.VpnRpcCreateHub = new VPN.VpnRpcCreateHub( + { + HubName_str: hub_name, + AdminPasswordPlainText_str: "aho", + HubType_u32: VPN.VpnRpcHubType.Standalone, + NoEnum_bool: false, + MaxSession_u32: 128, + Online_bool: true, + }); + let out_rpc_create_hub: VPN.VpnRpcCreateHub = await api.SetHub(in_rpc_create_hub); + console.log(out_rpc_create_hub); + console.log("End: Test_SetHub"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHub', Get hub configuration */ +async function Test_GetHub(): Promise +{ + console.log("Begin: Test_GetHub"); + let in_rpc_create_hub: VPN.VpnRpcCreateHub = new VPN.VpnRpcCreateHub( + { + HubName_str: hub_name, + }); + let out_rpc_create_hub: VPN.VpnRpcCreateHub = await api.GetHub(in_rpc_create_hub); + console.log(out_rpc_create_hub); + console.log("End: Test_GetHub"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumHub', Enumerate hubs */ +async function Test_EnumHub(): Promise +{ + console.log("Begin: Test_EnumHub"); + let out_rpc_enum_hub: VPN.VpnRpcEnumHub = await api.EnumHub(); + console.log(out_rpc_enum_hub); + console.log("End: Test_EnumHub"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteHub', Delete a hub */ +async function Test_DeleteHub(): Promise +{ + console.log("Begin: Test_DeleteHub"); + let in_rpc_delete_hub: VPN.VpnRpcDeleteHub = new VPN.VpnRpcDeleteHub( + { + HubName_str: hub_name, + }); + let out_rpc_delete_hub: VPN.VpnRpcDeleteHub = await api.DeleteHub(in_rpc_delete_hub); + console.log(out_rpc_delete_hub); + console.log("End: Test_DeleteHub"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubRadius', Get Radius options of the hub */ +async function Test_GetHubRadius(): Promise +{ + console.log("Begin: Test_GetHubRadius"); + let in_rpc_radius: VPN.VpnRpcRadius = new VPN.VpnRpcRadius( + { + HubName_str: hub_name, + }); + let out_rpc_radius: VPN.VpnRpcRadius = await api.GetHubRadius(in_rpc_radius); + console.log(out_rpc_radius); + console.log("End: Test_GetHubRadius"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubRadius', Set Radius options of the hub */ +async function Test_SetHubRadius(): Promise +{ + console.log("Begin: Test_SetHubRadius"); + let in_rpc_radius: VPN.VpnRpcRadius = new VPN.VpnRpcRadius( + { + HubName_str: hub_name, + RadiusServerName_str: "1.2.3.4", + RadiusPort_u32: 1234, + RadiusSecret_str: "microsoft", + RadiusRetryInterval_u32: 1000, + }); + let out_rpc_radius: VPN.VpnRpcRadius = await api.SetHubRadius(in_rpc_radius); + console.log(out_rpc_radius); + console.log("End: Test_SetHubRadius"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumConnection', Enumerate connections */ +async function Test_EnumConnection(): Promise +{ + console.log("Begin: Test_EnumConnection"); + let out_rpc_enum_connection: VPN.VpnRpcEnumConnection = await api.EnumConnection(); + console.log(out_rpc_enum_connection); + console.log("End: Test_EnumConnection"); + console.log("-----"); + console.log(); + return out_rpc_enum_connection; +} + +/** API test for 'DisconnectConnection', Disconnect a connection */ +async function Test_DisconnectConnection(connection_id: string): Promise +{ + console.log("Begin: Test_DisconnectConnection"); + let in_rpc_disconnect_connection: VPN.VpnRpcDisconnectConnection = new VPN.VpnRpcDisconnectConnection( + { + Name_str: connection_id, + }); + let out_rpc_disconnect_connection: VPN.VpnRpcDisconnectConnection = await api.DisconnectConnection(in_rpc_disconnect_connection); + console.log(out_rpc_disconnect_connection); + console.log("End: Test_DisconnectConnection"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetConnectionInfo', Get connection information */ +async function Test_GetConnectionInfo(name: string): Promise +{ + console.log("Begin: Test_GetConnectionInfo"); + let in_rpc_connection_info: VPN.VpnRpcConnectionInfo = new VPN.VpnRpcConnectionInfo( + { + Name_str: name, + }); + let out_rpc_connection_info: VPN.VpnRpcConnectionInfo = await api.GetConnectionInfo(in_rpc_connection_info); + console.log(out_rpc_connection_info); + console.log("End: Test_GetConnectionInfo"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubOnline', Make a hub on-line or off-line */ +async function Test_SetHubOnline(): Promise +{ + console.log("Begin: Test_SetHubOnline"); + let in_rpc_set_hub_online: VPN.VpnRpcSetHubOnline = new VPN.VpnRpcSetHubOnline( + { + HubName_str: hub_name, + Online_bool: true, + }); + let out_rpc_set_hub_online: VPN.VpnRpcSetHubOnline = await api.SetHubOnline(in_rpc_set_hub_online); + console.log(out_rpc_set_hub_online); + console.log("End: Test_SetHubOnline"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubStatus', Get hub status */ +async function Test_GetHubStatus(): Promise +{ + console.log("Begin: Test_GetHubStatus"); + let in_rpc_hub_status: VPN.VpnRpcHubStatus = new VPN.VpnRpcHubStatus( + { + HubName_str: hub_name, + }); + let out_rpc_hub_status: VPN.VpnRpcHubStatus = await api.GetHubStatus(in_rpc_hub_status); + console.log(out_rpc_hub_status); + console.log("End: Test_GetHubStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubLog', Set logging configuration into the hub */ +async function Test_SetHubLog(in_rpc_hub_log: VPN.VpnRpcHubLog): Promise +{ + console.log("Begin: Test_SetHubLog"); + let out_rpc_hub_log: VPN.VpnRpcHubLog = await api.SetHubLog(in_rpc_hub_log); + console.log(out_rpc_hub_log); + console.log("End: Test_SetHubLog"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubLog', Get logging configuration of the hub */ +async function Test_GetHubLog(): Promise +{ + console.log("Begin: Test_GetHubLog"); + let in_rpc_hub_log: VPN.VpnRpcHubLog = new VPN.VpnRpcHubLog( + { + HubName_str: hub_name, + }); + let out_rpc_hub_log: VPN.VpnRpcHubLog = await api.GetHubLog(in_rpc_hub_log); + console.log(out_rpc_hub_log); + console.log("End: Test_GetHubLog"); + console.log("-----"); + console.log(); + return out_rpc_hub_log; +} + +/** API test for 'AddCa', Add CA(Certificate Authority) into the hub */ +async function Test_AddCa(): Promise +{ + console.log("Begin: Test_AddCa"); + let in_rpc_hub_add_ca: VPN.VpnRpcHubAddCA = new VPN.VpnRpcHubAddCA( + { + HubName_str: hub_name, + Cert_bin: new Uint8Array([ 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x72, 0x6a, 0x43, 0x43, 0x41, 0x70, 0x61, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x0a, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x0a, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x48, 0x68, 0x63, 0x4e, 0x4d, 0x54, 0x67, 0x78, 0x4d, 0x44, 0x45, 0x78, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x68, 0x63, 0x4e, 0x4e, 0x44, 0x49, 0x78, 0x4d, 0x44, 0x41, 0x31, 0x0a, 0x4d, 0x6a, 0x4d, 0x7a, 0x4e, 0x54, 0x41, 0x78, 0x57, 0x6a, 0x42, 0x57, 0x4d, 0x51, 0x77, 0x77, 0x43, 0x67, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x4e, 0x68, 0x59, 0x57, 0x45, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x44, 0x4f, 0x4f, 0x42, 0x72, 0x2b, 0x4f, 0x42, 0x71, 0x75, 0x4f, 0x42, 0x6a, 0x2b, 0x4f, 0x42, 0x6e, 0x54, 0x45, 0x4c, 0x0a, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x53, 0x6c, 0x41, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x30, 0x6c, 0x69, 0x59, 0x58, 0x4a, 0x68, 0x61, 0x32, 0x6b, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, 0x4d, 0x42, 0x31, 0x52, 0x7a, 0x64, 0x57, 0x74, 0x31, 0x59, 0x6d, 0x45, 0x77, 0x0a, 0x67, 0x67, 0x45, 0x69, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4b, 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x58, 0x45, 0x63, 0x76, 0x72, 0x59, 0x37, 0x56, 0x2b, 0x7a, 0x64, 0x42, 0x79, 0x72, 0x64, 0x4e, 0x78, 0x4a, 0x59, 0x45, 0x6d, 0x0a, 0x61, 0x41, 0x4e, 0x59, 0x55, 0x4f, 0x37, 0x76, 0x57, 0x34, 0x68, 0x64, 0x41, 0x35, 0x49, 0x42, 0x49, 0x46, 0x6d, 0x4d, 0x70, 0x6e, 0x62, 0x79, 0x69, 0x4e, 0x6e, 0x5a, 0x77, 0x36, 0x57, 0x39, 0x6f, 0x61, 0x67, 0x78, 0x33, 0x5a, 0x49, 0x65, 0x65, 0x48, 0x56, 0x59, 0x62, 0x52, 0x69, 0x4b, 0x36, 0x41, 0x66, 0x46, 0x74, 0x53, 0x31, 0x32, 0x2b, 0x45, 0x31, 0x4d, 0x59, 0x31, 0x64, 0x32, 0x0a, 0x61, 0x71, 0x51, 0x31, 0x53, 0x72, 0x49, 0x43, 0x39, 0x51, 0x35, 0x55, 0x6e, 0x5a, 0x61, 0x42, 0x72, 0x62, 0x57, 0x32, 0x32, 0x6d, 0x4e, 0x75, 0x6c, 0x4d, 0x34, 0x2f, 0x6c, 0x49, 0x4a, 0x72, 0x48, 0x70, 0x51, 0x55, 0x68, 0x50, 0x78, 0x6f, 0x62, 0x79, 0x34, 0x2f, 0x36, 0x4e, 0x41, 0x37, 0x71, 0x4b, 0x67, 0x55, 0x48, 0x69, 0x79, 0x4f, 0x64, 0x33, 0x4a, 0x42, 0x70, 0x4f, 0x66, 0x77, 0x0a, 0x38, 0x54, 0x76, 0x53, 0x74, 0x51, 0x78, 0x34, 0x4c, 0x38, 0x59, 0x64, 0x4b, 0x51, 0x35, 0x68, 0x74, 0x7a, 0x6b, 0x32, 0x68, 0x70, 0x52, 0x4a, 0x4c, 0x30, 0x6c, 0x4b, 0x67, 0x47, 0x31, 0x57, 0x34, 0x75, 0x4b, 0x32, 0x39, 0x39, 0x42, 0x74, 0x7a, 0x64, 0x41, 0x67, 0x66, 0x42, 0x76, 0x43, 0x54, 0x33, 0x41, 0x31, 0x61, 0x53, 0x70, 0x6a, 0x49, 0x47, 0x74, 0x6e, 0x69, 0x72, 0x49, 0x31, 0x0a, 0x46, 0x4c, 0x52, 0x58, 0x47, 0x79, 0x38, 0x31, 0x31, 0x57, 0x4a, 0x39, 0x4a, 0x68, 0x68, 0x34, 0x41, 0x4b, 0x4c, 0x66, 0x79, 0x56, 0x70, 0x42, 0x4a, 0x67, 0x65, 0x34, 0x73, 0x56, 0x72, 0x36, 0x4e, 0x75, 0x75, 0x49, 0x66, 0x32, 0x71, 0x47, 0x31, 0x6f, 0x79, 0x31, 0x30, 0x70, 0x61, 0x51, 0x4e, 0x65, 0x71, 0x32, 0x33, 0x55, 0x47, 0x61, 0x59, 0x74, 0x2f, 0x7a, 0x55, 0x56, 0x4a, 0x77, 0x0a, 0x55, 0x74, 0x30, 0x57, 0x45, 0x6b, 0x58, 0x38, 0x48, 0x4f, 0x63, 0x62, 0x33, 0x75, 0x49, 0x6f, 0x54, 0x6d, 0x61, 0x4f, 0x34, 0x72, 0x48, 0x42, 0x55, 0x4a, 0x71, 0x45, 0x79, 0x39, 0x51, 0x58, 0x7a, 0x53, 0x57, 0x77, 0x43, 0x35, 0x78, 0x45, 0x43, 0x64, 0x37, 0x43, 0x4a, 0x53, 0x53, 0x68, 0x31, 0x30, 0x4f, 0x75, 0x6e, 0x6c, 0x75, 0x4c, 0x32, 0x4d, 0x47, 0x65, 0x5a, 0x47, 0x6e, 0x76, 0x0a, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, 0x67, 0x59, 0x59, 0x77, 0x67, 0x59, 0x4d, 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x41, 0x51, 0x48, 0x2f, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x2f, 0x7a, 0x41, 0x4c, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x51, 0x38, 0x45, 0x42, 0x41, 0x4d, 0x43, 0x41, 0x66, 0x59, 0x77, 0x59, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6c, 0x0a, 0x42, 0x46, 0x77, 0x77, 0x57, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x45, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x43, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x41, 0x77, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x51, 0x47, 0x43, 0x43, 0x73, 0x47, 0x0a, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x46, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x42, 0x67, 0x59, 0x49, 0x4b, 0x77, 0x59, 0x42, 0x42, 0x51, 0x55, 0x48, 0x41, 0x77, 0x63, 0x47, 0x43, 0x43, 0x73, 0x47, 0x41, 0x51, 0x55, 0x46, 0x42, 0x77, 0x4d, 0x49, 0x42, 0x67, 0x67, 0x72, 0x42, 0x67, 0x45, 0x46, 0x42, 0x51, 0x63, 0x44, 0x43, 0x54, 0x41, 0x4e, 0x0a, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x45, 0x41, 0x46, 0x6d, 0x34, 0x37, 0x47, 0x55, 0x70, 0x50, 0x57, 0x35, 0x2b, 0x37, 0x69, 0x46, 0x74, 0x69, 0x6c, 0x6f, 0x6b, 0x35, 0x32, 0x49, 0x6f, 0x54, 0x57, 0x72, 0x74, 0x46, 0x67, 0x32, 0x79, 0x69, 0x36, 0x6b, 0x49, 0x32, 0x69, 0x52, 0x4e, 0x51, 0x0a, 0x4b, 0x75, 0x67, 0x48, 0x55, 0x49, 0x4f, 0x34, 0x4b, 0x53, 0x71, 0x4a, 0x56, 0x42, 0x50, 0x38, 0x61, 0x4b, 0x4f, 0x61, 0x54, 0x5a, 0x47, 0x45, 0x31, 0x4b, 0x4d, 0x68, 0x2f, 0x59, 0x6a, 0x68, 0x36, 0x71, 0x2f, 0x67, 0x50, 0x61, 0x6c, 0x67, 0x64, 0x2f, 0x38, 0x44, 0x6d, 0x72, 0x78, 0x53, 0x4a, 0x6d, 0x55, 0x78, 0x33, 0x62, 0x4e, 0x62, 0x38, 0x52, 0x59, 0x36, 0x70, 0x4b, 0x7a, 0x74, 0x0a, 0x5a, 0x64, 0x75, 0x53, 0x61, 0x53, 0x2b, 0x57, 0x55, 0x30, 0x59, 0x74, 0x2b, 0x6c, 0x47, 0x35, 0x76, 0x56, 0x67, 0x61, 0x70, 0x48, 0x45, 0x71, 0x36, 0x79, 0x71, 0x4c, 0x62, 0x65, 0x56, 0x78, 0x51, 0x4c, 0x75, 0x62, 0x54, 0x69, 0x6e, 0x4f, 0x66, 0x56, 0x56, 0x5a, 0x58, 0x79, 0x45, 0x43, 0x59, 0x47, 0x4d, 0x73, 0x59, 0x71, 0x65, 0x6e, 0x4a, 0x6a, 0x4e, 0x63, 0x62, 0x49, 0x5a, 0x4e, 0x0a, 0x79, 0x4d, 0x75, 0x72, 0x46, 0x63, 0x67, 0x30, 0x34, 0x36, 0x4f, 0x34, 0x59, 0x79, 0x68, 0x56, 0x79, 0x71, 0x53, 0x69, 0x74, 0x43, 0x59, 0x37, 0x68, 0x2f, 0x65, 0x71, 0x67, 0x6b, 0x50, 0x4a, 0x51, 0x30, 0x68, 0x6b, 0x70, 0x39, 0x45, 0x64, 0x51, 0x77, 0x62, 0x6e, 0x38, 0x56, 0x6c, 0x66, 0x78, 0x64, 0x42, 0x58, 0x77, 0x51, 0x34, 0x4e, 0x48, 0x4b, 0x30, 0x4a, 0x56, 0x46, 0x2f, 0x33, 0x0a, 0x71, 0x48, 0x61, 0x68, 0x4e, 0x48, 0x4f, 0x35, 0x64, 0x62, 0x4a, 0x5a, 0x57, 0x59, 0x41, 0x62, 0x42, 0x44, 0x70, 0x32, 0x51, 0x45, 0x53, 0x70, 0x76, 0x6f, 0x2b, 0x38, 0x33, 0x6c, 0x68, 0x34, 0x64, 0x6e, 0x58, 0x6a, 0x46, 0x58, 0x4d, 0x43, 0x48, 0x76, 0x52, 0x68, 0x35, 0x31, 0x79, 0x2f, 0x54, 0x71, 0x79, 0x42, 0x34, 0x56, 0x76, 0x72, 0x52, 0x4b, 0x49, 0x4b, 0x74, 0x54, 0x6f, 0x7a, 0x0a, 0x5a, 0x6a, 0x48, 0x59, 0x49, 0x63, 0x62, 0x6a, 0x76, 0x53, 0x58, 0x4d, 0x7a, 0x61, 0x44, 0x50, 0x6a, 0x50, 0x63, 0x5a, 0x47, 0x6a, 0x42, 0x4a, 0x6c, 0x47, 0x36, 0x43, 0x76, 0x44, 0x34, 0x4c, 0x6d, 0x59, 0x7a, 0x72, 0x6b, 0x48, 0x34, 0x31, 0x63, 0x7a, 0x72, 0x34, 0x57, 0x41, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, ]), + }); + let out_rpc_hub_add_ca: VPN.VpnRpcHubAddCA = await api.AddCa(in_rpc_hub_add_ca); + console.log(out_rpc_hub_add_ca); + console.log("End: Test_AddCa"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumCa', Enumerate CA(Certificate Authority) in the hub */ +async function Test_EnumCa(): Promise +{ + console.log("Begin: Test_EnumCa"); + let in_rpc_hub_enum_ca: VPN.VpnRpcHubEnumCA = new VPN.VpnRpcHubEnumCA( + { + HubName_str: hub_name, + }); + let out_rpc_hub_enum_ca: VPN.VpnRpcHubEnumCA = await api.EnumCa(in_rpc_hub_enum_ca); + console.log(out_rpc_hub_enum_ca); + console.log("End: Test_EnumCa"); + console.log("-----"); + console.log(); + return out_rpc_hub_enum_ca; +} + +/** API test for 'GetCa', Get CA(Certificate Authority) setting from the hub */ +async function Test_GetCa(key: number): Promise +{ + console.log("Begin: Test_GetCa"); + let in_rpc_hub_get_ca: VPN.VpnRpcHubGetCA = new VPN.VpnRpcHubGetCA( + { + HubName_str: hub_name, + Key_u32: key, + }); + let out_rpc_hub_get_ca: VPN.VpnRpcHubGetCA = await api.GetCa(in_rpc_hub_get_ca); + console.log(out_rpc_hub_get_ca); + console.log("End: Test_GetCa"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteCa', Delete a CA(Certificate Authority) setting from the hub */ +async function Test_DeleteCa(key: number): Promise +{ + console.log("Begin: Test_DeleteCa"); + let in_rpc_hub_delete_ca: VPN.VpnRpcHubDeleteCA = new VPN.VpnRpcHubDeleteCA( + { + HubName_str: hub_name, + Key_u32: key, + }); + let out_rpc_hub_delete_ca: VPN.VpnRpcHubDeleteCA = await api.DeleteCa(in_rpc_hub_delete_ca); + console.log(out_rpc_hub_delete_ca); + console.log("End: Test_DeleteCa"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetLinkOnline', Make a link into on-line */ +async function Test_SetLinkOnline(): Promise +{ + console.log("Begin: Test_SetLinkOnline"); + let in_rpc_link: VPN.VpnRpcLink = new VPN.VpnRpcLink( + { + HubName_str: hub_name, + AccountName_utf: "linktest", + }); + let out_rpc_link: VPN.VpnRpcLink = await api.SetLinkOnline(in_rpc_link); + console.log(out_rpc_link); + console.log("End: Test_SetLinkOnline"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetLinkOffline', Make a link into off-line */ +async function Test_SetLinkOffline(): Promise +{ + console.log("Begin: Test_SetLinkOffline"); + let in_rpc_link: VPN.VpnRpcLink = new VPN.VpnRpcLink( + { + HubName_str: hub_name, + AccountName_utf: "linktest", + }); + let out_rpc_link: VPN.VpnRpcLink = await api.SetLinkOffline(in_rpc_link); + console.log(out_rpc_link); + console.log("End: Test_SetLinkOffline"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteLink', Delete a link */ +async function Test_DeleteLink(): Promise +{ + console.log("Begin: Test_DeleteLink"); + let in_rpc_link: VPN.VpnRpcLink = new VPN.VpnRpcLink( + { + HubName_str: hub_name, + AccountName_utf: "linktest2", + }); + let out_rpc_link: VPN.VpnRpcLink = await api.DeleteLink(in_rpc_link); + console.log(out_rpc_link); + console.log("End: Test_DeleteLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'RenameLink', Rename link (cascade connection) */ +async function Test_RenameLink(): Promise +{ + console.log("Begin: Test_RenameLink"); + let in_rpc_rename_link: VPN.VpnRpcRenameLink = new VPN.VpnRpcRenameLink( + { + HubName_str: hub_name, + OldAccountName_utf: "linktest", + NewAccountName_utf: "linktest2", + }); + let out_rpc_rename_link: VPN.VpnRpcRenameLink = await api.RenameLink(in_rpc_rename_link); + console.log(out_rpc_rename_link); + console.log("End: Test_RenameLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateLink', Create a new link(cascade) */ +async function Test_CreateLink(): Promise +{ + console.log("Begin: Test_CreateLink"); + let in_rpc_create_link: VPN.VpnRpcCreateLink = new VPN.VpnRpcCreateLink( + { + HubName_Ex_str: hub_name, + CheckServerCert_bool: false, + AccountName_utf: "linktest", + Hostname_str: "1.2.3.4", + Port_u32: 443, + ProxyType_u32: 0, + HubName_str: "ABC", + MaxConnection_u32: 16, + UseEncrypt_bool: true, + UseCompress_bool: false, + HalfConnection_bool: true, + AdditionalConnectionInterval_u32: 2, + ConnectionDisconnectSpan_u32: 24, + AuthType_u32: VPN.VpnRpcClientAuthType.PlainPassword, + Username_str: "181012", + PlainPassword_str: "microsoft", + HashedPassword_bin: new Uint8Array([ ]), + ClientX_bin: new Uint8Array([ ]), + ClientK_bin: new Uint8Array([ ]), + ["policy:DHCPFilter_bool"]: true, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: true, + SecPol_CheckMac_bool: true, + SecPol_CheckIP_bool: true, + ["policy:ArpDhcpOnly_bool"]: true, + ["policy:PrivacyFilter_bool"]: true, + ["policy:NoServer_bool"]: true, + ["policy:NoBroadcastLimiter_bool"]: true, + ["policy:MaxMac_u32"]: 32, + ["policy:MaxIP_u32"]: 64, + ["policy:MaxUpload_u32"]: 960000, + ["policy:MaxDownload_u32"]: 1280000, + ["policy:RSandRAFilter_bool"]: true, + SecPol_RAFilter_bool: true, + ["policy:DHCPv6Filter_bool"]: true, + ["policy:DHCPv6NoServer_bool"]: true, + SecPol_CheckIPv6_bool: true, + ["policy:NoServerV6_bool"]: true, + ["policy:MaxIPv6_u32"]: 127, + ["policy:FilterIPv4_bool"]: true, + ["policy:FilterIPv6_bool"]: true, + ["policy:FilterNonIP_bool"]: true, + ["policy:NoIPv6DefaultRouterInRA_bool"]: true, + ["policy:VLanId_u32"]: 123, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_create_link: VPN.VpnRpcCreateLink = await api.CreateLink(in_rpc_create_link); + console.log(out_rpc_create_link); + console.log("End: Test_CreateLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetLink', Get link configuration */ +async function Test_GetLink(): Promise +{ + console.log("Begin: Test_GetLink"); + let in_rpc_create_link: VPN.VpnRpcCreateLink = new VPN.VpnRpcCreateLink( + { + HubName_Ex_str: hub_name, + AccountName_utf: "linktest", + }); + let out_rpc_create_link: VPN.VpnRpcCreateLink = await api.GetLink(in_rpc_create_link); + console.log(out_rpc_create_link); + console.log("End: Test_GetLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetLink', Set link configuration */ +async function Test_SetLink(): Promise +{ + console.log("Begin: Test_SetLink"); + let in_rpc_create_link: VPN.VpnRpcCreateLink = new VPN.VpnRpcCreateLink( + { + HubName_Ex_str: hub_name, + CheckServerCert_bool: false, + AccountName_utf: "linktest", + Hostname_str: "1.2.3.4", + Port_u32: 443, + ProxyType_u32: 0, + HubName_str: "ABC", + MaxConnection_u32: 16, + UseEncrypt_bool: true, + UseCompress_bool: false, + HalfConnection_bool: true, + AdditionalConnectionInterval_u32: 2, + ConnectionDisconnectSpan_u32: 24, + AuthType_u32: VPN.VpnRpcClientAuthType.PlainPassword, + Username_str: "181012", + PlainPassword_str: "microsoft", + HashedPassword_bin: new Uint8Array([ ]), + ClientX_bin: new Uint8Array([ ]), + ClientK_bin: new Uint8Array([ ]), + ["policy:DHCPFilter_bool"]: true, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: true, + SecPol_CheckMac_bool: true, + SecPol_CheckIP_bool: true, + ["policy:ArpDhcpOnly_bool"]: true, + ["policy:PrivacyFilter_bool"]: true, + ["policy:NoServer_bool"]: true, + ["policy:NoBroadcastLimiter_bool"]: true, + ["policy:MaxMac_u32"]: 32, + ["policy:MaxIP_u32"]: 64, + ["policy:MaxUpload_u32"]: 960000, + ["policy:MaxDownload_u32"]: 1280000, + ["policy:RSandRAFilter_bool"]: true, + SecPol_RAFilter_bool: true, + ["policy:DHCPv6Filter_bool"]: true, + ["policy:DHCPv6NoServer_bool"]: true, + SecPol_CheckIPv6_bool: true, + ["policy:NoServerV6_bool"]: true, + ["policy:MaxIPv6_u32"]: 127, + ["policy:FilterIPv4_bool"]: true, + ["policy:FilterIPv6_bool"]: true, + ["policy:FilterNonIP_bool"]: true, + ["policy:NoIPv6DefaultRouterInRA_bool"]: true, + ["policy:VLanId_u32"]: 123, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_create_link: VPN.VpnRpcCreateLink = await api.SetLink(in_rpc_create_link); + console.log(out_rpc_create_link); + console.log("End: Test_SetLink"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumLink', Enumerate links */ +async function Test_EnumLink(): Promise +{ + console.log("Begin: Test_EnumLink"); + let in_rpc_enum_link: VPN.VpnRpcEnumLink = new VPN.VpnRpcEnumLink( + { + HubName_str: hub_name, + }); + let out_rpc_enum_link: VPN.VpnRpcEnumLink = await api.EnumLink(in_rpc_enum_link); + console.log(out_rpc_enum_link); + console.log("End: Test_EnumLink"); + console.log("-----"); + console.log(); + return out_rpc_enum_link; +} + +/** API test for 'GetLinkStatus', Get link status */ +async function Test_GetLinkStatus(name: string): Promise +{ + console.log("Begin: Test_GetLinkStatus"); + let in_rpc_link_status: VPN.VpnRpcLinkStatus = new VPN.VpnRpcLinkStatus( + { + HubName_Ex_str: hub_name, + AccountName_utf: name, + }); + let out_rpc_link_status: VPN.VpnRpcLinkStatus = await api.GetLinkStatus(in_rpc_link_status); + console.log(out_rpc_link_status); + console.log("End: Test_GetLinkStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddAccess', Add access list entry */ +async function Test_AddAccess(): Promise +{ + console.log("Begin: Test_AddAccess"); + let in_rpc_add_access_ipv4: VPN.VpnRpcAddAccess = new VPN.VpnRpcAddAccess( + { + HubName_str: hub_name, + AccessListSingle: [ new VPN.VpnAccess( + { + Note_utf: "IPv4 Test", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: false, + SrcIpAddress_ip: "192.168.0.0", + SrcSubnetMask_ip: "255.255.255.0", + DestIpAddress_ip: "10.0.0.0", + DestSubnetMask_ip: "255.255.0.0", + Protocol_u32: VPN.VpnIpProtocolNumber.TCP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([ 1, 2, 3, 0, 0, 0, ]), + SrcMacMask_bin: new Uint8Array([ 255, 255, 255, 0, 0, 0, ]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho", + }), ], + }); + let out_rpc_add_access_ipv4: VPN.VpnRpcAddAccess = await api.AddAccess(in_rpc_add_access_ipv4); + let in_rpc_add_access_ipv6: VPN.VpnRpcAddAccess = new VPN.VpnRpcAddAccess( + { + HubName_str: hub_name, + AccessListSingle: [ new VPN.VpnAccess( + { + Note_utf: "IPv6 Test", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: true, + SrcIpAddress6_bin: new Uint8Array([ 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), + SrcSubnetMask6_bin: new Uint8Array([ 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), + Protocol_u32: VPN.VpnIpProtocolNumber.UDP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([ 1, 2, 3, 0, 0, 0, ]), + SrcMacMask_bin: new Uint8Array([ 255, 255, 255, 0, 0, 0, ]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho", + }), ], + }); + let out_rpc_add_access_ipv6: VPN.VpnRpcAddAccess = await api.AddAccess(in_rpc_add_access_ipv6); + console.log("End: Test_AddAccess"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteAccess', Delete access list entry */ +async function Test_DeleteAccess(): Promise +{ + console.log("Begin: Test_DeleteAccess"); + let in_rpc_delete_access: VPN.VpnRpcDeleteAccess = new VPN.VpnRpcDeleteAccess( + { + HubName_str: hub_name, + Id_u32: 1, + }); + let out_rpc_delete_access: VPN.VpnRpcDeleteAccess = await api.DeleteAccess(in_rpc_delete_access); + console.log(out_rpc_delete_access); + console.log("End: Test_DeleteAccess"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumAccess', Get access list */ +async function Test_EnumAccess(): Promise +{ + console.log("Begin: Test_EnumAccess"); + let in_rpc_enum_access_list: VPN.VpnRpcEnumAccessList = new VPN.VpnRpcEnumAccessList( + { + HubName_str: hub_name, + }); + let out_rpc_enum_access_list: VPN.VpnRpcEnumAccessList = await api.EnumAccess(in_rpc_enum_access_list); + console.log(out_rpc_enum_access_list); + console.log("End: Test_EnumAccess"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetAccessList', Set access list */ +async function Test_SetAccessList(): Promise +{ + console.log("Begin: Test_SetAccessList"); + let in_rpc_enum_access_list: VPN.VpnRpcEnumAccessList = new VPN.VpnRpcEnumAccessList( + { + HubName_str: hub_name, + AccessList: [ new VPN.VpnAccess( + { + Note_utf: "IPv4 Test 2", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: false, + SrcIpAddress_ip: "192.168.0.0", + SrcSubnetMask_ip: "255.255.255.0", + DestIpAddress_ip: "10.0.0.0", + DestSubnetMask_ip: "255.255.0.0", + Protocol_u32: VPN.VpnIpProtocolNumber.TCP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([ 1, 2, 3, 0, 0, 0, ]), + SrcMacMask_bin: new Uint8Array([ 255, 255, 255, 0, 0, 0, ]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho", + }), new VPN.VpnAccess( + { + Note_utf: "IPv6 Test 2", + Active_bool: true, + Priority_u32: 100, + Discard_bool: true, + IsIPv6_bool: true, + SrcIpAddress6_bin: new Uint8Array([ 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), + SrcSubnetMask6_bin: new Uint8Array([ 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), + Protocol_u32: VPN.VpnIpProtocolNumber.UDP, + SrcPortStart_u32: 123, + SrcPortEnd_u32: 456, + DestPortStart_u32: 555, + DestPortEnd_u32: 666, + SrcUsername_str: "dnobori", + DestUsername_str: "nekosan", + CheckSrcMac_bool: true, + SrcMacAddress_bin: new Uint8Array([ 1, 2, 3, 0, 0, 0, ]), + SrcMacMask_bin: new Uint8Array([ 255, 255, 255, 0, 0, 0, ]), + CheckTcpState_bool: true, + Established_bool: true, + Delay_u32: 10, + Jitter_u32: 20, + Loss_u32: 30, + RedirectUrl_str: "aho", + }), ], + }); + let out_rpc_enum_access_list: VPN.VpnRpcEnumAccessList = await api.SetAccessList(in_rpc_enum_access_list); + console.log(out_rpc_enum_access_list); + console.log("End: Test_SetAccessList"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateUser', Create a user */ +async function Test_CreateUser(): Promise +{ + console.log("Begin: Test_CreateUser"); + let in_rpc_set_user: VPN.VpnRpcSetUser = new VPN.VpnRpcSetUser( + { + HubName_str: hub_name, + Name_str: "test1", + Realname_utf: "Cat man", + Note_utf: "Hey!!!", + AuthType_u32: VPN.VpnRpcUserAuthType.Password, + Auth_Password_str: "microsoft", + UserX_bin: new Uint8Array([ ]), + Serial_bin: new Uint8Array([ ]), + CommonName_utf: "", + RadiusUsername_utf: "", + NtUsername_utf: "", + ExpireTime_dt: new Date(2019, 1, 1), + UsePolicy_bool: true, + ["policy:Access_bool"]: true, + ["policy:DHCPFilter_bool"]: false, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: false, + ["policy:NoBridge_bool"]: false, + ["policy:NoRouting_bool"]: false, + ["policy:CheckMac_bool"]: false, + ["policy:CheckIP_bool"]: false, + ["policy:ArpDhcpOnly_bool"]: false, + ["policy:PrivacyFilter_bool"]: false, + ["policy:NoServer_bool"]: false, + ["policy:NoBroadcastLimiter_bool"]: false, + ["policy:MonitorPort_bool"]: false, + ["policy:MaxConnection_u32"]: 32, + ["policy:TimeOut_u32"]: 15, + ["policy:MaxMac_u32"]: 1000, + ["policy:MaxIP_u32"]: 1000, + ["policy:MaxUpload_u32"]: 1000000000, + ["policy:MaxDownload_u32"]: 1000000000, + ["policy:FixPassword_bool"]: false, + ["policy:MultiLogins_u32"]: 1000, + ["policy:NoQoS_bool"]: false, + ["policy:RSandRAFilter_bool"]: false, + ["policy:RAFilter_bool"]: false, + ["policy:DHCPv6Filter_bool"]: false, + ["policy:DHCPv6NoServer_bool"]: false, + ["policy:NoRoutingV6_bool"]: false, + ["policy:CheckIPv6_bool"]: false, + ["policy:NoServerV6_bool"]: false, + ["policy:MaxIPv6_u32"]: 1234, + ["policy:NoSavePassword_bool"]: false, + ["policy:AutoDisconnect_u32"]: 0, + ["policy:FilterIPv4_bool"]: false, + ["policy:FilterIPv6_bool"]: false, + ["policy:FilterNonIP_bool"]: false, + ["policy:NoIPv6DefaultRouterInRA_bool"]: false, + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: false, + ["policy:VLanId_u32"]: 0, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_set_user: VPN.VpnRpcSetUser = await api.CreateUser(in_rpc_set_user); + console.log("End: Test_CreateUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetUser', Set user setting */ +async function Test_SetUser(): Promise +{ + console.log("Begin: Test_SetUser"); + let in_rpc_set_user: VPN.VpnRpcSetUser = new VPN.VpnRpcSetUser( + { + HubName_str: hub_name, + Name_str: "test1", + Realname_utf: "Cat man", + Note_utf: "Hey!!!", + GroupName_str: "group1", + AuthType_u32: VPN.VpnRpcUserAuthType.Anonymous, + Auth_Password_str: "", + UserX_bin: new Uint8Array([ ]), + Serial_bin: new Uint8Array([ ]), + CommonName_utf: "", + RadiusUsername_utf: "", + NtUsername_utf: "", + ExpireTime_dt: new Date(2019, 1, 1), + UsePolicy_bool: true, + ["policy:Access_bool"]: true, + ["policy:DHCPFilter_bool"]: false, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: false, + ["policy:NoBridge_bool"]: false, + ["policy:NoRouting_bool"]: false, + ["policy:CheckMac_bool"]: false, + ["policy:CheckIP_bool"]: false, + ["policy:ArpDhcpOnly_bool"]: false, + ["policy:PrivacyFilter_bool"]: false, + ["policy:NoServer_bool"]: false, + ["policy:NoBroadcastLimiter_bool"]: false, + ["policy:MonitorPort_bool"]: false, + ["policy:MaxConnection_u32"]: 32, + ["policy:TimeOut_u32"]: 15, + ["policy:MaxMac_u32"]: 1000, + ["policy:MaxIP_u32"]: 1000, + ["policy:MaxUpload_u32"]: 1000000000, + ["policy:MaxDownload_u32"]: 1000000000, + ["policy:FixPassword_bool"]: false, + ["policy:MultiLogins_u32"]: 1000, + ["policy:NoQoS_bool"]: false, + ["policy:RSandRAFilter_bool"]: false, + ["policy:RAFilter_bool"]: false, + ["policy:DHCPv6Filter_bool"]: false, + ["policy:DHCPv6NoServer_bool"]: false, + ["policy:NoRoutingV6_bool"]: false, + ["policy:CheckIPv6_bool"]: false, + ["policy:NoServerV6_bool"]: false, + ["policy:MaxIPv6_u32"]: 1234, + ["policy:NoSavePassword_bool"]: false, + ["policy:AutoDisconnect_u32"]: 0, + ["policy:FilterIPv4_bool"]: false, + ["policy:FilterIPv6_bool"]: false, + ["policy:FilterNonIP_bool"]: false, + ["policy:NoIPv6DefaultRouterInRA_bool"]: false, + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: false, + ["policy:VLanId_u32"]: 0, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_set_user: VPN.VpnRpcSetUser = await api.SetUser(in_rpc_set_user); + console.log("End: Test_SetUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetUser', Get user setting */ +async function Test_GetUser(): Promise +{ + console.log("Begin: Test_GetUser"); + let in_rpc_set_user: VPN.VpnRpcSetUser = new VPN.VpnRpcSetUser( + { + HubName_str: hub_name, + Name_str: "test1", + }); + let out_rpc_set_user: VPN.VpnRpcSetUser = await api.GetUser(in_rpc_set_user); + console.log(out_rpc_set_user); + console.log("End: Test_GetUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteUser', Delete a user */ +async function Test_DeleteUser(): Promise +{ + console.log("Begin: Test_DeleteUser"); + let in_rpc_delete_user: VPN.VpnRpcDeleteUser = new VPN.VpnRpcDeleteUser( + { + HubName_str: hub_name, + Name_str: "test1", + }); + let out_rpc_delete_user: VPN.VpnRpcDeleteUser = await api.DeleteUser(in_rpc_delete_user); + console.log("End: Test_DeleteUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumUser', Enumerate users */ +async function Test_EnumUser(): Promise +{ + console.log("Begin: Test_EnumUser"); + let in_rpc_enum_user: VPN.VpnRpcEnumUser = new VPN.VpnRpcEnumUser( + { + HubName_str: hub_name, + }); + let out_rpc_enum_user: VPN.VpnRpcEnumUser = await api.EnumUser(in_rpc_enum_user); + console.log(out_rpc_enum_user); + console.log("End: Test_EnumUser"); + console.log("-----"); + console.log(); +} + +/** API test for 'CreateGroup', Create a group */ +async function Test_CreateGroup(): Promise +{ + console.log("Begin: Test_CreateGroup"); + let in_rpc_set_group: VPN.VpnRpcSetGroup = new VPN.VpnRpcSetGroup( + { + HubName_str: hub_name, + Name_str: "group1", + Realname_utf: "Cat group", + Note_utf: "This is it! This is it!!", + UsePolicy_bool: true, + ["policy:Access_bool"]: true, + ["policy:DHCPFilter_bool"]: false, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: false, + ["policy:NoBridge_bool"]: false, + ["policy:NoRouting_bool"]: false, + ["policy:CheckMac_bool"]: false, + ["policy:CheckIP_bool"]: false, + ["policy:ArpDhcpOnly_bool"]: false, + ["policy:PrivacyFilter_bool"]: false, + ["policy:NoServer_bool"]: false, + ["policy:NoBroadcastLimiter_bool"]: false, + ["policy:MonitorPort_bool"]: false, + ["policy:MaxConnection_u32"]: 32, + ["policy:TimeOut_u32"]: 15, + ["policy:MaxMac_u32"]: 1000, + ["policy:MaxIP_u32"]: 1000, + ["policy:MaxUpload_u32"]: 1000000000, + ["policy:MaxDownload_u32"]: 1000000000, + ["policy:FixPassword_bool"]: false, + ["policy:MultiLogins_u32"]: 1000, + ["policy:NoQoS_bool"]: false, + ["policy:RSandRAFilter_bool"]: false, + ["policy:RAFilter_bool"]: false, + ["policy:DHCPv6Filter_bool"]: false, + ["policy:DHCPv6NoServer_bool"]: false, + ["policy:NoRoutingV6_bool"]: false, + ["policy:CheckIPv6_bool"]: false, + ["policy:NoServerV6_bool"]: false, + ["policy:MaxIPv6_u32"]: 1234, + ["policy:NoSavePassword_bool"]: false, + ["policy:AutoDisconnect_u32"]: 0, + ["policy:FilterIPv4_bool"]: false, + ["policy:FilterIPv6_bool"]: false, + ["policy:FilterNonIP_bool"]: false, + ["policy:NoIPv6DefaultRouterInRA_bool"]: false, + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: false, + ["policy:VLanId_u32"]: 0, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_set_group: VPN.VpnRpcSetGroup = await api.CreateGroup(in_rpc_set_group); + console.log(out_rpc_set_group); + console.log("End: Test_CreateGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetGroup', Set group setting */ +async function Test_SetGroup(): Promise +{ + console.log("Begin: Test_SetGroup"); + let in_rpc_set_group: VPN.VpnRpcSetGroup = new VPN.VpnRpcSetGroup( + { + HubName_str: hub_name, + Name_str: "group1", + Realname_utf: "Cat group 2", + Note_utf: "This is it! This is it!! 2", + UsePolicy_bool: true, + ["policy:Access_bool"]: true, + ["policy:DHCPFilter_bool"]: false, + ["policy:DHCPNoServer_bool"]: true, + ["policy:DHCPForce_bool"]: false, + ["policy:NoBridge_bool"]: false, + ["policy:NoRouting_bool"]: false, + ["policy:CheckMac_bool"]: false, + ["policy:CheckIP_bool"]: false, + ["policy:ArpDhcpOnly_bool"]: false, + ["policy:PrivacyFilter_bool"]: false, + ["policy:NoServer_bool"]: false, + ["policy:NoBroadcastLimiter_bool"]: false, + ["policy:MonitorPort_bool"]: false, + ["policy:MaxConnection_u32"]: 32, + ["policy:TimeOut_u32"]: 15, + ["policy:MaxMac_u32"]: 1000, + ["policy:MaxIP_u32"]: 1000, + ["policy:MaxUpload_u32"]: 1000000000, + ["policy:MaxDownload_u32"]: 1000000000, + ["policy:FixPassword_bool"]: false, + ["policy:MultiLogins_u32"]: 1000, + ["policy:NoQoS_bool"]: false, + ["policy:RSandRAFilter_bool"]: false, + ["policy:RAFilter_bool"]: false, + ["policy:DHCPv6Filter_bool"]: false, + ["policy:DHCPv6NoServer_bool"]: false, + ["policy:NoRoutingV6_bool"]: false, + ["policy:CheckIPv6_bool"]: false, + ["policy:NoServerV6_bool"]: false, + ["policy:MaxIPv6_u32"]: 1234, + ["policy:NoSavePassword_bool"]: false, + ["policy:AutoDisconnect_u32"]: 0, + ["policy:FilterIPv4_bool"]: false, + ["policy:FilterIPv6_bool"]: false, + ["policy:FilterNonIP_bool"]: false, + ["policy:NoIPv6DefaultRouterInRA_bool"]: false, + ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: false, + ["policy:VLanId_u32"]: 0, + ["policy:Ver3_bool"]: true, + }); + let out_rpc_set_group: VPN.VpnRpcSetGroup = await api.SetGroup(in_rpc_set_group); + console.log(out_rpc_set_group); + console.log("End: Test_SetGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetGroup', Get group information */ +async function Test_GetGroup(): Promise +{ + console.log("Begin: Test_GetGroup"); + let in_rpc_set_group: VPN.VpnRpcSetGroup = new VPN.VpnRpcSetGroup( + { + HubName_str: hub_name, + Name_str: "group1", + }); + let out_rpc_set_group: VPN.VpnRpcSetGroup = await api.GetGroup(in_rpc_set_group); + console.log(out_rpc_set_group); + console.log("End: Test_GetGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteGroup', Delete a group */ +async function Test_DeleteGroup(): Promise +{ + console.log("Begin: Test_DeleteGroup"); + let in_rpc_delete_user: VPN.VpnRpcDeleteUser = new VPN.VpnRpcDeleteUser( + { + HubName_str: hub_name, + Name_str: "group1", + }); + let out_rpc_delete_user: VPN.VpnRpcDeleteUser = await api.DeleteGroup(in_rpc_delete_user); + console.log(out_rpc_delete_user); + console.log("End: Test_DeleteGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumGroup', Enumerate groups */ +async function Test_EnumGroup(): Promise +{ + console.log("Begin: Test_EnumGroup"); + let in_rpc_enum_group: VPN.VpnRpcEnumGroup = new VPN.VpnRpcEnumGroup( + { + HubName_str: hub_name, + }); + let out_rpc_enum_group: VPN.VpnRpcEnumGroup = await api.EnumGroup(in_rpc_enum_group); + console.log(out_rpc_enum_group); + console.log("End: Test_EnumGroup"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumSession', Enumerate sessions */ +async function Test_EnumSession(): Promise +{ + console.log("Begin: Test_EnumSession"); + let in_rpc_enum_session: VPN.VpnRpcEnumSession = new VPN.VpnRpcEnumSession( + { + HubName_str: hub_name, + }); + let out_rpc_enum_session: VPN.VpnRpcEnumSession = await api.EnumSession(in_rpc_enum_session); + console.log(out_rpc_enum_session); + console.log("End: Test_EnumSession"); + console.log("-----"); + console.log(); + return out_rpc_enum_session; +} + +/** API test for 'GetSessionStatus', Get session status */ +async function Test_GetSessionStatus(session_name: string): Promise +{ + console.log("Begin: Test_GetSessionStatus"); + let in_rpc_session_status: VPN.VpnRpcSessionStatus = new VPN.VpnRpcSessionStatus( + { + HubName_str: hub_name, + Name_str: session_name, + }); + let out_rpc_session_status: VPN.VpnRpcSessionStatus = await api.GetSessionStatus(in_rpc_session_status); + console.log(out_rpc_session_status); + console.log("End: Test_GetSessionStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteSession', Delete a session */ +async function Test_DeleteSession(session_id: string): Promise +{ + console.log("Begin: Test_DeleteSession"); + let in_rpc_delete_session: VPN.VpnRpcDeleteSession = new VPN.VpnRpcDeleteSession( + { + HubName_str: hub_name, + Name_str: session_id, + }); + let out_rpc_delete_session: VPN.VpnRpcDeleteSession = await api.DeleteSession(in_rpc_delete_session); + console.log(out_rpc_delete_session); + console.log("End: Test_DeleteSession"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumMacTable', Get MAC address table */ +async function Test_EnumMacTable(): Promise +{ + console.log("Begin: Test_EnumMacTable"); + let in_rpc_enum_mac_table: VPN.VpnRpcEnumMacTable = new VPN.VpnRpcEnumMacTable( + { + HubName_str: hub_name, + }); + let out_rpc_enum_mac_table: VPN.VpnRpcEnumMacTable = await api.EnumMacTable(in_rpc_enum_mac_table); + console.log(out_rpc_enum_mac_table); + console.log("End: Test_EnumMacTable"); + console.log("-----"); + console.log(); + return out_rpc_enum_mac_table; +} + +/** API test for 'DeleteMacTable', Delete MAC address table entry */ +async function Test_DeleteMacTable(key32: number): Promise +{ + console.log("Begin: Test_DeleteMacTable"); + let in_rpc_delete_table: VPN.VpnRpcDeleteTable = new VPN.VpnRpcDeleteTable( + { + HubName_str: hub_name, + Key_u32: key32, + }); + let out_rpc_delete_table: VPN.VpnRpcDeleteTable = await api.DeleteMacTable(in_rpc_delete_table); + console.log("End: Test_DeleteMacTable"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumIpTable', Get IP address table */ +async function Test_EnumIpTable(): Promise +{ + console.log("Begin: Test_EnumIpTable"); + let in_rpc_enum_ip_table: VPN.VpnRpcEnumIpTable = new VPN.VpnRpcEnumIpTable( + { + HubName_str: hub_name, + }); + let out_rpc_enum_ip_table: VPN.VpnRpcEnumIpTable = await api.EnumIpTable(in_rpc_enum_ip_table); + console.log(out_rpc_enum_ip_table); + console.log("End: Test_EnumIpTable"); + console.log("-----"); + console.log(); + return out_rpc_enum_ip_table; +} + +/** API test for 'DeleteIpTable', Delete IP address table entry */ +async function Test_DeleteIpTable(key32: number): Promise +{ + console.log("Begin: Test_DeleteIpTable"); + let in_rpc_delete_table: VPN.VpnRpcDeleteTable = new VPN.VpnRpcDeleteTable( + { + HubName_str: hub_name, + Key_u32: key32, + }); + let out_rpc_delete_table: VPN.VpnRpcDeleteTable = await api.DeleteIpTable(in_rpc_delete_table); + console.log(out_rpc_delete_table); + console.log("End: Test_DeleteIpTable"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetKeep', Set keep-alive function setting */ +async function Test_SetKeep(): Promise +{ + console.log("Begin: Test_SetKeep"); + let in_rpc_keep: VPN.VpnRpcKeep = new VPN.VpnRpcKeep( + { + UseKeepConnect_bool: true, + KeepConnectHost_str: "www.softether.org", + KeepConnectPort_u32: 123, + KeepConnectProtocol_u32: VPN.VpnRpcKeepAliveProtocol.UDP, + KeepConnectInterval_u32: 1, + }); + let out_rpc_keep: VPN.VpnRpcKeep = await api.SetKeep(in_rpc_keep); + console.log(out_rpc_keep); + console.log("End: Test_SetKeep"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetKeep', Get keep-alive function setting */ +async function Test_GetKeep(): Promise +{ + console.log("Begin: Test_GetKeep"); + let in_rpc_keep: VPN.VpnRpcKeep = new VPN.VpnRpcKeep( + { + }); + let out_rpc_keep: VPN.VpnRpcKeep = await api.GetKeep(in_rpc_keep); + console.log(out_rpc_keep); + console.log("End: Test_GetKeep"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnableSecureNAT', Enable SecureNAT function of the hub */ +async function Test_EnableSecureNAT(): Promise +{ + console.log("Begin: Test_EnableSecureNAT"); + let in_rpc_hub: VPN.VpnRpcHub = new VPN.VpnRpcHub( + { + HubName_str: hub_name, + }); + let out_rpc_hub: VPN.VpnRpcHub = await api.EnableSecureNAT(in_rpc_hub); + console.log(out_rpc_hub); + console.log("End: Test_EnableSecureNAT"); + console.log("-----"); + console.log(); +} + +/** API test for 'DisableSecureNAT', Disable the SecureNAT function of the hub */ +async function Test_DisableSecureNAT(): Promise +{ + console.log("Begin: Test_DisableSecureNAT"); + let in_rpc_hub: VPN.VpnRpcHub = new VPN.VpnRpcHub( + { + HubName_str: hub_name, + }); + let out_rpc_hub: VPN.VpnRpcHub = await api.DisableSecureNAT(in_rpc_hub); + console.log(out_rpc_hub); + console.log("End: Test_DisableSecureNAT"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetSecureNATOption', Set SecureNAT options */ +async function Test_SetSecureNATOption(): Promise +{ + console.log("Begin: Test_SetSecureNATOption"); + let in_vh_option: VPN.VpnVhOption = new VPN.VpnVhOption( + { + RpcHubName_str: hub_name, + MacAddress_bin: new Uint8Array([ 0x00, 0xAC, 0x00, 0x11, 0x22, 0x33, ]), + Ip_ip: "10.0.0.254", + Mask_ip: "255.255.255.0", + UseNat_bool: true, + Mtu_u32: 1200, + NatTcpTimeout_u32: 100, + NatUdpTimeout_u32: 50, + UseDhcp_bool: true, + DhcpLeaseIPStart_ip: "10.0.0.101", + DhcpLeaseIPEnd_ip: "10.0.0.199", + DhcpSubnetMask_ip: "255.255.255.0", + DhcpExpireTimeSpan_u32: 3600, + DhcpGatewayAddress_ip: "10.0.0.254", + DhcpDnsServerAddress_ip: "10.0.0.254", + DhcpDnsServerAddress2_ip: "8.8.8.8", + DhcpDomainName_str: "lab.coe.ad.jp", + SaveLog_bool: true, + ApplyDhcpPushRoutes_bool: false, + DhcpPushRoutes_str: "", + }); + let out_vh_option: VPN.VpnVhOption = await api.SetSecureNATOption(in_vh_option); + console.log(out_vh_option); + console.log("End: Test_SetSecureNATOption"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetSecureNATOption', Get SecureNAT options */ +async function Test_GetSecureNATOption(): Promise +{ + console.log("Begin: Test_GetSecureNATOption"); + let in_vh_option: VPN.VpnVhOption = new VPN.VpnVhOption( + { + RpcHubName_str: hub_name, + }); + let out_vh_option: VPN.VpnVhOption = await api.GetSecureNATOption(in_vh_option); + console.log(out_vh_option); + console.log("End: Test_GetSecureNATOption"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumNAT', Enumerate NAT entries of the SecureNAT */ +async function Test_EnumNAT(): Promise +{ + console.log("Begin: Test_EnumNAT"); + let in_rpc_enum_nat: VPN.VpnRpcEnumNat = new VPN.VpnRpcEnumNat( + { + HubName_str: hub_name, + }); + let out_rpc_enum_nat: VPN.VpnRpcEnumNat = await api.EnumNAT(in_rpc_enum_nat); + console.log(out_rpc_enum_nat); + console.log("End: Test_EnumNAT"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumDHCP', Enumerate DHCP entries */ +async function Test_EnumDHCP(): Promise +{ + console.log("Begin: Test_EnumDHCP"); + let in_rpc_enum_dhcp: VPN.VpnRpcEnumDhcp = new VPN.VpnRpcEnumDhcp( + { + HubName_str: hub_name, + }); + let out_rpc_enum_dhcp: VPN.VpnRpcEnumDhcp = await api.EnumDHCP(in_rpc_enum_dhcp); + console.log(out_rpc_enum_dhcp); + console.log("End: Test_EnumDHCP"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetSecureNATStatus', Get status of the SecureNAT */ +async function Test_GetSecureNATStatus(): Promise +{ + console.log("Begin: Test_GetSecureNATStatus"); + let in_rpc_nat_status: VPN.VpnRpcNatStatus = new VPN.VpnRpcNatStatus( + { + HubName_str: hub_name, + }); + let out_rpc_nat_status: VPN.VpnRpcNatStatus = await api.GetSecureNATStatus(in_rpc_nat_status); + console.log(out_rpc_nat_status); + console.log("End: Test_GetSecureNATStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumEthernet', Enumerate Ethernet devices */ +async function Test_EnumEthernet(): Promise +{ + console.log("Begin: Test_EnumEthernet"); + let out_rpc_enum_eth: VPN.VpnRpcEnumEth = await api.EnumEthernet(); + console.log(out_rpc_enum_eth); + console.log("End: Test_EnumEthernet"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddLocalBridge', Add a new local bridge */ +async function Test_AddLocalBridge(): Promise +{ + console.log("Begin: Test_AddLocalBridge"); + let in_rpc_localbridge: VPN.VpnRpcLocalBridge = new VPN.VpnRpcLocalBridge( + { + DeviceName_str: "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str: hub_name, + }); + let out_rpc_localbridge: VPN.VpnRpcLocalBridge = await api.AddLocalBridge(in_rpc_localbridge); + console.log(out_rpc_localbridge); + console.log("End: Test_AddLocalBridge"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteLocalBridge', Delete a local bridge */ +async function Test_DeleteLocalBridge(): Promise +{ + console.log("Begin: Test_DeleteLocalBridge"); + let in_rpc_localbridge: VPN.VpnRpcLocalBridge = new VPN.VpnRpcLocalBridge( + { + DeviceName_str: "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str: hub_name, + }); + let out_rpc_localbridge: VPN.VpnRpcLocalBridge = await api.DeleteLocalBridge(in_rpc_localbridge); + console.log(out_rpc_localbridge); + console.log("End: Test_DeleteLocalBridge"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumLocalBridge', Enumerate local bridges */ +async function Test_EnumLocalBridge(): Promise +{ + console.log("Begin: Test_EnumLocalBridge"); + let out_rpc_enum_localbridge: VPN.VpnRpcEnumLocalBridge = await api.EnumLocalBridge(); + console.log(out_rpc_enum_localbridge); + console.log("End: Test_EnumLocalBridge"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetBridgeSupport', Get availability to localbridge function */ +async function Test_GetBridgeSupport(): Promise +{ + console.log("Begin: Test_GetBridgeSupport"); + let out_rpc_bridge_support: VPN.VpnRpcBridgeSupport = await api.GetBridgeSupport(); + console.log(out_rpc_bridge_support); + console.log("End: Test_GetBridgeSupport"); + console.log("-----"); + console.log(); +} + +/** API test for 'RebootServer', Reboot server itself */ +async function Test_RebootServer(): Promise +{ + console.log("Begin: Test_RebootServer"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + }); + let out_rpc_test: VPN.VpnRpcTest = await api.RebootServer(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_RebootServer"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetCaps', Get capabilities */ +async function Test_GetCaps(): Promise +{ + console.log("Begin: Test_GetCaps"); + let out_capslist: VPN.VpnCapslist = await api.GetCaps(); + console.log(out_capslist); + console.log("End: Test_GetCaps"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetConfig', Get configuration file stream */ +async function Test_GetConfig(): Promise +{ + console.log("Begin: Test_GetConfig"); + let out_rpc_config: VPN.VpnRpcConfig = await api.GetConfig(); + console.log(out_rpc_config); + console.log("End: Test_GetConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetConfig', Overwrite configuration file by specified data */ +async function Test_SetConfig(): Promise +{ + console.log("Begin: Test_SetConfig"); + let in_rpc_config: VPN.VpnRpcConfig = new VPN.VpnRpcConfig( + { + FileData_bin: new Uint8Array([ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, ]), + }); + let out_rpc_config: VPN.VpnRpcConfig = await api.SetConfig(in_rpc_config); + console.log("End: Test_SetConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetDefaultHubAdminOptions', Get default hub administration options */ +async function Test_GetDefaultHubAdminOptions(): Promise +{ + console.log("Begin: Test_GetDefaultHubAdminOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.GetDefaultHubAdminOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_GetDefaultHubAdminOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubAdminOptions', Get hub administration options */ +async function Test_GetHubAdminOptions(): Promise +{ + console.log("Begin: Test_GetHubAdminOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.GetHubAdminOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_GetHubAdminOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubAdminOptions', Set hub administration options */ +async function Test_SetHubAdminOptions(): Promise +{ + console.log("Begin: Test_SetHubAdminOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + AdminOptionList: [ new VPN.VpnAdminOption( + { + Name_str: "no_securenat_enablenat", + Value_u32: 1, + }), ], + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.SetHubAdminOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_SetHubAdminOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubExtOptions', Get hub extended options */ +async function Test_GetHubExtOptions(): Promise +{ + console.log("Begin: Test_GetHubExtOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.GetHubExtOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_GetHubExtOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubExtOptions', Set hub extended options */ +async function Test_SetHubExtOptions(): Promise +{ + console.log("Begin: Test_SetHubExtOptions"); + let in_rpc_admin_option: VPN.VpnRpcAdminOption = new VPN.VpnRpcAdminOption( + { + HubName_str: hub_name, + AdminOptionList: [ new VPN.VpnAdminOption( + { + Name_str: "SecureNAT_RandomizeAssignIp", + Value_u32: 1, + }), ], + }); + let out_rpc_admin_option: VPN.VpnRpcAdminOption = await api.SetHubExtOptions(in_rpc_admin_option); + console.log(out_rpc_admin_option); + console.log("End: Test_SetHubExtOptions"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddL3Switch', Add a new virtual layer-3 switch */ +async function Test_AddL3Switch(): Promise +{ + console.log("Begin: Test_AddL3Switch"); + let in_rpc_l3sw: VPN.VpnRpcL3Sw = new VPN.VpnRpcL3Sw( + { + Name_str: "L3SW1", + }); + let out_rpc_l3sw: VPN.VpnRpcL3Sw = await api.AddL3Switch(in_rpc_l3sw); + console.log(out_rpc_l3sw); + console.log("End: Test_AddL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'DelL3Switch', Delete a virtual layer-3 switch */ +async function Test_DelL3Switch(): Promise +{ + console.log("Begin: Test_DelL3Switch"); + let in_rpc_l3sw: VPN.VpnRpcL3Sw = new VPN.VpnRpcL3Sw( + { + Name_str: "L3SW1", + }); + let out_rpc_l3sw: VPN.VpnRpcL3Sw = await api.DelL3Switch(in_rpc_l3sw); + console.log(out_rpc_l3sw); + console.log("End: Test_DelL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumL3Switch', Enumerate virtual layer-3 switches */ +async function Test_EnumL3Switch(): Promise +{ + console.log("Begin: Test_EnumL3Switch"); + let out_rpc_enum_l3sw: VPN.VpnRpcEnumL3Sw = await api.EnumL3Switch(); + console.log(out_rpc_enum_l3sw); + console.log("End: Test_EnumL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'StartL3Switch', Start a virtual layer-3 switch */ +async function Test_StartL3Switch(): Promise +{ + console.log("Begin: Test_StartL3Switch"); + let in_rpc_l3sw: VPN.VpnRpcL3Sw = new VPN.VpnRpcL3Sw( + { + Name_str: "L3SW1", + }); + let out_rpc_l3sw: VPN.VpnRpcL3Sw = await api.StartL3Switch(in_rpc_l3sw); + console.log(out_rpc_l3sw); + console.log("End: Test_StartL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'StopL3Switch', Stop a virtual layer-3 switch */ +async function Test_StopL3Switch(): Promise +{ + console.log("Begin: Test_StopL3Switch"); + let in_rpc_l3sw: VPN.VpnRpcL3Sw = new VPN.VpnRpcL3Sw( + { + Name_str: "L3SW1", + }); + let out_rpc_l3sw: VPN.VpnRpcL3Sw = await api.StopL3Switch(in_rpc_l3sw); + console.log(out_rpc_l3sw); + console.log("End: Test_StopL3Switch"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddL3If', Add new virtual interface on virtual L3 switch */ +async function Test_AddL3If(): Promise +{ + console.log("Begin: Test_AddL3If"); + let in_rpc_l3if: VPN.VpnRpcL3If = new VPN.VpnRpcL3If( + { + Name_str: "L3SW1", + HubName_str: hub_name, + IpAddress_ip: "192.168.0.1", + SubnetMask_ip: "255.255.255.0", + }); + let out_rpc_l3if: VPN.VpnRpcL3If = await api.AddL3If(in_rpc_l3if); + console.log(out_rpc_l3if); + console.log("End: Test_AddL3If"); + console.log("-----"); + console.log(); +} + +/** API test for 'DelL3If', Delete a virtual interface on virtual L3 switch */ +async function Test_DelL3If(): Promise +{ + console.log("Begin: Test_DelL3If"); + let in_rpc_l3if: VPN.VpnRpcL3If = new VPN.VpnRpcL3If( + { + Name_str: "L3SW1", + HubName_str: hub_name, + }); + let out_rpc_l3if: VPN.VpnRpcL3If = await api.DelL3If(in_rpc_l3if); + console.log(out_rpc_l3if); + console.log("End: Test_DelL3If"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumL3If', Enumerate virtual interfaces on virtual L3 switch */ +async function Test_EnumL3If(): Promise +{ + console.log("Begin: Test_EnumL3If"); + let in_rpc_enum_l3if: VPN.VpnRpcEnumL3If = new VPN.VpnRpcEnumL3If( + { + Name_str: "L3SW1", + }); + let out_rpc_enum_l3if: VPN.VpnRpcEnumL3If = await api.EnumL3If(in_rpc_enum_l3if); + console.log(out_rpc_enum_l3if); + console.log("End: Test_EnumL3If"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddL3Table', Add new routing table entry on virtual L3 switch */ +async function Test_AddL3Table(): Promise +{ + console.log("Begin: Test_AddL3Table"); + let in_rpc_l3table: VPN.VpnRpcL3Table = new VPN.VpnRpcL3Table( + { + Name_str: "L3SW1", + NetworkAddress_ip: "10.0.0.0", + SubnetMask_ip: "255.0.0.0", + GatewayAddress_ip: "192.168.7.1", + Metric_u32: 10, + }); + let out_rpc_l3table: VPN.VpnRpcL3Table = await api.AddL3Table(in_rpc_l3table); + console.log(out_rpc_l3table); + console.log("End: Test_AddL3Table"); + console.log("-----"); + console.log(); +} + +/** API test for 'DelL3Table', Delete routing table entry on virtual L3 switch */ +async function Test_DelL3Table(): Promise +{ + console.log("Begin: Test_DelL3Table"); + let in_rpc_l3table: VPN.VpnRpcL3Table = new VPN.VpnRpcL3Table( + { + Name_str: "L3SW1", + NetworkAddress_ip: "10.0.0.0", + SubnetMask_ip: "255.0.0.0", + GatewayAddress_ip: "192.168.7.1", + Metric_u32: 10, + }); + let out_rpc_l3table: VPN.VpnRpcL3Table = await api.DelL3Table(in_rpc_l3table); + console.log(out_rpc_l3table); + console.log("End: Test_DelL3Table"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumL3Table', Get routing table on virtual L3 switch */ +async function Test_EnumL3Table(): Promise +{ + console.log("Begin: Test_EnumL3Table"); + let in_rpc_enum_l3table: VPN.VpnRpcEnumL3Table = new VPN.VpnRpcEnumL3Table( + { + Name_str: "L3SW1", + }); + let out_rpc_enum_l3table: VPN.VpnRpcEnumL3Table = await api.EnumL3Table(in_rpc_enum_l3table); + console.log(out_rpc_enum_l3table); + console.log("End: Test_EnumL3Table"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumCrl', Get CRL (Certificate Revocation List) index */ +async function Test_EnumCrl(): Promise +{ + console.log("Begin: Test_EnumCrl"); + let in_rpc_enum_crl: VPN.VpnRpcEnumCrl = new VPN.VpnRpcEnumCrl( + { + HubName_str: hub_name, + }); + let out_rpc_enum_crl: VPN.VpnRpcEnumCrl = await api.EnumCrl(in_rpc_enum_crl); + console.log(out_rpc_enum_crl); + console.log("End: Test_EnumCrl"); + console.log("-----"); + console.log(); + return out_rpc_enum_crl; +} + +/** API test for 'AddCrl', Add new CRL (Certificate Revocation List) entry */ +async function Test_AddCrl(): Promise +{ + console.log("Begin: Test_AddCrl"); + let in_rpc_crl: VPN.VpnRpcCrl = new VPN.VpnRpcCrl( + { + HubName_str: hub_name, + CommonName_utf: "CN", + Organization_utf: "Org", + Unit_utf: "ICSCOE", + Country_utf: "JP", + State_utf: "Ibaraki", + Local_utf: "Tsukuba", + Serial_bin: new Uint8Array([ 1, 2, 3, 4, 5, ]), + DigestMD5_bin: new Uint8Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ]), + DigestSHA1_bin: new Uint8Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ]), + }); + let out_rpc_crl: VPN.VpnRpcCrl = await api.AddCrl(in_rpc_crl); + console.log(out_rpc_crl); + console.log("End: Test_AddCrl"); + console.log("-----"); + console.log(); +} + +/** API test for 'DelCrl', Delete CRL (Certificate Revocation List) entry */ +async function Test_DelCrl(key: number): Promise +{ + console.log("Begin: Test_DelCrl"); + let in_rpc_crl: VPN.VpnRpcCrl = new VPN.VpnRpcCrl( + { + HubName_str: hub_name, + Key_u32: key, + }); + let out_rpc_crl: VPN.VpnRpcCrl = await api.DelCrl(in_rpc_crl); + console.log(out_rpc_crl); + console.log("End: Test_DelCrl"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetCrl', Get CRL (Certificate Revocation List) entry */ +async function Test_GetCrl(key: number): Promise +{ + console.log("Begin: Test_GetCrl"); + let in_rpc_crl: VPN.VpnRpcCrl = new VPN.VpnRpcCrl( + { + HubName_str: hub_name, + Key_u32: key, + }); + let out_rpc_crl: VPN.VpnRpcCrl = await api.GetCrl(in_rpc_crl); + console.log(out_rpc_crl); + console.log("End: Test_GetCrl"); + console.log("-----"); + console.log(); + return out_rpc_crl; +} + +/** API test for 'SetCrl', Set CRL (Certificate Revocation List) entry */ +async function Test_SetCrl(crl: VPN.VpnRpcCrl): Promise +{ + console.log("Begin: Test_SetCrl"); + let out_rpc_crl: VPN.VpnRpcCrl = await api.SetCrl(crl); + console.log(out_rpc_crl); + console.log("End: Test_SetCrl"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetAcList', Set access control list */ +async function Test_SetAcList(): Promise +{ + console.log("Begin: Test_SetAcList"); + let in_rpc_ac_list: VPN.VpnRpcAcList = new VPN.VpnRpcAcList( + { + HubName_str: hub_name, + ACList: [ new VPN.VpnAc( + { + Deny_bool: true, + IpAddress_ip: "192.168.0.0", + SubnetMask_ip: "255.255.0.0", + Masked_bool: true, + Priority_u32: 123, + }), new VPN.VpnAc( + { + Deny_bool: false, + IpAddress_ip: "fe80::", + SubnetMask_ip: "8", + Masked_bool: true, + Priority_u32: 123, + }), ], + }); + let out_rpc_ac_list: VPN.VpnRpcAcList = await api.SetAcList(in_rpc_ac_list); + console.log(out_rpc_ac_list); + console.log("End: Test_SetAcList"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetAcList', Get access control list */ +async function Test_GetAcList(): Promise +{ + console.log("Begin: Test_GetAcList"); + let in_rpc_ac_list: VPN.VpnRpcAcList = new VPN.VpnRpcAcList( + { + HubName_str: hub_name, + }); + let out_rpc_ac_list: VPN.VpnRpcAcList = await api.GetAcList(in_rpc_ac_list); + console.log(out_rpc_ac_list); + console.log("End: Test_GetAcList"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumLogFile', Enumerate log files */ +async function Test_EnumLogFile(): Promise +{ + console.log("Begin: Test_EnumLogFile"); + let out_rpc_enum_log_file: VPN.VpnRpcEnumLogFile = await api.EnumLogFile(); + console.log(out_rpc_enum_log_file); + console.log("End: Test_EnumLogFile"); + console.log("-----"); + console.log(); + return out_rpc_enum_log_file; +} + +/** API test for 'ReadLogFile', Read a log file */ +async function Test_ReadLogFile(filename: string): Promise +{ + console.log("Begin: Test_ReadLogFile"); + let in_rpc_read_log_file: VPN.VpnRpcReadLogFile = new VPN.VpnRpcReadLogFile( + { + FilePath_str: filename, + }); + let out_rpc_read_log_file: VPN.VpnRpcReadLogFile = await api.ReadLogFile(in_rpc_read_log_file); + console.log(out_rpc_read_log_file); + console.log("End: Test_ReadLogFile"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetSysLog', Set syslog function setting */ +async function Test_SetSysLog(flag: boolean): Promise +{ + console.log("Begin: Test_SetSysLog"); + let in_syslog_setting: VPN.VpnSyslogSetting = new VPN.VpnSyslogSetting( + { + SaveType_u32: flag ? VPN.VpnSyslogSaveType.ServerAndHubAllLog : VPN.VpnSyslogSaveType.None, + Hostname_str: "1.2.3.4", + Port_u32: 123, + }); + let out_syslog_setting: VPN.VpnSyslogSetting = await api.SetSysLog(in_syslog_setting); + console.log(out_syslog_setting); + console.log("End: Test_SetSysLog"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetSysLog', Get syslog function setting */ +async function Test_GetSysLog(): Promise +{ + console.log("Begin: Test_GetSysLog"); + let in_syslog_setting: VPN.VpnSyslogSetting = new VPN.VpnSyslogSetting( + { + }); + let out_syslog_setting: VPN.VpnSyslogSetting = await api.GetSysLog(in_syslog_setting); + console.log(out_syslog_setting); + console.log("End: Test_GetSysLog"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetHubMsg', Set message of today on hub */ +async function Test_SetHubMsg(): Promise +{ + console.log("Begin: Test_SetHubMsg"); + let in_rpc_msg: VPN.VpnRpcMsg = new VPN.VpnRpcMsg( + { + HubName_str: hub_name, + Msg_bin: new Uint8Array([ 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x21, 0x20, 0xe4, 0xb8, 0x87, 0xe5, 0x9b, 0xbd, 0xe3, 0x81, 0xae, 0xe5, 0x8a, 0xb4, 0xe5, 0x83, 0x8d, 0xe8, 0x80, 0x85, 0xe3, 0x82, 0x88, 0xe3, 0x80, 0x81, 0xe5, 0x9b, 0xa3, 0xe7, 0xb5, 0x90, 0xe3, 0x81, 0x9b, 0xe3, 0x82, 0x88, 0x21, 0x20, 0xd7, 0x92, 0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x99, 0xd7, 0x9d, 0x20, 0xd7, 0xa2, 0xd7, 0x95, 0xd7, 0x91, 0xd7, 0x93, 0xd7, 0x99, 0xd7, 0x9d, 0x20, 0xd7, 0xa9, 0xd7, 0x9c, 0x20, 0xd7, 0x9b, 0xd7, 0x9c, 0x20, 0xd7, 0x94, 0xd7, 0x9e, 0xd7, 0x93, 0xd7, 0x99, 0xd7, 0xa0, 0xd7, 0x95, 0xd7, 0xaa, 0x2c, 0x20, 0xd7, 0x94, 0xd7, 0xaa, 0xd7, 0x90, 0xd7, 0x97, 0xd7, 0x93, 0xd7, 0x95, 0x21, ]), + }); + let out_rpc_msg: VPN.VpnRpcMsg = await api.SetHubMsg(in_rpc_msg); + console.log(out_rpc_msg); + console.log("End: Test_SetHubMsg"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetHubMsg', Get message of today on hub */ +async function Test_GetHubMsg(): Promise +{ + console.log("Begin: Test_GetHubMsg"); + let in_rpc_msg: VPN.VpnRpcMsg = new VPN.VpnRpcMsg( + { + HubName_str: hub_name, + }); + let out_rpc_msg: VPN.VpnRpcMsg = await api.GetHubMsg(in_rpc_msg); + console.log(out_rpc_msg); + console.log("End: Test_GetHubMsg"); + console.log("-----"); + console.log(); +} + +/** API test for 'Crash', Do Crash */ +async function Test_Crash(): Promise +{ + console.log("Begin: Test_Crash"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + }); + let out_rpc_test: VPN.VpnRpcTest = await api.Crash(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_Crash"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetAdminMsg', Get message for administrators */ +async function Test_GetAdminMsg(): Promise +{ + console.log("Begin: Test_GetAdminMsg"); + let out_rpc_msg: VPN.VpnRpcMsg = await api.GetAdminMsg(); + console.log(out_rpc_msg); + console.log("End: Test_GetAdminMsg"); + console.log("-----"); + console.log(); +} + +/** API test for 'Flush', Flush configuration file */ +async function Test_Flush(): Promise +{ + console.log("Begin: Test_Flush"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + }); + let out_rpc_test: VPN.VpnRpcTest = await api.Flush(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_Flush"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetIPsecServices', Set IPsec service configuration */ +async function Test_SetIPsecServices(): Promise +{ + console.log("Begin: Test_SetIPsecServices"); + let in_ipsec_services: VPN.VpnIPsecServices = new VPN.VpnIPsecServices( + { + L2TP_Raw_bool: false, + L2TP_IPsec_bool: false, + EtherIP_IPsec_bool: false, + IPsec_Secret_str: "vpn", + L2TP_DefaultHub_str: "HUB_ABC", + }); + let out_ipsec_services: VPN.VpnIPsecServices = await api.SetIPsecServices(in_ipsec_services); + console.log(out_ipsec_services); + console.log("End: Test_SetIPsecServices"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetIPsecServices', Get IPsec service configuration */ +async function Test_GetIPsecServices(): Promise +{ + console.log("Begin: Test_GetIPsecServices"); + let out_ipsec_services: VPN.VpnIPsecServices = await api.GetIPsecServices(); + console.log(out_ipsec_services); + console.log("End: Test_GetIPsecServices"); + console.log("-----"); + console.log(); +} + +/** API test for 'AddEtherIpId', Add EtherIP ID setting */ +async function Test_AddEtherIpId(): Promise +{ + console.log("Begin: Test_AddEtherIpId"); + let in_etherip_id: VPN.VpnEtherIpId = new VPN.VpnEtherIpId( + { + Id_str: "testid", + HubName_str: hub_name, + UserName_str: "nekosan", + Password_str: "torisan", + }); + let out_etherip_id: VPN.VpnEtherIpId = await api.AddEtherIpId(in_etherip_id); + console.log(out_etherip_id); + console.log("End: Test_AddEtherIpId"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetEtherIpId', Get EtherIP ID setting */ +async function Test_GetEtherIpId(id: string): Promise +{ + console.log("Begin: Test_GetEtherIpId"); + let in_etherip_id: VPN.VpnEtherIpId = new VPN.VpnEtherIpId( + { + Id_str: id, + }); + let out_etherip_id: VPN.VpnEtherIpId = await api.GetEtherIpId(in_etherip_id); + console.log(out_etherip_id); + console.log("End: Test_GetEtherIpId"); + console.log("-----"); + console.log(); +} + +/** API test for 'DeleteEtherIpId', Delete EtherIP ID setting */ +async function Test_DeleteEtherIpId(id: string): Promise +{ + console.log("Begin: Test_DeleteEtherIpId"); + let in_etherip_id: VPN.VpnEtherIpId = new VPN.VpnEtherIpId( + { + Id_str: id, + }); + let out_etherip_id: VPN.VpnEtherIpId = await api.DeleteEtherIpId(in_etherip_id); + console.log(out_etherip_id); + console.log("End: Test_DeleteEtherIpId"); + console.log("-----"); + console.log(); +} + +/** API test for 'EnumEtherIpId', Enumerate EtherIP ID settings */ +async function Test_EnumEtherIpId(): Promise +{ + console.log("Begin: Test_EnumEtherIpId"); + let out_rpc_enum_etherip_id: VPN.VpnRpcEnumEtherIpId = await api.EnumEtherIpId(); + console.log(out_rpc_enum_etherip_id); + console.log("End: Test_EnumEtherIpId"); + console.log("-----"); + console.log(); + return out_rpc_enum_etherip_id; +} + +/** API test for 'SetOpenVpnSstpConfig', Set configurations for OpenVPN and SSTP */ +async function Test_SetOpenVpnSstpConfig(): Promise +{ + console.log("Begin: Test_SetOpenVpnSstpConfig"); + let in_openvpn_sstp_config: VPN.VpnOpenVpnSstpConfig = new VPN.VpnOpenVpnSstpConfig( + { + EnableOpenVPN_bool: true, + OpenVPNPortList_str: "1 2 3 4 5", + EnableSSTP_bool: true, + }); + let out_openvpn_sstp_config: VPN.VpnOpenVpnSstpConfig = await api.SetOpenVpnSstpConfig(in_openvpn_sstp_config); + console.log(out_openvpn_sstp_config); + console.log("End: Test_SetOpenVpnSstpConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetOpenVpnSstpConfig', Get configurations for OpenVPN and SSTP */ +async function Test_GetOpenVpnSstpConfig(): Promise +{ + console.log("Begin: Test_GetOpenVpnSstpConfig"); + let out_openvpn_sstp_config: VPN.VpnOpenVpnSstpConfig = await api.GetOpenVpnSstpConfig(); + console.log(out_openvpn_sstp_config); + console.log("End: Test_GetOpenVpnSstpConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetDDnsClientStatus', Get status of DDNS client */ +async function Test_GetDDnsClientStatus(): Promise +{ + console.log("Begin: Test_GetDDnsClientStatus"); + let out_ddns_client_status: VPN.VpnDDnsClientStatus = await api.GetDDnsClientStatus(); + console.log(out_ddns_client_status); + console.log("End: Test_GetDDnsClientStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'ChangeDDnsClientHostname', Change host-name for DDNS client */ +async function Test_ChangeDDnsClientHostname(): Promise +{ + console.log("Begin: Test_ChangeDDnsClientHostname"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + StrValue_str: "nekotest" + Math.floor((Math.random() * (2100000000 - 1000000000)) + 1000000000), + }); + let out_rpc_test: VPN.VpnRpcTest = await api.ChangeDDnsClientHostname(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_ChangeDDnsClientHostname"); + console.log("-----"); + console.log(); +} + +/** API test for 'RegenerateServerCert', Regenerate server certification */ +async function Test_RegenerateServerCert(): Promise +{ + console.log("Begin: Test_RegenerateServerCert"); + let in_rpc_test: VPN.VpnRpcTest = new VPN.VpnRpcTest( + { + StrValue_str: "abc.example.org", + }); + let out_rpc_test: VPN.VpnRpcTest = await api.RegenerateServerCert(in_rpc_test); + console.log(out_rpc_test); + console.log("End: Test_RegenerateServerCert"); + console.log("-----"); + console.log(); +} + +/** API test for 'MakeOpenVpnConfigFile', Generate OpenVPN configuration files */ +async function Test_MakeOpenVpnConfigFile(): Promise +{ + console.log("Begin: Test_MakeOpenVpnConfigFile"); + let out_rpc_read_log_file: VPN.VpnRpcReadLogFile = await api.MakeOpenVpnConfigFile(); + console.log(out_rpc_read_log_file); + console.log("End: Test_MakeOpenVpnConfigFile"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetSpecialListener', Set special listener status */ +async function Test_SetSpecialListener(): Promise +{ + console.log("Begin: Test_SetSpecialListener"); + let in_rpc_special_listener: VPN.VpnRpcSpecialListener = new VPN.VpnRpcSpecialListener( + { + VpnOverDnsListener_bool: true, + VpnOverIcmpListener_bool: true, + }); + let out_rpc_special_listener: VPN.VpnRpcSpecialListener = await api.SetSpecialListener(in_rpc_special_listener); + console.log(out_rpc_special_listener); + console.log("End: Test_SetSpecialListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetSpecialListener', Get special listener status */ +async function Test_GetSpecialListener(): Promise +{ + console.log("Begin: Test_GetSpecialListener"); + let out_rpc_special_listener: VPN.VpnRpcSpecialListener = await api.GetSpecialListener(); + console.log(out_rpc_special_listener); + console.log("End: Test_GetSpecialListener"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetAzureStatus', Get Azure status */ +async function Test_GetAzureStatus(): Promise +{ + console.log("Begin: Test_GetAzureStatus"); + let out_rpc_azure_status: VPN.VpnRpcAzureStatus = await api.GetAzureStatus(); + console.log(out_rpc_azure_status); + console.log("End: Test_GetAzureStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetAzureStatus', Set Azure status */ +async function Test_SetAzureStatus(): Promise +{ + console.log("Begin: Test_SetAzureStatus"); + let in_rpc_azure_status: VPN.VpnRpcAzureStatus = new VPN.VpnRpcAzureStatus( + { + IsEnabled_bool: true, + }); + let out_rpc_azure_status: VPN.VpnRpcAzureStatus = await api.SetAzureStatus(in_rpc_azure_status); + console.log(out_rpc_azure_status); + console.log("End: Test_SetAzureStatus"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetDDnsInternetSettng', Get DDNS proxy configuration */ +async function Test_GetDDnsInternetSettng(): Promise +{ + console.log("Begin: Test_GetDDnsInternetSettng"); + let out_internet_setting: VPN.VpnInternetSetting = await api.GetDDnsInternetSettng(); + console.log(out_internet_setting); + console.log("End: Test_GetDDnsInternetSettng"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetDDnsInternetSettng', Set DDNS proxy configuration */ +async function Test_SetDDnsInternetSettng(): Promise +{ + console.log("Begin: Test_SetDDnsInternetSettng"); + let in_internet_setting: VPN.VpnInternetSetting = new VPN.VpnInternetSetting( + { + ProxyType_u32: VPN.VpnRpcProxyType.Direct, + ProxyHostName_str: "1.2.3.4", + ProxyPort_u32: 1234, + ProxyUsername_str: "neko", + ProxyPassword_str: "dog", + }); + let out_internet_setting: VPN.VpnInternetSetting = await api.SetDDnsInternetSettng(in_internet_setting); + console.log(out_internet_setting); + console.log("End: Test_SetDDnsInternetSettng"); + console.log("-----"); + console.log(); +} + +/** API test for 'SetVgsConfig', Setting VPN Gate Server Configuration */ +async function Test_SetVgsConfig(): Promise +{ + console.log("Begin: Test_SetVgsConfig"); + let in_vgs_config: VPN.VpnVgsConfig = new VPN.VpnVgsConfig( + { + IsEnabled_bool: false, + Message_utf: "Neko san!!!", + Owner_utf: "Go go go!!!", + Abuse_utf: "da.test@softether.co.jp", + NoLog_bool: false, + LogPermanent_bool: true, + EnableL2TP_bool: true, + }); + let out_vgs_config: VPN.VpnVgsConfig = await api.SetVgsConfig(in_vgs_config); + console.log(out_vgs_config); + console.log("End: Test_SetVgsConfig"); + console.log("-----"); + console.log(); +} + +/** API test for 'GetVgsConfig', Get VPN Gate configuration */ +async function Test_GetVgsConfig(): Promise +{ + console.log("Begin: Test_GetVgsConfig"); + let out_vgs_config: VPN.VpnVgsConfig = await api.GetVgsConfig(); + console.log(out_vgs_config); + console.log("End: Test_GetVgsConfig"); + console.log("-----"); + console.log(); +} + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/vpnrpc.ts softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/vpnrpc.ts --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/vpnrpc.ts 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/vpnrpc.ts 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,5167 @@ +// SoftEther VPN Server JSON-RPC Stub code for TypeScript +// +// vpnrpc.ts +// Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-2019 SoftEther VPN Project + + +// Trivial utility codes +let is_node_js = (typeof navigator === "undefined") || navigator.userAgent.indexOf("Node.js") !== -1 || navigator.userAgent.indexOf("jsdom") !== -1; +function is_null(obj: any) +{ + return (typeof obj === "undefined") || (obj === null); +} +let debug_mode: boolean = false; + +/** VPN Server RPC Stubs */ +export class VpnServerRpc +{ + /** Determine if this JavaScript environment is on the Node.js or not. */ + public static IsNodeJS(): boolean + { + return is_node_js; + } + + /** Set the debug mode flag */ + public static SetDebugMode(flag: boolean): void + { + debug_mode = flag; + } + + private rpc_url: string; + private rpc_client: JsonRpcClient; + + /** + * Constructor of the VpnServerRpc class + * @param vpnserver_hostname The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param vpnserver_port The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param hubname The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. + * @param password Specify the administration password. This value is valid only if vpnserver_hostname is sepcified. + * @param nodejs_https_client_reject_untrusted_server_cert In Node.js set this true to check the SSL server certificate on the destination VPN Server. Set this false to ignore the SSL server certification. + */ + constructor(vpnserver_hostname?: string, vpnserver_port?: number, hubname?: string, password?: string, nodejs_https_client_reject_untrusted_server_cert?: boolean) + { + let headers: { [name: string]: string } = {}; + let send_credentials: boolean = false; + + nodejs_https_client_reject_untrusted_server_cert = is_null(nodejs_https_client_reject_untrusted_server_cert) ? false : nodejs_https_client_reject_untrusted_server_cert!; + + if (is_null(vpnserver_hostname)) + { + this.rpc_url = "/api/"; + send_credentials = true; + } + else + { + if (is_null(vpnserver_port)) vpnserver_port = 443; + this.rpc_url = `https://${vpnserver_hostname}:${vpnserver_port}/api/`; + + + headers["X-VPNADMIN-HUBNAME"] = is_null(hubname) ? "" : hubname!; + headers["X-VPNADMIN-PASSWORD"] = is_null(password) ? "" : password!; + } + + if (is_null(nodejs_https_client_reject_untrusted_server_cert)) nodejs_https_client_reject_untrusted_server_cert = false; + + this.rpc_client = new JsonRpcClient(this.rpc_url, headers, send_credentials, nodejs_https_client_reject_untrusted_server_cert); + } + + // --- Stubs --- + /** Test RPC function. Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. */ + public Test = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("Test", in_param); + } + + /** Get server information. This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. */ + public GetServerInfo = (): Promise => + { + return this.CallAsync("GetServerInfo", new VpnRpcServerInfo()); + } + + /** Get Current Server Status. This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. */ + public GetServerStatus = (): Promise => + { + return this.CallAsync("GetServerStatus", new VpnRpcServerStatus()); + } + + /** Create New TCP Listener. This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. */ + public CreateListener = (in_param: VpnRpcListener): Promise => + { + return this.CallAsync("CreateListener", in_param); + } + + /** Get List of TCP Listeners. This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. */ + public EnumListener = (): Promise => + { + return this.CallAsync("EnumListener", new VpnRpcListenerList()); + } + + /** Delete TCP Listener. This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. */ + public DeleteListener = (in_param: VpnRpcListener): Promise => + { + return this.CallAsync("DeleteListener", in_param); + } + + /** Enable / Disable TCP Listener. This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. */ + public EnableListener = (in_param: VpnRpcListener): Promise => + { + return this.CallAsync("EnableListener", in_param); + } + + /** Set VPN Server Administrator Password. This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. */ + public SetServerPassword = (in_param: VpnRpcSetPassword): Promise => + { + return this.CallAsync("SetServerPassword", in_param); + } + + /** Set the VPN Server clustering configuration. Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. */ + public SetFarmSetting = (in_param: VpnRpcFarm): Promise => + { + return this.CallAsync("SetFarmSetting", in_param); + } + + /** Get Clustering Configuration of Current VPN Server. You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. */ + public GetFarmSetting = (): Promise => + { + return this.CallAsync("GetFarmSetting", new VpnRpcFarm()); + } + + /** Get Cluster Member Information. When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. */ + public GetFarmInfo = (in_param: VpnRpcFarmInfo): Promise => + { + return this.CallAsync("GetFarmInfo", in_param); + } + + /** Get List of Cluster Members. Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. */ + public EnumFarmMember = (): Promise => + { + return this.CallAsync("EnumFarmMember", new VpnRpcEnumFarm()); + } + + /** Get Connection Status to Cluster Controller. Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. */ + public GetFarmConnectionStatus = (): Promise => + { + return this.CallAsync("GetFarmConnectionStatus", new VpnRpcFarmConnectionStatus()); + } + + /** Set SSL Certificate and Private Key of VPN Server. You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. */ + public SetServerCert = (in_param: VpnRpcKeyPair): Promise => + { + return this.CallAsync("SetServerCert", in_param); + } + + /** Get SSL Certificate and Private Key of VPN Server. Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. */ + public GetServerCert = (): Promise => + { + return this.CallAsync("GetServerCert", new VpnRpcKeyPair()); + } + + /** Get the Encrypted Algorithm Used for VPN Communication. Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. */ + public GetServerCipher = (): Promise => + { + return this.CallAsync("GetServerCipher", new VpnRpcStr()); + } + + /** Set the Encrypted Algorithm Used for VPN Communication. Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. */ + public SetServerCipher = (in_param: VpnRpcStr): Promise => + { + return this.CallAsync("SetServerCipher", in_param); + } + + /** Create New Virtual Hub. Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. */ + public CreateHub = (in_param: VpnRpcCreateHub): Promise => + { + return this.CallAsync("CreateHub", in_param); + } + + /** Set the Virtual Hub configuration. You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. */ + public SetHub = (in_param: VpnRpcCreateHub): Promise => + { + return this.CallAsync("SetHub", in_param); + } + + /** Get the Virtual Hub configuration. You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. */ + public GetHub = (in_param: VpnRpcCreateHub): Promise => + { + return this.CallAsync("GetHub", in_param); + } + + /** Get List of Virtual Hubs. Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. */ + public EnumHub = (): Promise => + { + return this.CallAsync("EnumHub", new VpnRpcEnumHub()); + } + + /** Delete Virtual Hub. Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. */ + public DeleteHub = (in_param: VpnRpcDeleteHub): Promise => + { + return this.CallAsync("DeleteHub", in_param); + } + + /** Get Setting of RADIUS Server Used for User Authentication. Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetHubRadius = (in_param: VpnRpcRadius): Promise => + { + return this.CallAsync("GetHubRadius", in_param); + } + + /** Set RADIUS Server to use for User Authentication. To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetHubRadius = (in_param: VpnRpcRadius): Promise => + { + return this.CallAsync("SetHubRadius", in_param); + } + + /** Get List of TCP Connections Connecting to the VPN Server. Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. */ + public EnumConnection = (): Promise => + { + return this.CallAsync("EnumConnection", new VpnRpcEnumConnection()); + } + + /** Disconnect TCP Connections Connecting to the VPN Server. Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. */ + public DisconnectConnection = (in_param: VpnRpcDisconnectConnection): Promise => + { + return this.CallAsync("DisconnectConnection", in_param); + } + + /** Get Information of TCP Connections Connecting to the VPN Server. Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. */ + public GetConnectionInfo = (in_param: VpnRpcConnectionInfo): Promise => + { + return this.CallAsync("GetConnectionInfo", in_param); + } + + /** Switch Virtual Hub to Online or Offline. Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetHubOnline = (in_param: VpnRpcSetHubOnline): Promise => + { + return this.CallAsync("SetHubOnline", in_param); + } + + /** Get Current Status of Virtual Hub. Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. */ + public GetHubStatus = (in_param: VpnRpcHubStatus): Promise => + { + return this.CallAsync("GetHubStatus", in_param); + } + + /** Set the logging configuration of the Virtual Hub. Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. */ + public SetHubLog = (in_param: VpnRpcHubLog): Promise => + { + return this.CallAsync("SetHubLog", in_param); + } + + /** Get the logging configuration of the Virtual Hub. Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. */ + public GetHubLog = (in_param: VpnRpcHubLog): Promise => + { + return this.CallAsync("GetHubLog", in_param); + } + + /** Add Trusted CA Certificate. Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public AddCa = (in_param: VpnRpcHubAddCA): Promise => + { + return this.CallAsync("AddCa", in_param); + } + + /** Get List of Trusted CA Certificates. Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public EnumCa = (in_param: VpnRpcHubEnumCA): Promise => + { + return this.CallAsync("EnumCa", in_param); + } + + /** Get Trusted CA Certificate. Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public GetCa = (in_param: VpnRpcHubGetCA): Promise => + { + return this.CallAsync("GetCa", in_param); + } + + /** Delete Trusted CA Certificate. Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public DeleteCa = (in_param: VpnRpcHubDeleteCA): Promise => + { + return this.CallAsync("DeleteCa", in_param); + } + + /** Create New Cascade Connection. Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public CreateLink = (in_param: VpnRpcCreateLink): Promise => + { + return this.CallAsync("CreateLink", in_param); + } + + /** Get the Cascade Connection Setting. Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetLink = (in_param: VpnRpcCreateLink): Promise => + { + return this.CallAsync("GetLink", in_param); + } + + /** Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. */ + public SetLink = (in_param: VpnRpcCreateLink): Promise => + { + return this.CallAsync("SetLink", in_param); + } + + /** Get List of Cascade Connections. Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumLink = (in_param: VpnRpcEnumLink): Promise => + { + return this.CallAsync("EnumLink", in_param); + } + + /** Switch Cascade Connection to Online Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetLinkOnline = (in_param: VpnRpcLink): Promise => + { + return this.CallAsync("SetLinkOnline", in_param); + } + + /** Switch Cascade Connection to Offline Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetLinkOffline = (in_param: VpnRpcLink): Promise => + { + return this.CallAsync("SetLinkOffline", in_param); + } + + /** Delete Cascade Connection Setting. Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public DeleteLink = (in_param: VpnRpcLink): Promise => + { + return this.CallAsync("DeleteLink", in_param); + } + + /** Change Name of Cascade Connection. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public RenameLink = (in_param: VpnRpcRenameLink): Promise => + { + return this.CallAsync("RenameLink", in_param); + } + + /** Get Current Cascade Connection Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetLinkStatus = (in_param: VpnRpcLinkStatus): Promise => + { + return this.CallAsync("GetLinkStatus", in_param); + } + + /** Add Access List Rule. Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public AddAccess = (in_param: VpnRpcAddAccess): Promise => + { + return this.CallAsync("AddAccess", in_param); + } + + /** Delete Rule from Access List. Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public DeleteAccess = (in_param: VpnRpcDeleteAccess): Promise => + { + return this.CallAsync("DeleteAccess", in_param); + } + + /** Get Access List Rule List. Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public EnumAccess = (in_param: VpnRpcEnumAccessList): Promise => + { + return this.CallAsync("EnumAccess", in_param); + } + + /** Replace all access lists on a single bulk API call. This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. */ + public SetAccessList = (in_param: VpnRpcEnumAccessList): Promise => + { + return this.CallAsync("SetAccessList", in_param); + } + + /** Create a user. Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public CreateUser = (in_param: VpnRpcSetUser): Promise => + { + return this.CallAsync("CreateUser", in_param); + } + + /** Change User Settings. Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public SetUser = (in_param: VpnRpcSetUser): Promise => + { + return this.CallAsync("SetUser", in_param); + } + + /** Get User Settings. Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public GetUser = (in_param: VpnRpcSetUser): Promise => + { + return this.CallAsync("GetUser", in_param); + } + + /** Delete a user. Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public DeleteUser = (in_param: VpnRpcDeleteUser): Promise => + { + return this.CallAsync("DeleteUser", in_param); + } + + /** Get List of Users. Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public EnumUser = (in_param: VpnRpcEnumUser): Promise => + { + return this.CallAsync("EnumUser", in_param); + } + + /** Create Group. Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public CreateGroup = (in_param: VpnRpcSetGroup): Promise => + { + return this.CallAsync("CreateGroup", in_param); + } + + /** Set group settings. Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public SetGroup = (in_param: VpnRpcSetGroup): Promise => + { + return this.CallAsync("SetGroup", in_param); + } + + /** Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public GetGroup = (in_param: VpnRpcSetGroup): Promise => + { + return this.CallAsync("GetGroup", in_param); + } + + /** Delete User from Group. Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public DeleteGroup = (in_param: VpnRpcDeleteUser): Promise => + { + return this.CallAsync("DeleteGroup", in_param); + } + + /** Get List of Groups. Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. */ + public EnumGroup = (in_param: VpnRpcEnumGroup): Promise => + { + return this.CallAsync("EnumGroup", in_param); + } + + /** Get List of Connected VPN Sessions. Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. */ + public EnumSession = (in_param: VpnRpcEnumSession): Promise => + { + return this.CallAsync("EnumSession", in_param); + } + + /** Get Session Status. Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. */ + public GetSessionStatus = (in_param: VpnRpcSessionStatus): Promise => + { + return this.CallAsync("GetSessionStatus", in_param); + } + + /** Disconnect Session. Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. */ + public DeleteSession = (in_param: VpnRpcDeleteSession): Promise => + { + return this.CallAsync("DeleteSession", in_param); + } + + /** Get the MAC Address Table Database. Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. */ + public EnumMacTable = (in_param: VpnRpcEnumMacTable): Promise => + { + return this.CallAsync("EnumMacTable", in_param); + } + + /** Delete MAC Address Table Entry. Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. */ + public DeleteMacTable = (in_param: VpnRpcDeleteTable): Promise => + { + return this.CallAsync("DeleteMacTable", in_param); + } + + /** Get the IP Address Table Database. Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. */ + public EnumIpTable = (in_param: VpnRpcEnumIpTable): Promise => + { + return this.CallAsync("EnumIpTable", in_param); + } + + /** Delete IP Address Table Entry. Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. */ + public DeleteIpTable = (in_param: VpnRpcDeleteTable): Promise => + { + return this.CallAsync("DeleteIpTable", in_param); + } + + /** Set the Keep Alive Internet Connection Function. Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. */ + public SetKeep = (in_param: VpnRpcKeep): Promise => + { + return this.CallAsync("SetKeep", in_param); + } + + /** Get the Keep Alive Internet Connection Function. Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. */ + public GetKeep = (in_param: VpnRpcKeep): Promise => + { + return this.CallAsync("GetKeep", in_param); + } + + /** Enable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnableSecureNAT = (in_param: VpnRpcHub): Promise => + { + return this.CallAsync("EnableSecureNAT", in_param); + } + + /** Disable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public DisableSecureNAT = (in_param: VpnRpcHub): Promise => + { + return this.CallAsync("DisableSecureNAT", in_param); + } + + /** Change Settings of SecureNAT Function. Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetSecureNATOption = (in_param: VpnVhOption): Promise => + { + return this.CallAsync("SetSecureNATOption", in_param); + } + + /** Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. */ + public GetSecureNATOption = (in_param: VpnVhOption): Promise => + { + return this.CallAsync("GetSecureNATOption", in_param); + } + + /** Get Virtual NAT Function Session Table of SecureNAT Function. Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumNAT = (in_param: VpnRpcEnumNat): Promise => + { + return this.CallAsync("EnumNAT", in_param); + } + + /** Get Virtual DHCP Server Function Lease Table of SecureNAT Function. Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumDHCP = (in_param: VpnRpcEnumDhcp): Promise => + { + return this.CallAsync("EnumDHCP", in_param); + } + + /** Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetSecureNATStatus = (in_param: VpnRpcNatStatus): Promise => + { + return this.CallAsync("GetSecureNATStatus", in_param); + } + + /** Get List of Network Adapters Usable as Local Bridge. Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. */ + public EnumEthernet = (): Promise => + { + return this.CallAsync("EnumEthernet", new VpnRpcEnumEth()); + } + + /** Create Local Bridge Connection. Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. */ + public AddLocalBridge = (in_param: VpnRpcLocalBridge): Promise => + { + return this.CallAsync("AddLocalBridge", in_param); + } + + /** Delete Local Bridge Connection. Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. */ + public DeleteLocalBridge = (in_param: VpnRpcLocalBridge): Promise => + { + return this.CallAsync("DeleteLocalBridge", in_param); + } + + /** Get List of Local Bridge Connection. Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. */ + public EnumLocalBridge = (): Promise => + { + return this.CallAsync("EnumLocalBridge", new VpnRpcEnumLocalBridge()); + } + + /** Get whether the localbridge function is supported on the current system. */ + public GetBridgeSupport = (): Promise => + { + return this.CallAsync("GetBridgeSupport", new VpnRpcBridgeSupport()); + } + + /** Reboot VPN Server Service. Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. */ + public RebootServer = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("RebootServer", in_param); + } + + /** Get List of Server Functions / Capability. Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. */ + public GetCaps = (): Promise => + { + return this.CallAsync("GetCaps", new VpnCapslist()); + } + + /** Get the current configuration of the VPN Server. Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. */ + public GetConfig = (): Promise => + { + return this.CallAsync("GetConfig", new VpnRpcConfig()); + } + + /** Write Configuration File to VPN Server. Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. */ + public SetConfig = (in_param: VpnRpcConfig): Promise => + { + return this.CallAsync("SetConfig", in_param); + } + + /** Get Virtual Hub Administration Option default values. */ + public GetDefaultHubAdminOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("GetDefaultHubAdminOptions", in_param); + } + + /** Get List of Virtual Hub Administration Options. Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + public GetHubAdminOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("GetHubAdminOptions", in_param); + } + + /** Set Values of Virtual Hub Administration Options. Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + public SetHubAdminOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("SetHubAdminOptions", in_param); + } + + /** Get List of Virtual Hub Extended Options. Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + public GetHubExtOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("GetHubExtOptions", in_param); + } + + /** Set a Value of Virtual Hub Extended Options. Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. */ + public SetHubExtOptions = (in_param: VpnRpcAdminOption): Promise => + { + return this.CallAsync("SetHubExtOptions", in_param); + } + + /** Define New Virtual Layer 3 Switch. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + public AddL3Switch = (in_param: VpnRpcL3Sw): Promise => + { + return this.CallAsync("AddL3Switch", in_param); + } + + /** Delete Virtual Layer 3 Switch. Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + public DelL3Switch = (in_param: VpnRpcL3Sw): Promise => + { + return this.CallAsync("DelL3Switch", in_param); + } + + /** Get List of Virtual Layer 3 Switches. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + public EnumL3Switch = (): Promise => + { + return this.CallAsync("EnumL3Switch", new VpnRpcEnumL3Sw()); + } + + /** Start Virtual Layer 3 Switch Operation. Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. */ + public StartL3Switch = (in_param: VpnRpcL3Sw): Promise => + { + return this.CallAsync("StartL3Switch", in_param); + } + + /** Stop Virtual Layer 3 Switch Operation. Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. */ + public StopL3Switch = (in_param: VpnRpcL3Sw): Promise => + { + return this.CallAsync("StopL3Switch", in_param); + } + + /** Add Virtual Interface to Virtual Layer 3 Switch. Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + public AddL3If = (in_param: VpnRpcL3If): Promise => + { + return this.CallAsync("AddL3If", in_param); + } + + /** Delete Virtual Interface of Virtual Layer 3 Switch. Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + public DelL3If = (in_param: VpnRpcL3If): Promise => + { + return this.CallAsync("DelL3If", in_param); + } + + /** Get List of Interfaces Registered on the Virtual Layer 3 Switch. Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + public EnumL3If = (in_param: VpnRpcEnumL3If): Promise => + { + return this.CallAsync("EnumL3If", in_param); + } + + /** Add Routing Table Entry for Virtual Layer 3 Switch. Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + public AddL3Table = (in_param: VpnRpcL3Table): Promise => + { + return this.CallAsync("AddL3Table", in_param); + } + + /** Delete Routing Table Entry of Virtual Layer 3 Switch. Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. */ + public DelL3Table = (in_param: VpnRpcL3Table): Promise => + { + return this.CallAsync("DelL3Table", in_param); + } + + /** Get List of Routing Tables of Virtual Layer 3 Switch. Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. */ + public EnumL3Table = (in_param: VpnRpcEnumL3Table): Promise => + { + return this.CallAsync("EnumL3Table", in_param); + } + + /** Get List of Certificates Revocation List. Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumCrl = (in_param: VpnRpcEnumCrl): Promise => + { + return this.CallAsync("EnumCrl", in_param); + } + + /** Add a Revoked Certificate. Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public AddCrl = (in_param: VpnRpcCrl): Promise => + { + return this.CallAsync("AddCrl", in_param); + } + + /** Delete a Revoked Certificate. Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public DelCrl = (in_param: VpnRpcCrl): Promise => + { + return this.CallAsync("DelCrl", in_param); + } + + /** Get a Revoked Certificate. Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetCrl = (in_param: VpnRpcCrl): Promise => + { + return this.CallAsync("GetCrl", in_param); + } + + /** Change Existing CRL (Certificate Revocation List) Entry. Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetCrl = (in_param: VpnRpcCrl): Promise => + { + return this.CallAsync("SetCrl", in_param); + } + + /** Add Rule to Source IP Address Limit List. Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetAcList = (in_param: VpnRpcAcList): Promise => + { + return this.CallAsync("SetAcList", in_param); + } + + /** Get List of Rule Items of Source IP Address Limit List. Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetAcList = (in_param: VpnRpcAcList): Promise => + { + return this.CallAsync("GetAcList", in_param); + } + + /** Get List of Log Files. Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. */ + public EnumLogFile = (): Promise => + { + return this.CallAsync("EnumLogFile", new VpnRpcEnumLogFile()); + } + + /** Download a part of Log File. Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. */ + public ReadLogFile = (in_param: VpnRpcReadLogFile): Promise => + { + return this.CallAsync("ReadLogFile", in_param); + } + + /** Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use. */ + public SetSysLog = (in_param: VpnSyslogSetting): Promise => + { + return this.CallAsync("SetSysLog", in_param); + } + + /** Get syslog Send Function. This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. */ + public GetSysLog = (in_param: VpnSyslogSetting): Promise => + { + return this.CallAsync("GetSysLog", in_param); + } + + /** Set Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. */ + public SetHubMsg = (in_param: VpnRpcMsg): Promise => + { + return this.CallAsync("SetHubMsg", in_param); + } + + /** Get Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. */ + public GetHubMsg = (in_param: VpnRpcMsg): Promise => + { + return this.CallAsync("GetHubMsg", in_param); + } + + /** Raise a vital error on the VPN Server / Bridge to terminate the process forcefully. This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. */ + public Crash = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("Crash", in_param); + } + + /** Get the message for administrators. */ + public GetAdminMsg = (): Promise => + { + return this.CallAsync("GetAdminMsg", new VpnRpcMsg()); + } + + /** Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. */ + public Flush = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("Flush", in_param); + } + + /** Enable or Disable IPsec VPN Server Function. Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetIPsecServices = (in_param: VpnIPsecServices): Promise => + { + return this.CallAsync("SetIPsecServices", in_param); + } + + /** Get the Current IPsec VPN Server Settings. Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetIPsecServices = (): Promise => + { + return this.CallAsync("GetIPsecServices", new VpnIPsecServices()); + } + + /** Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices. Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public AddEtherIpId = (in_param: VpnEtherIpId): Promise => + { + return this.CallAsync("AddEtherIpId", in_param); + } + + /** Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetEtherIpId = (in_param: VpnEtherIpId): Promise => + { + return this.CallAsync("GetEtherIpId", in_param); + } + + /** Delete an EtherIP / L2TPv3 over IPsec Client Setting. This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public DeleteEtherIpId = (in_param: VpnEtherIpId): Promise => + { + return this.CallAsync("DeleteEtherIpId", in_param); + } + + /** Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public EnumEtherIpId = (): Promise => + { + return this.CallAsync("EnumEtherIpId", new VpnRpcEnumEtherIpId()); + } + + /** Set Settings for OpenVPN Clone Server Function. The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetOpenVpnSstpConfig = (in_param: VpnOpenVpnSstpConfig): Promise => + { + return this.CallAsync("SetOpenVpnSstpConfig", in_param); + } + + /** Get the Current Settings of OpenVPN Clone Server Function. Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetOpenVpnSstpConfig = (): Promise => + { + return this.CallAsync("GetOpenVpnSstpConfig", new VpnOpenVpnSstpConfig()); + } + + /** Show the Current Status of Dynamic DNS Function. Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + public GetDDnsClientStatus = (): Promise => + { + return this.CallAsync("GetDDnsClientStatus", new VpnDDnsClientStatus()); + } + + /** Set the Dynamic DNS Hostname. You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + public ChangeDDnsClientHostname = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("ChangeDDnsClientHostname", in_param); + } + + /** Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server. You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public RegenerateServerCert = (in_param: VpnRpcTest): Promise => + { + return this.CallAsync("RegenerateServerCert", in_param); + } + + /** Generate a Sample Setting File for OpenVPN Client. Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public MakeOpenVpnConfigFile = (): Promise => + { + return this.CallAsync("MakeOpenVpnConfigFile", new VpnRpcReadLogFile()); + } + + /** Enable / Disable the VPN over ICMP / VPN over DNS Server Function. You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + public SetSpecialListener = (in_param: VpnRpcSpecialListener): Promise => + { + return this.CallAsync("SetSpecialListener", in_param); + } + + /** Get Current Setting of the VPN over ICMP / VPN over DNS Function. Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. */ + public GetSpecialListener = (): Promise => + { + return this.CallAsync("GetSpecialListener", new VpnRpcSpecialListener()); + } + + /** Show the current status of VPN Azure function. Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public GetAzureStatus = (): Promise => + { + return this.CallAsync("GetAzureStatus", new VpnRpcAzureStatus()); + } + + /** Enable / Disable VPN Azure Function. Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. */ + public SetAzureStatus = (in_param: VpnRpcAzureStatus): Promise => + { + return this.CallAsync("SetAzureStatus", in_param); + } + + /** Get the Proxy Settings for Connecting to the DDNS server. */ + public GetDDnsInternetSettng = (): Promise => + { + return this.CallAsync("GetDDnsInternetSettng", new VpnInternetSetting()); + } + + /** Set the Proxy Settings for Connecting to the DDNS server. */ + public SetDDnsInternetSettng = (in_param: VpnInternetSetting): Promise => + { + return this.CallAsync("SetDDnsInternetSettng", in_param); + } + + /** Set the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */ + public SetVgsConfig = (in_param: VpnVgsConfig): Promise => + { + return this.CallAsync("SetVgsConfig", in_param); + } + + /** Get the VPN Gate Server Configuration. This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. */ + public GetVgsConfig = (): Promise => + { + return this.CallAsync("GetVgsConfig", new VpnVgsConfig()); + } + + + + // -- Utility functions -- + /** Call a RPC procedure */ + public async CallAsync(method_name: string, request: T): Promise + { + let response: T = await this.rpc_client.CallAsync(method_name, request); + + return response; + } +} + + + + +// --- Types --- +/** IP Protocol Numbers */ +export enum VpnIpProtocolNumber +{ + /** ICMP for IPv4 */ + ICMPv4 = 1, + + /** TCP */ + TCP = 6, + + /** UDP */ + UDP = 17, + + /** ICMP for IPv6 */ + ICMPv6 = 58, + +} + +/** The body of the Access list */ +export class VpnAccess +{ + /** ID */ + public Id_u32: number = 0; + + /** Specify a description (note) for this rule */ + public Note_utf: string = ""; + + /** Enabled flag (true: enabled, false: disabled) */ + public Active_bool: boolean = false; + + /** Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. */ + public Priority_u32: number = 0; + + /** The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. */ + public Discard_bool: boolean = false; + + /** The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. */ + public IsIPv6_bool: boolean = false; + + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. */ + public SrcIpAddress_ip: string = ""; + + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. */ + public SrcSubnetMask_ip: string = ""; + + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. */ + public DestIpAddress_ip: string = ""; + + /** Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. */ + public DestSubnetMask_ip: string = ""; + + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. */ + public SrcIpAddress6_bin: Uint8Array = new Uint8Array([]); + + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. */ + public SrcSubnetMask6_bin: Uint8Array = new Uint8Array([]); + + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. */ + public DestIpAddress6_bin: Uint8Array = new Uint8Array([]); + + /** Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. */ + public DestSubnetMask6_bin: Uint8Array = new Uint8Array([]); + + /** The IP protocol number */ + public Protocol_u32: VpnIpProtocolNumber = 0; + + /** The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + public SrcPortStart_u32: number = 0; + + /** The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + public SrcPortEnd_u32: number = 0; + + /** The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + public DestPortStart_u32: number = 0; + + /** The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. */ + public DestPortEnd_u32: number = 0; + + /** Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. */ + public SrcUsername_str: string = ""; + + /** Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. */ + public DestUsername_str: string = ""; + + /** Specify true if you want to check the source MAC address. */ + public CheckSrcMac_bool: boolean = false; + + /** Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */ + public SrcMacAddress_bin: Uint8Array = new Uint8Array([]); + + /** Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */ + public SrcMacMask_bin: Uint8Array = new Uint8Array([]); + + /** Specify true if you want to check the destination MAC address. */ + public CheckDstMac_bool: boolean = false; + + /** Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. */ + public DstMacAddress_bin: Uint8Array = new Uint8Array([]); + + /** Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. */ + public DstMacMask_bin: Uint8Array = new Uint8Array([]); + + /** Specify true if you want to check the state of the TCP connection. */ + public CheckTcpState_bool: boolean = false; + + /** Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. */ + public Established_bool: boolean = false; + + /** Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. */ + public Delay_u32: number = 0; + + /** Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. */ + public Jitter_u32: number = 0; + + /** Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. */ + public Loss_u32: number = 0; + + /** The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. */ + public RedirectUrl_str: string = ""; + + /** Constructor for the 'VpnAccess' class: The body of the Access list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Add an item to Access List */ +export class VpnRpcAddAccess +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Access list (Must be a single item) */ + public AccessListSingle: VpnAccess[] = []; + + /** Constructor for the 'VpnRpcAddAccess' class: Add an item to Access List */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Add CA to HUB */ +export class VpnRpcHubAddCA +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The body of the X.509 certificate */ + public Cert_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcHubAddCA' class: Add CA to HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** CRL entry */ +export class VpnRpcCrl +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Key ID */ + public Key_u32: number = 0; + + /** CN, optional */ + public CommonName_utf: string = ""; + + /** O, optional */ + public Organization_utf: string = ""; + + /** OU, optional */ + public Unit_utf: string = ""; + + /** C, optional */ + public Country_utf: string = ""; + + /** ST, optional */ + public State_utf: string = ""; + + /** L, optional */ + public Local_utf: string = ""; + + /** Serial, optional */ + public Serial_bin: Uint8Array = new Uint8Array([]); + + /** MD5 Digest, optional */ + public DigestMD5_bin: Uint8Array = new Uint8Array([]); + + /** SHA1 Digest, optional */ + public DigestSHA1_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcCrl' class: CRL entry */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** EtherIP key list entry */ +export class VpnEtherIpId +{ + /** Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. */ + public Id_str: string = ""; + + /** Specify the name of the Virtual Hub to connect. */ + public HubName_str: string = ""; + + /** Specify the username to login to the destination Virtual Hub. */ + public UserName_str: string = ""; + + /** Specify the password to login to the destination Virtual Hub. */ + public Password_str: string = ""; + + /** Constructor for the 'VpnEtherIpId' class: EtherIP key list entry */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 virtual interface */ +export class VpnRpcL3If +{ + /** L3 switch name */ + public Name_str: string = ""; + + /** Virtual HUB name */ + public HubName_str: string = ""; + + /** IP address */ + public IpAddress_ip: string = ""; + + /** Subnet mask */ + public SubnetMask_ip: string = ""; + + /** Constructor for the 'VpnRpcL3If' class: Layer-3 virtual interface */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 switch */ +export class VpnRpcL3Sw +{ + /** Layer-3 Switch name */ + public Name_str: string = ""; + + /** Constructor for the 'VpnRpcL3Sw' class: Layer-3 switch */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Routing table */ +export class VpnRpcL3Table +{ + /** L3 switch name */ + public Name_str: string = ""; + + /** Network address */ + public NetworkAddress_ip: string = ""; + + /** Subnet mask */ + public SubnetMask_ip: string = ""; + + /** Gateway address */ + public GatewayAddress_ip: string = ""; + + /** Metric */ + public Metric_u32: number = 0; + + /** Constructor for the 'VpnRpcL3Table' class: Routing table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Generic parameter to contain u32, u64, ascii_string and unicode string */ +export class VpnRpcTest +{ + /** A 32-bit integer field */ + public IntValue_u32: number = 0; + + /** A 64-bit integer field */ + public Int64Value_u64: number = 0; + + /** An Ascii string field */ + public StrValue_str: string = ""; + + /** An UTF-8 string field */ + public UniStrValue_utf: string = ""; + + /** Constructor for the 'VpnRpcTest' class: Generic parameter to contain u32, u64, ascii_string and unicode string */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Local Bridge list item */ +export class VpnRpcLocalBridge +{ + /** Physical Ethernet device name */ + public DeviceName_str: string = ""; + + /** The Virtual Hub name */ + public HubNameLB_str: string = ""; + + /** Online flag */ + public Online_bool: boolean = false; + + /** Running flag */ + public Active_bool: boolean = false; + + /** Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). */ + public TapMode_bool: boolean = false; + + /** Constructor for the 'VpnRpcLocalBridge' class: Local Bridge list item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Create, configure, and get the group */ +export class VpnRpcSetGroup +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The group name */ + public Name_str: string = ""; + + /** Optional real name (full name) of the group, allow using any Unicode characters */ + public Realname_utf: string = ""; + + /** Optional, specify a description of the group */ + public Note_utf: string = ""; + + /** Number of broadcast packets (Recv) */ + public ["Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastCount_u64"]: number = 0; + + /** The flag whether to use security policy */ + public UsePolicy_bool: boolean = false; + + /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */ + public ["policy:Access_bool"]: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPFilter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + public ["policy:DHCPNoServer_bool"]: boolean = false; + + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + public ["policy:DHCPForce_bool"]: boolean = false; + + /** Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. */ + public ["policy:NoBridge_bool"]: boolean = false; + + /** Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + public ["policy:NoRouting_bool"]: boolean = false; + + /** Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckMac_bool"]: boolean = false; + + /** Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckIP_bool"]: boolean = false; + + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + public ["policy:ArpDhcpOnly_bool"]: boolean = false; + + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + public ["policy:PrivacyFilter_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + public ["policy:NoServer_bool"]: boolean = false; + + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + public ["policy:NoBroadcastLimiter_bool"]: boolean = false; + + /** Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. */ + public ["policy:MonitorPort_bool"]: boolean = false; + + /** Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. */ + public ["policy:MaxConnection_u32"]: number = 0; + + /** Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. */ + public ["policy:TimeOut_u32"]: number = 0; + + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + public ["policy:MaxMac_u32"]: number = 0; + + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + public ["policy:MaxIP_u32"]: number = 0; + + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + public ["policy:MaxUpload_u32"]: number = 0; + + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + public ["policy:MaxDownload_u32"]: number = 0; + + /** Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. */ + public ["policy:FixPassword_bool"]: boolean = false; + + /** Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. */ + public ["policy:MultiLogins_u32"]: number = 0; + + /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */ + public ["policy:NoQoS_bool"]: boolean = false; + + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + public ["policy:RSandRAFilter_bool"]: boolean = false; + + /** Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. */ + public ["policy:RAFilter_bool"]: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPv6Filter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + public ["policy:DHCPv6NoServer_bool"]: boolean = false; + + /** Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + public ["policy:NoRoutingV6_bool"]: boolean = false; + + /** Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckIPv6_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + public ["policy:NoServerV6_bool"]: boolean = false; + + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + public ["policy:MaxIPv6_u32"]: number = 0; + + /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + public ["policy:NoSavePassword_bool"]: boolean = false; + + /** Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + public ["policy:AutoDisconnect_u32"]: number = 0; + + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv4_bool"]: boolean = false; + + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv6_bool"]: boolean = false; + + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + public ["policy:FilterNonIP_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: boolean = false; + + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + public ["policy:VLanId_u32"]: number = 0; + + /** Security policy: Whether version 3.0 (must be true) */ + public ["policy:Ver3_bool"]: boolean = false; + + /** Constructor for the 'VpnRpcSetGroup' class: Create, configure, and get the group */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Hub types */ +export enum VpnRpcHubType +{ + /** Stand-alone HUB */ + Standalone = 0, + + /** Static HUB */ + FarmStatic = 1, + + /** Dynamic HUB */ + FarmDynamic = 2, + +} + +/** Create a HUB */ +export class VpnRpcCreateHub +{ + /** Specify the name of the Virtual Hub to create / update. */ + public HubName_str: string = ""; + + /** Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. */ + public AdminPasswordPlainText_str: string = ""; + + /** Online flag */ + public Online_bool: boolean = false; + + /** Maximum number of VPN sessions */ + public MaxSession_u32: number = 0; + + /** No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. */ + public NoEnum_bool: boolean = false; + + /** Type of the Virtual Hub (Valid only for Clustered VPN Servers) */ + public HubType_u32: VpnRpcHubType = 0; + + /** Constructor for the 'VpnRpcCreateHub' class: Create a HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +export enum VpnRpcClientAuthType +{ + /** Anonymous authentication */ + Anonymous = 0, + + /** SHA-0 hashed password authentication */ + SHA0_Hashed_Password = 1, + + /** Plain password authentication */ + PlainPassword = 2, + + /** Certificate authentication */ + Cert = 3, + +} + +/** Create and set of link */ +export class VpnRpcCreateLink +{ + /** The Virtual Hub name */ + public HubName_Ex_str: string = ""; + + /** Online flag */ + public Online_bool: boolean = false; + + /** The flag to enable validation for the server certificate */ + public CheckServerCert_bool: boolean = false; + + /** The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. */ + public ServerCert_bin: Uint8Array = new Uint8Array([]); + + /** Client Option Parameters: Specify the name of the Cascade Connection */ + public AccountName_utf: string = ""; + + /** Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. */ + public Hostname_str: string = ""; + + /** Client Option Parameters: Specify the port number of the destination VPN Server. */ + public Port_u32: number = 0; + + /** Client Option Parameters: The type of the proxy server */ + public ProxyType_u32: VpnRpcProxyType = 0; + + /** Client Option Parameters: The hostname or IP address of the proxy server name */ + public ProxyName_str: string = ""; + + /** Client Option Parameters: The port number of the proxy server */ + public ProxyPort_u32: number = 0; + + /** Client Option Parameters: The username to connect to the proxy server */ + public ProxyUsername_str: string = ""; + + /** Client Option Parameters: The password to connect to the proxy server */ + public ProxyPassword_str: string = ""; + + /** Client Option Parameters: The Virtual Hub on the destination VPN Server */ + public HubName_str: string = ""; + + /** Client Option Parameters: Number of TCP Connections to Use in VPN Communication */ + public MaxConnection_u32: number = 0; + + /** Client Option Parameters: The flag to enable the encryption on the communication */ + public UseEncrypt_bool: boolean = false; + + /** Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection */ + public UseCompress_bool: boolean = false; + + /** Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. */ + public HalfConnection_bool: boolean = false; + + /** Client Option Parameters: Connection attempt interval when additional connection will be established */ + public AdditionalConnectionInterval_u32: number = 0; + + /** Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) */ + public ConnectionDisconnectSpan_u32: number = 0; + + /** Client Option Parameters: Disable QoS Control Function if the value is true */ + public DisableQoS_bool: boolean = false; + + /** Client Option Parameters: Do not use TLS 1.x of the value is true */ + public NoTls1_bool: boolean = false; + + /** Client Option Parameters: Do not use UDP acceleration mode if the value is true */ + public NoUdpAcceleration_bool: boolean = false; + + /** Authentication type */ + public AuthType_u32: VpnRpcClientAuthType = 0; + + /** User name */ + public Username_str: string = ""; + + /** SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). */ + public HashedPassword_bin: Uint8Array = new Uint8Array([]); + + /** Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). */ + public PlainPassword_str: string = ""; + + /** Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */ + public ClientX_bin: Uint8Array = new Uint8Array([]); + + /** Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). */ + public ClientK_bin: Uint8Array = new Uint8Array([]); + + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPFilter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + public ["policy:DHCPNoServer_bool"]: boolean = false; + + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + public ["policy:DHCPForce_bool"]: boolean = false; + + /** Security policy: Prohibit the duplicate MAC address */ + public SecPol_CheckMac_bool: boolean = false; + + /** Security policy: Prohibit a duplicate IP address (IPv4) */ + public SecPol_CheckIP_bool: boolean = false; + + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + public ["policy:ArpDhcpOnly_bool"]: boolean = false; + + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + public ["policy:PrivacyFilter_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + public ["policy:NoServer_bool"]: boolean = false; + + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + public ["policy:NoBroadcastLimiter_bool"]: boolean = false; + + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + public ["policy:MaxMac_u32"]: number = 0; + + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + public ["policy:MaxIP_u32"]: number = 0; + + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + public ["policy:MaxUpload_u32"]: number = 0; + + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + public ["policy:MaxDownload_u32"]: number = 0; + + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + public ["policy:RSandRAFilter_bool"]: boolean = false; + + /** Security policy: Filter the router advertisement packet (IPv6) */ + public SecPol_RAFilter_bool: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPv6Filter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + public ["policy:DHCPv6NoServer_bool"]: boolean = false; + + /** Security policy: Prohibit the duplicate IP address (IPv6) */ + public SecPol_CheckIPv6_bool: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + public ["policy:NoServerV6_bool"]: boolean = false; + + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + public ["policy:MaxIPv6_u32"]: number = 0; + + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv4_bool"]: boolean = false; + + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv6_bool"]: boolean = false; + + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + public ["policy:FilterNonIP_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean = false; + + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + public ["policy:VLanId_u32"]: number = 0; + + /** Security policy: Whether version 3.0 (must be true) */ + public ["policy:Ver3_bool"]: boolean = false; + + /** Constructor for the 'VpnRpcCreateLink' class: Create and set of link */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Listener */ +export class VpnRpcListener +{ + /** Port number (Range: 1 - 65535) */ + public Port_u32: number = 0; + + /** Active state */ + public Enable_bool: boolean = false; + + /** Constructor for the 'VpnRpcListener' class: Listener */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** User authentication type (server side) */ +export enum VpnRpcUserAuthType +{ + /** Anonymous authentication */ + Anonymous = 0, + + /** Password authentication */ + Password = 1, + + /** User certificate authentication */ + UserCert = 2, + + /** Root certificate which is issued by trusted Certificate Authority */ + RootCert = 3, + + /** Radius authentication */ + Radius = 4, + + /** Windows NT authentication */ + NTDomain = 5, + +} + +/** Create, configure, and get the user */ +export class VpnRpcSetUser +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Specify the user name of the user */ + public Name_str: string = ""; + + /** Assigned group name for the user */ + public GroupName_str: string = ""; + + /** Optional real name (full name) of the user, allow using any Unicode characters */ + public Realname_utf: string = ""; + + /** Optional User Description */ + public Note_utf: string = ""; + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Last modified date and time */ + public UpdatedTime_dt: Date = new Date(); + + /** Expiration date and time */ + public ExpireTime_dt: Date = new Date(); + + /** Authentication method of the user */ + public AuthType_u32: VpnRpcUserAuthType = 0; + + /** User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. */ + public Auth_Password_str: string = ""; + + /** User certificate, valid only if AuthType_u32 == UserCert(2). */ + public UserX_bin: Uint8Array = new Uint8Array([]); + + /** Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). */ + public Serial_bin: Uint8Array = new Uint8Array([]); + + /** Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). */ + public CommonName_utf: string = ""; + + /** Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). */ + public RadiusUsername_utf: string = ""; + + /** Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). */ + public NtUsername_utf: string = ""; + + /** Number of total logins of the user */ + public NumLogin_u32: number = 0; + + /** Number of broadcast packets (Recv) */ + public ["Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastCount_u64"]: number = 0; + + /** The flag whether to use security policy */ + public UsePolicy_bool: boolean = false; + + /** Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. */ + public ["policy:Access_bool"]: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPFilter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. */ + public ["policy:DHCPNoServer_bool"]: boolean = false; + + /** Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. */ + public ["policy:DHCPForce_bool"]: boolean = false; + + /** Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. */ + public ["policy:NoBridge_bool"]: boolean = false; + + /** Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + public ["policy:NoRouting_bool"]: boolean = false; + + /** Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckMac_bool"]: boolean = false; + + /** Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckIP_bool"]: boolean = false; + + /** Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. */ + public ["policy:ArpDhcpOnly_bool"]: boolean = false; + + /** Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. */ + public ["policy:PrivacyFilter_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. */ + public ["policy:NoServer_bool"]: boolean = false; + + /** Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. */ + public ["policy:NoBroadcastLimiter_bool"]: boolean = false; + + /** Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. */ + public ["policy:MonitorPort_bool"]: boolean = false; + + /** Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. */ + public ["policy:MaxConnection_u32"]: number = 0; + + /** Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. */ + public ["policy:TimeOut_u32"]: number = 0; + + /** Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. */ + public ["policy:MaxMac_u32"]: number = 0; + + /** Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. */ + public ["policy:MaxIP_u32"]: number = 0; + + /** Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. */ + public ["policy:MaxUpload_u32"]: number = 0; + + /** Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. */ + public ["policy:MaxDownload_u32"]: number = 0; + + /** Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. */ + public ["policy:FixPassword_bool"]: boolean = false; + + /** Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. */ + public ["policy:MultiLogins_u32"]: number = 0; + + /** Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. */ + public ["policy:NoQoS_bool"]: boolean = false; + + /** Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. */ + public ["policy:RSandRAFilter_bool"]: boolean = false; + + /** Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. */ + public ["policy:RAFilter_bool"]: boolean = false; + + /** Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. */ + public ["policy:DHCPv6Filter_bool"]: boolean = false; + + /** Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. */ + public ["policy:DHCPv6NoServer_bool"]: boolean = false; + + /** Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. */ + public ["policy:NoRoutingV6_bool"]: boolean = false; + + /** Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. */ + public ["policy:CheckIPv6_bool"]: boolean = false; + + /** Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. */ + public ["policy:NoServerV6_bool"]: boolean = false; + + /** Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. */ + public ["policy:MaxIPv6_u32"]: number = 0; + + /** Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + public ["policy:NoSavePassword_bool"]: boolean = false; + + /** Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. */ + public ["policy:AutoDisconnect_u32"]: number = 0; + + /** Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv4_bool"]: boolean = false; + + /** Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. */ + public ["policy:FilterIPv6_bool"]: boolean = false; + + /** Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. */ + public ["policy:FilterNonIP_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRA_bool"]: boolean = false; + + /** Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. */ + public ["policy:NoIPv6DefaultRouterInRAWhenIPv6_bool"]: boolean = false; + + /** Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. */ + public ["policy:VLanId_u32"]: number = 0; + + /** Security policy: Whether version 3.0 (must be true) */ + public ["policy:Ver3_bool"]: boolean = false; + + /** Constructor for the 'VpnRpcSetUser' class: Create, configure, and get the user */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Delete the access list */ +export class VpnRpcDeleteAccess +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** ID */ + public Id_u32: number = 0; + + /** Constructor for the 'VpnRpcDeleteAccess' class: Delete the access list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Delete the CA of HUB */ +export class VpnRpcHubDeleteCA +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Certificate key id to be deleted */ + public Key_u32: number = 0; + + /** Constructor for the 'VpnRpcHubDeleteCA' class: Delete the CA of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Deleting a user or group */ +export class VpnRpcDeleteUser +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** User or group name */ + public Name_str: string = ""; + + /** Constructor for the 'VpnRpcDeleteUser' class: Deleting a user or group */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Delete the HUB */ +export class VpnRpcDeleteHub +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Constructor for the 'VpnRpcDeleteHub' class: Delete the HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Delete the table */ +export class VpnRpcDeleteTable +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Key ID */ + public Key_u32: number = 0; + + /** Constructor for the 'VpnRpcDeleteTable' class: Delete the table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Specify the Link */ +export class VpnRpcLink +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The name of the cascade connection */ + public AccountName_utf: string = ""; + + /** Constructor for the 'VpnRpcLink' class: Specify the Link */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Disconnect the session */ +export class VpnRpcDeleteSession +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Session name */ + public Name_str: string = ""; + + /** Constructor for the 'VpnRpcDeleteSession' class: Disconnect the session */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Specify the HUB */ +export class VpnRpcHub +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Constructor for the 'VpnRpcHub' class: Specify the HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Disconnect a connection */ +export class VpnRpcDisconnectConnection +{ + /** Connection name */ + public Name_str: string = ""; + + /** Constructor for the 'VpnRpcDisconnectConnection' class: Disconnect a connection */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of the access list */ +export class VpnRpcEnumAccessList +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Access list */ + public AccessList: VpnAccess[] = []; + + /** Constructor for the 'VpnRpcEnumAccessList' class: Enumeration of the access list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** CA enumeration items of HUB */ +export class VpnRpcHubEnumCAItem +{ + /** The key id of the item */ + public Key_u32: number = 0; + + /** Subject */ + public SubjectName_utf: string = ""; + + /** Issuer */ + public IssuerName_utf: string = ""; + + /** Expiration date */ + public Expires_dt: Date = new Date(); + + /** Constructor for the 'VpnRpcHubEnumCAItem' class: CA enumeration items of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** CA enumeration of HUB */ +export class VpnRpcHubEnumCA +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The list of CA */ + public CAList: VpnRpcHubEnumCAItem[] = []; + + /** Constructor for the 'VpnRpcHubEnumCA' class: CA enumeration of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Type of connection */ +export enum VpnRpcConnectionType +{ + /** VPN Client */ + Client = 0, + + /** During initialization */ + Init = 1, + + /** Login connection */ + Login = 2, + + /** Additional connection */ + Additional = 3, + + /** RPC for server farm */ + FarmRpc = 4, + + /** RPC for Management */ + AdminRpc = 5, + + /** HUB enumeration */ + EnumHub = 6, + + /** Password change */ + Password = 7, + + /** SSTP */ + SSTP = 8, + + /** OpenVPN */ + OpenVPN = 9, + +} + +/** Connection enumeration items */ +export class VpnRpcEnumConnectionItem +{ + /** Connection name */ + public Name_str: string = ""; + + /** Host name */ + public Hostname_str: string = ""; + + /** IP address */ + public Ip_ip: string = ""; + + /** Port number */ + public Port_u32: number = 0; + + /** Connected time */ + public ConnectedTime_dt: Date = new Date(); + + /** Connection type */ + public Type_u32: VpnRpcConnectionType = 0; + + /** Constructor for the 'VpnRpcEnumConnectionItem' class: Connection enumeration items */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Connection enumeration */ +export class VpnRpcEnumConnection +{ + /** Number of connections */ + public NumConnection_u32: number = 0; + + /** Connection list */ + public ConnectionList: VpnRpcEnumConnectionItem[] = []; + + /** Constructor for the 'VpnRpcEnumConnection' class: Connection enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enum CRL Item */ +export class VpnRpcEnumCrlItem +{ + /** Key ID */ + public Key_u32: number = 0; + + /** The contents of the CRL item */ + public CrlInfo_utf: string = ""; + + /** Constructor for the 'VpnRpcEnumCrlItem' class: Enum CRL Item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enum CRL */ +export class VpnRpcEnumCrl +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** CRL list */ + public CRLList: VpnRpcEnumCrlItem[] = []; + + /** Constructor for the 'VpnRpcEnumCrl' class: Enum CRL */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RPC_ENUM_DHCP_ITEM */ +export class VpnRpcEnumDhcpItem +{ + /** ID */ + public Id_u32: number = 0; + + /** Lease time */ + public LeasedTime_dt: Date = new Date(); + + /** Expiration date */ + public ExpireTime_dt: Date = new Date(); + + /** MAC address */ + public MacAddress_bin: Uint8Array = new Uint8Array([]); + + /** IP address */ + public IpAddress_ip: string = ""; + + /** Subnet mask */ + public Mask_u32: number = 0; + + /** Host name */ + public Hostname_str: string = ""; + + /** Constructor for the 'VpnRpcEnumDhcpItem' class: RPC_ENUM_DHCP_ITEM */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RPC_ENUM_DHCP */ +export class VpnRpcEnumDhcp +{ + /** Virtual Hub Name */ + public HubName_str: string = ""; + + /** DHCP Item */ + public DhcpTable: VpnRpcEnumDhcpItem[] = []; + + /** Constructor for the 'VpnRpcEnumDhcp' class: RPC_ENUM_DHCP */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** EtherIP setting list */ +export class VpnRpcEnumEtherIpId +{ + /** Setting list */ + public Settings: VpnEtherIpId[] = []; + + /** Constructor for the 'VpnRpcEnumEtherIpId' class: EtherIP setting list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Ethernet Network Adapters list item */ +export class VpnRpcEnumEthItem +{ + /** Device name */ + public DeviceName_str: string = ""; + + /** Network connection name (description) */ + public NetworkConnectionName_utf: string = ""; + + /** Constructor for the 'VpnRpcEnumEthItem' class: Ethernet Network Adapters list item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Ethernet Network Adapters list */ +export class VpnRpcEnumEth +{ + /** Ethernet Network Adapters list */ + public EthList: VpnRpcEnumEthItem[] = []; + + /** Constructor for the 'VpnRpcEnumEth' class: Ethernet Network Adapters list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server farm members enumeration items */ +export class VpnRpcEnumFarmItem +{ + /** ID */ + public Id_u32: number = 0; + + /** Controller */ + public Controller_bool: boolean = false; + + /** Connection time */ + public ConnectedTime_dt: Date = new Date(); + + /** IP address */ + public Ip_ip: string = ""; + + /** Host name */ + public Hostname_str: string = ""; + + /** Point */ + public Point_u32: number = 0; + + /** Number of sessions */ + public NumSessions_u32: number = 0; + + /** Number of TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Number of HUBs */ + public NumHubs_u32: number = 0; + + /** Number of assigned client licenses */ + public AssignedClientLicense_u32: number = 0; + + /** Number of assigned bridge licenses */ + public AssignedBridgeLicense_u32: number = 0; + + /** Constructor for the 'VpnRpcEnumFarmItem' class: Server farm members enumeration items */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server farm member enumeration */ +export class VpnRpcEnumFarm +{ + /** Number of Cluster Members */ + public NumFarm_u32: number = 0; + + /** Cluster Members list */ + public FarmMemberList: VpnRpcEnumFarmItem[] = []; + + /** Constructor for the 'VpnRpcEnumFarm' class: Server farm member enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration items in the group */ +export class VpnRpcEnumGroupItem +{ + /** User name */ + public Name_str: string = ""; + + /** Real name */ + public Realname_utf: string = ""; + + /** Note */ + public Note_utf: string = ""; + + /** Number of users */ + public NumUsers_u32: number = 0; + + /** Access denied */ + public DenyAccess_bool: boolean = false; + + /** Constructor for the 'VpnRpcEnumGroupItem' class: Enumeration items in the group */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Group enumeration */ +export class VpnRpcEnumGroup +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Group list */ + public GroupList: VpnRpcEnumGroupItem[] = []; + + /** Constructor for the 'VpnRpcEnumGroup' class: Group enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration items of HUB */ +export class VpnRpcEnumHubItem +{ + /** The name of the Virtual Hub */ + public HubName_str: string = ""; + + /** Online state */ + public Online_bool: boolean = false; + + /** Type of HUB (Valid only for Clustered VPN Servers) */ + public HubType_u32: VpnRpcHubType = 0; + + /** Number of users */ + public NumUsers_u32: number = 0; + + /** Number of registered groups */ + public NumGroups_u32: number = 0; + + /** Number of registered sessions */ + public NumSessions_u32: number = 0; + + /** Number of current MAC table entries */ + public NumMacTables_u32: number = 0; + + /** Number of current IP table entries */ + public NumIpTables_u32: number = 0; + + /** Last communication date and time */ + public LastCommTime_dt: Date = new Date(); + + /** Last login date and time */ + public LastLoginTime_dt: Date = new Date(); + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Number of accumulated logins */ + public NumLogin_u32: number = 0; + + /** Whether the traffic information is provided */ + public IsTrafficFilled_bool: boolean = false; + + /** Number of broadcast packets (Recv) */ + public ["Ex.Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Ex.Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Ex.Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Ex.Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Ex.Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Ex.Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Ex.Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Ex.Send.UnicastCount_u64"]: number = 0; + + /** Constructor for the 'VpnRpcEnumHubItem' class: Enumeration items of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of HUB */ +export class VpnRpcEnumHub +{ + /** Number of Virtual Hubs */ + public NumHub_u32: number = 0; + + /** Virtual Hubs */ + public HubList: VpnRpcEnumHubItem[] = []; + + /** Constructor for the 'VpnRpcEnumHub' class: Enumeration of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration items of IP table */ +export class VpnRpcEnumIpTableItem +{ + /** Key ID */ + public Key_u32: number = 0; + + /** Session name */ + public SessionName_str: string = ""; + + /** IP address */ + public IpAddress_ip: string = ""; + + /** Assigned by the DHCP */ + public DhcpAllocated_bool: boolean = false; + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Updating date */ + public UpdatedTime_dt: Date = new Date(); + + /** Remote items */ + public RemoteItem_bool: boolean = false; + + /** Remote host name */ + public RemoteHostname_str: string = ""; + + /** Constructor for the 'VpnRpcEnumIpTableItem' class: Enumeration items of IP table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of IP table */ +export class VpnRpcEnumIpTable +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** MAC table */ + public IpTable: VpnRpcEnumIpTableItem[] = []; + + /** Constructor for the 'VpnRpcEnumIpTable' class: Enumeration of IP table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 interface enumeration */ +export class VpnRpcEnumL3If +{ + /** Layer-3 switch name */ + public Name_str: string = ""; + + /** Layer-3 interface list */ + public L3IFList: VpnRpcL3If[] = []; + + /** Constructor for the 'VpnRpcEnumL3If' class: Layer-3 interface enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 switch enumeration item */ +export class VpnRpcEnumL3SwItem +{ + /** Name of the layer-3 switch */ + public Name_str: string = ""; + + /** Number of layer-3 switch virtual interfaces */ + public NumInterfaces_u32: number = 0; + + /** Number of routing tables */ + public NumTables_u32: number = 0; + + /** Activated flag */ + public Active_bool: boolean = false; + + /** Online flag */ + public Online_bool: boolean = false; + + /** Constructor for the 'VpnRpcEnumL3SwItem' class: Layer-3 switch enumeration item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Layer-3 switch enumeration */ +export class VpnRpcEnumL3Sw +{ + /** Layer-3 switch list */ + public L3SWList: VpnRpcEnumL3SwItem[] = []; + + /** Constructor for the 'VpnRpcEnumL3Sw' class: Layer-3 switch enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Routing table enumeration */ +export class VpnRpcEnumL3Table +{ + /** L3 switch name */ + public Name_str: string = ""; + + /** Routing table item list */ + public L3Table: VpnRpcL3Table[] = []; + + /** Constructor for the 'VpnRpcEnumL3Table' class: Routing table enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Cascade Connection Enumeration */ +export class VpnRpcEnumLinkItem +{ + /** The name of cascade connection */ + public AccountName_utf: string = ""; + + /** Online flag */ + public Online_bool: boolean = false; + + /** The flag indicates whether the cascade connection is established */ + public Connected_bool: boolean = false; + + /** The error last occurred if the cascade connection is in the fail state */ + public LastError_u32: number = 0; + + /** Connection completion time */ + public ConnectedTime_dt: Date = new Date(); + + /** Host name of the destination VPN server */ + public Hostname_str: string = ""; + + /** The Virtual Hub name */ + public TargetHubName_str: string = ""; + + /** Constructor for the 'VpnRpcEnumLinkItem' class: Cascade Connection Enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of the link */ +export class VpnRpcEnumLink +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Number of cascade connections */ + public NumLink_u32: number = 0; + + /** The list of cascade connections */ + public LinkList: VpnRpcEnumLinkItem[] = []; + + /** Constructor for the 'VpnRpcEnumLink' class: Enumeration of the link */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** List of listeners item */ +export class VpnRpcListenerListItem +{ + /** TCP port number (range: 1 - 65535) */ + public Ports_u32: number = 0; + + /** Active state */ + public Enables_bool: boolean = false; + + /** The flag to indicate if the error occurred on the listener port */ + public Errors_bool: boolean = false; + + /** Constructor for the 'VpnRpcListenerListItem' class: List of listeners item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** List of listeners */ +export class VpnRpcListenerList +{ + /** List of listener items */ + public ListenerList: VpnRpcListenerListItem[] = []; + + /** Constructor for the 'VpnRpcListenerList' class: List of listeners */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Local Bridge enumeration */ +export class VpnRpcEnumLocalBridge +{ + /** Local Bridge list */ + public LocalBridgeList: VpnRpcLocalBridge[] = []; + + /** Constructor for the 'VpnRpcEnumLocalBridge' class: Local Bridge enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Log file enumeration */ +export class VpnRpcEnumLogFileItem +{ + /** Server name */ + public ServerName_str: string = ""; + + /** File path */ + public FilePath_str: string = ""; + + /** File size */ + public FileSize_u32: number = 0; + + /** Last write date */ + public UpdatedTime_dt: Date = new Date(); + + /** Constructor for the 'VpnRpcEnumLogFileItem' class: Log file enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Log file enumeration */ +export class VpnRpcEnumLogFile +{ + /** Log file list */ + public LogFiles: VpnRpcEnumLogFileItem[] = []; + + /** Constructor for the 'VpnRpcEnumLogFile' class: Log file enumeration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration items of the MAC table */ +export class VpnRpcEnumMacTableItem +{ + /** Key ID */ + public Key_u32: number = 0; + + /** Session name */ + public SessionName_str: string = ""; + + /** MAC address */ + public MacAddress_bin: Uint8Array = new Uint8Array([]); + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Updating date */ + public UpdatedTime_dt: Date = new Date(); + + /** Remote items */ + public RemoteItem_bool: boolean = false; + + /** Remote host name */ + public RemoteHostname_str: string = ""; + + /** VLAN ID */ + public VlanId_u32: number = 0; + + /** Constructor for the 'VpnRpcEnumMacTableItem' class: Enumeration items of the MAC table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of the MAC table */ +export class VpnRpcEnumMacTable +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** MAC table */ + public MacTable: VpnRpcEnumMacTableItem[] = []; + + /** Constructor for the 'VpnRpcEnumMacTable' class: Enumeration of the MAC table */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** NAT Entry Protocol Number */ +export enum VpnRpcNatProtocol +{ + /** TCP */ + TCP = 0, + + /** UDP */ + UDP = 1, + + /** DNS */ + DNS = 2, + + /** ICMP */ + ICMP = 3, + +} + +/** State of NAT session (TCP) */ +export enum VpnRpcNatTcpState +{ + /** Connecting */ + Connecting = 0, + + /** Send the RST (Connection failure or disconnected) */ + SendReset = 1, + + /** Connection complete */ + Connected = 2, + + /** Connection established */ + Established = 3, + + /** Wait for socket disconnection */ + WaitDisconnect = 4, + +} + +/** VpnRpcEnumNat List Item */ +export class VpnRpcEnumNatItem +{ + /** ID */ + public Id_u32: number = 0; + + /** Protocol */ + public Protocol_u32: VpnRpcNatProtocol = 0; + + /** Source IP address */ + public SrcIp_ip: string = ""; + + /** Source host name */ + public SrcHost_str: string = ""; + + /** Source port number */ + public SrcPort_u32: number = 0; + + /** Destination IP address */ + public DestIp_ip: string = ""; + + /** Destination host name */ + public DestHost_str: string = ""; + + /** Destination port number */ + public DestPort_u32: number = 0; + + /** Connection time */ + public CreatedTime_dt: Date = new Date(); + + /** Last communication time */ + public LastCommTime_dt: Date = new Date(); + + /** Transmission size */ + public SendSize_u64: number = 0; + + /** Receive size */ + public RecvSize_u64: number = 0; + + /** TCP state */ + public TcpStatus_u32: VpnRpcNatTcpState = 0; + + /** Constructor for the 'VpnRpcEnumNatItem' class: VpnRpcEnumNat List Item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RPC_ENUM_NAT */ +export class VpnRpcEnumNat +{ + /** Virtual Hub Name */ + public HubName_str: string = ""; + + /** NAT item */ + public NatTable: VpnRpcEnumNatItem[] = []; + + /** Constructor for the 'VpnRpcEnumNat' class: RPC_ENUM_NAT */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration item of VPN session */ +export class VpnRpcEnumSessionItem +{ + /** Session name */ + public Name_str: string = ""; + + /** Remote session */ + public RemoteSession_bool: boolean = false; + + /** Remote server name */ + public RemoteHostname_str: string = ""; + + /** User name */ + public Username_str: string = ""; + + /** IP address */ + public ClientIP_ip: string = ""; + + /** Host name */ + public Hostname_str: string = ""; + + /** Maximum number of underlying TCP connections */ + public MaxNumTcp_u32: number = 0; + + /** Number of current underlying TCP connections */ + public CurrentNumTcp_u32: number = 0; + + /** Packet size transmitted */ + public PacketSize_u64: number = 0; + + /** Number of packets transmitted */ + public PacketNum_u64: number = 0; + + /** Is a Cascade VPN session */ + public LinkMode_bool: boolean = false; + + /** Is a SecureNAT VPN session */ + public SecureNATMode_bool: boolean = false; + + /** Is the VPN session for Local Bridge */ + public BridgeMode_bool: boolean = false; + + /** Is a Layer-3 Switch VPN session */ + public Layer3Mode_bool: boolean = false; + + /** Is in Bridge Mode */ + public Client_BridgeMode_bool: boolean = false; + + /** Is in Monitor Mode */ + public Client_MonitorMode_bool: boolean = false; + + /** VLAN ID */ + public VLanId_u32: number = 0; + + /** Unique ID of the VPN Session */ + public UniqueId_bin: Uint8Array = new Uint8Array([]); + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Last communication date and time */ + public LastCommTime_dt: Date = new Date(); + + /** Constructor for the 'VpnRpcEnumSessionItem' class: Enumeration item of VPN session */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumerate VPN sessions */ +export class VpnRpcEnumSession +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** VPN sessions list */ + public SessionList: VpnRpcEnumSessionItem[] = []; + + /** Constructor for the 'VpnRpcEnumSession' class: Enumerate VPN sessions */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration item of user */ +export class VpnRpcEnumUserItem +{ + /** User name */ + public Name_str: string = ""; + + /** Group name */ + public GroupName_str: string = ""; + + /** Real name */ + public Realname_utf: string = ""; + + /** Note */ + public Note_utf: string = ""; + + /** Authentication method */ + public AuthType_u32: VpnRpcUserAuthType = 0; + + /** Number of logins */ + public NumLogin_u32: number = 0; + + /** Last login date and time */ + public LastLoginTime_dt: Date = new Date(); + + /** Access denied */ + public DenyAccess_bool: boolean = false; + + /** Flag of whether the traffic variable is set */ + public IsTrafficFilled_bool: boolean = false; + + /** Flag of whether expiration date variable is set */ + public IsExpiresFilled_bool: boolean = false; + + /** Expiration date */ + public Expires_dt: Date = new Date(); + + /** Number of broadcast packets (Recv) */ + public ["Ex.Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Ex.Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Ex.Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Ex.Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Ex.Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Ex.Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Ex.Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Ex.Send.UnicastCount_u64"]: number = 0; + + /** Constructor for the 'VpnRpcEnumUserItem' class: Enumeration item of user */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Enumeration of user */ +export class VpnRpcEnumUser +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** User list */ + public UserList: VpnRpcEnumUserItem[] = []; + + /** Constructor for the 'VpnRpcEnumUser' class: Enumeration of user */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Source IP Address Limit List Item */ +export class VpnAc +{ + /** ID */ + public Id_u32: number = 0; + + /** Priority */ + public Priority_u32: number = 0; + + /** Deny access */ + public Deny_bool: boolean = false; + + /** Set true if you want to specify the SubnetMask_ip item. */ + public Masked_bool: boolean = false; + + /** IP address */ + public IpAddress_ip: string = ""; + + /** Subnet mask, valid only if Masked_bool == true */ + public SubnetMask_ip: string = ""; + + /** Constructor for the 'VpnAc' class: Source IP Address Limit List Item */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Source IP Address Limit List */ +export class VpnRpcAcList +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Source IP Address Limit List */ + public ACList: VpnAc[] = []; + + /** Constructor for the 'VpnRpcAcList' class: Source IP Address Limit List */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Message */ +export class VpnRpcMsg +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Message (Unicode strings acceptable) */ + public Msg_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcMsg' class: Message */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Get / Set the Azure state */ +export class VpnRpcAzureStatus +{ + /** Whether VPN Azure Function is Enabled */ + public IsEnabled_bool: boolean = false; + + /** Whether connection to VPN Azure Cloud Server is established */ + public IsConnected_bool: boolean = false; + + /** Constructor for the 'VpnRpcAzureStatus' class: Get / Set the Azure state */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Local Bridge support information */ +export class VpnRpcBridgeSupport +{ + /** Whether the OS supports the Local Bridge function */ + public IsBridgeSupportedOs_bool: boolean = false; + + /** Whether WinPcap is necessary to install */ + public IsWinPcapNeeded_bool: boolean = false; + + /** Constructor for the 'VpnRpcBridgeSupport' class: Local Bridge support information */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Get the CA of HUB */ +export class VpnRpcHubGetCA +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The key id of the certificate */ + public Key_u32: number = 0; + + /** The body of the X.509 certificate */ + public Cert_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcHubGetCA' class: Get the CA of HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Caps item of the VPN Server */ +export class VpnCaps +{ + /** Name */ + public CapsName_str: string = ""; + + /** Value */ + public CapsValue_u32: number = 0; + + /** Descrption */ + public CapsDescrption_utf: string = ""; + + /** Constructor for the 'VpnCaps' class: Caps item of the VPN Server */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Caps list of the VPN Server */ +export class VpnCapslist +{ + /** Caps list of the VPN Server */ + public CapsList: VpnCaps[] = []; + + /** Constructor for the 'VpnCapslist' class: Caps list of the VPN Server */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Config operation */ +export class VpnRpcConfig +{ + /** File name (valid only for returning from the server) */ + public FileName_str: string = ""; + + /** File data */ + public FileData_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcConfig' class: Config operation */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Connection information */ +export class VpnRpcConnectionInfo +{ + /** Connection name */ + public Name_str: string = ""; + + /** Type */ + public Type_u32: VpnRpcConnectionType = 0; + + /** Host name */ + public Hostname_str: string = ""; + + /** IP address */ + public Ip_ip: string = ""; + + /** Port number */ + public Port_u32: number = 0; + + /** Connected time */ + public ConnectedTime_dt: Date = new Date(); + + /** Server string */ + public ServerStr_str: string = ""; + + /** Server version */ + public ServerVer_u32: number = 0; + + /** Server build number */ + public ServerBuild_u32: number = 0; + + /** Client string */ + public ClientStr_str: string = ""; + + /** Client version */ + public ClientVer_u32: number = 0; + + /** Client build number */ + public ClientBuild_u32: number = 0; + + /** Constructor for the 'VpnRpcConnectionInfo' class: Connection information */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Proxy type */ +export enum VpnRpcProxyType +{ + /** Direct TCP connection */ + Direct = 0, + + /** Connection via HTTP proxy server */ + HTTP = 1, + + /** Connection via SOCKS proxy server */ + SOCKS = 2, + +} + +/** The current status of the DDNS */ +export class VpnDDnsClientStatus +{ + /** Last error code (IPv4) */ + public Err_IPv4_u32: number = 0; + + /** Last error string (IPv4) */ + public ErrStr_IPv4_utf: string = ""; + + /** Last error code (IPv6) */ + public Err_IPv6_u32: number = 0; + + /** Last error string (IPv6) */ + public ErrStr_IPv6_utf: string = ""; + + /** Current DDNS host name */ + public CurrentHostName_str: string = ""; + + /** Current FQDN of the DDNS hostname */ + public CurrentFqdn_str: string = ""; + + /** DDNS suffix */ + public DnsSuffix_str: string = ""; + + /** Current IPv4 address of the VPN Server */ + public CurrentIPv4_str: string = ""; + + /** Current IPv6 address of the VPN Server */ + public CurrentIPv6_str: string = ""; + + /** Constructor for the 'VpnDDnsClientStatus' class: The current status of the DDNS */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Internet connection settings */ +export class VpnInternetSetting +{ + /** Type of proxy server */ + public ProxyType_u32: VpnRpcProxyType = 0; + + /** Proxy server host name */ + public ProxyHostName_str: string = ""; + + /** Proxy server port number */ + public ProxyPort_u32: number = 0; + + /** Proxy server user name */ + public ProxyUsername_str: string = ""; + + /** Proxy server password */ + public ProxyPassword_str: string = ""; + + /** Constructor for the 'VpnInternetSetting' class: Internet connection settings */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Administration options */ +export class VpnAdminOption +{ + /** Name */ + public Name_str: string = ""; + + /** Data */ + public Value_u32: number = 0; + + /** Descrption */ + public Descrption_utf: string = ""; + + /** Constructor for the 'VpnAdminOption' class: Administration options */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Administration options list */ +export class VpnRpcAdminOption +{ + /** Virtual HUB name */ + public HubName_str: string = ""; + + /** List data */ + public AdminOptionList: VpnAdminOption[] = []; + + /** Constructor for the 'VpnRpcAdminOption' class: Administration options list */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Connection state to the controller */ +export class VpnRpcFarmConnectionStatus +{ + /** IP address */ + public Ip_ip: string = ""; + + /** Port number */ + public Port_u32: number = 0; + + /** Online state */ + public Online_bool: boolean = false; + + /** Last error code */ + public LastError_u32: number = 0; + + /** Connection start time */ + public StartedTime_dt: Date = new Date(); + + /** First connection time */ + public FirstConnectedTime_dt: Date = new Date(); + + /** Connection time of this time */ + public CurrentConnectedTime_dt: Date = new Date(); + + /** Number of retries */ + public NumTry_u32: number = 0; + + /** Number of connection count */ + public NumConnected_u32: number = 0; + + /** Connection failure count */ + public NumFailed_u32: number = 0; + + /** Constructor for the 'VpnRpcFarmConnectionStatus' class: Connection state to the controller */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** HUB item of each farm member */ +export class VpnRpcFarmHub +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Dynamic HUB */ + public DynamicHub_bool: boolean = false; + + /** Constructor for the 'VpnRpcFarmHub' class: HUB item of each farm member */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server farm member information acquisition */ +export class VpnRpcFarmInfo +{ + /** ID */ + public Id_u32: number = 0; + + /** The flag if the server is Cluster Controller (false: Cluster Member servers) */ + public Controller_bool: boolean = false; + + /** Connection Established Time */ + public ConnectedTime_dt: Date = new Date(); + + /** IP address */ + public Ip_ip: string = ""; + + /** Host name */ + public Hostname_str: string = ""; + + /** Point */ + public Point_u32: number = 0; + + /** Number of Public Ports */ + public NumPort_u32: number = 0; + + /** Public Ports */ + public Ports_u32: number[] = []; + + /** Server certificate */ + public ServerCert_bin: Uint8Array = new Uint8Array([]); + + /** Number of farm HUB */ + public NumFarmHub_u32: number = 0; + + /** The hosted Virtual Hub list */ + public HubsList: VpnRpcFarmHub[] = []; + + /** Number of hosted VPN sessions */ + public NumSessions_u32: number = 0; + + /** Number of TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Performance Standard Ratio */ + public Weight_u32: number = 0; + + /** Constructor for the 'VpnRpcFarmInfo' class: Server farm member information acquisition */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server farm configuration */ +export class VpnRpcFarm +{ + /** Type of server */ + public ServerType_u32: VpnRpcServerType = 0; + + /** Valid only for Cluster Member servers. Number of the Ports_u32 element. */ + public NumPort_u32: number = 0; + + /** Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers. */ + public Ports_u32: number[] = []; + + /** Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used. */ + public PublicIp_ip: string = ""; + + /** Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. */ + public ControllerName_str: string = ""; + + /** Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. */ + public ControllerPort_u32: number = 0; + + /** Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller. */ + public MemberPasswordPlaintext_str: string = ""; + + /** This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used. */ + public Weight_u32: number = 0; + + /** Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments. */ + public ControllerOnly_bool: boolean = false; + + /** Constructor for the 'VpnRpcFarm' class: Server farm configuration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Log switch type */ +export enum VpnRpcLogSwitchType +{ + /** No switching */ + No = 0, + + /** Secondly basis */ + Second = 1, + + /** Minutely basis */ + Minute = 2, + + /** Hourly basis */ + Hour = 3, + + /** Daily basis */ + Day = 4, + + /** Monthly basis */ + Month = 5, + +} + +/** Packet log settings */ +export enum VpnRpcPacketLogSetting +{ + /** Not save */ + None = 0, + + /** Only header */ + Header = 1, + + /** All payloads */ + All = 2, + +} + +/** Packet log settings array index */ +export enum VpnRpcPacketLogSettingIndex +{ + /** TCP connection log */ + TcpConnection = 0, + + /** TCP packet log */ + TcpAll = 1, + + /** DHCP Log */ + Dhcp = 2, + + /** UDP log */ + Udp = 3, + + /** ICMP log */ + Icmp = 4, + + /** IP log */ + Ip = 5, + + /** ARP log */ + Arp = 6, + + /** Ethernet log */ + Ethernet = 7, + +} + +/** HUB log settings */ +export class VpnRpcHubLog +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The flag to enable / disable saving the security log */ + public SaveSecurityLog_bool: boolean = false; + + /** The log filename switching setting of the security log */ + public SecurityLogSwitchType_u32: VpnRpcLogSwitchType = 0; + + /** The flag to enable / disable saving the security log */ + public SavePacketLog_bool: boolean = false; + + /** The log filename switching settings of the packet logs */ + public PacketLogSwitchType_u32: VpnRpcLogSwitchType = 0; + + /** Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7. */ + public PacketLogConfig_u32: VpnRpcPacketLogSetting[] = []; + + /** Constructor for the 'VpnRpcHubLog' class: HUB log settings */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RADIUS server options */ +export class VpnRpcRadius +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** RADIUS server name */ + public RadiusServerName_str: string = ""; + + /** RADIUS port number */ + public RadiusPort_u32: number = 0; + + /** Secret key */ + public RadiusSecret_str: string = ""; + + /** Radius retry interval */ + public RadiusRetryInterval_u32: number = 0; + + /** Constructor for the 'VpnRpcRadius' class: RADIUS server options */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Get the state HUB */ +export class VpnRpcHubStatus +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Online */ + public Online_bool: boolean = false; + + /** Type of HUB */ + public HubType_u32: VpnRpcHubType = 0; + + /** Number of sessions */ + public NumSessions_u32: number = 0; + + /** Number of sessions (client mode) */ + public NumSessionsClient_u32: number = 0; + + /** Number of sessions (bridge mode) */ + public NumSessionsBridge_u32: number = 0; + + /** Number of Access list entries */ + public NumAccessLists_u32: number = 0; + + /** Number of users */ + public NumUsers_u32: number = 0; + + /** Number of groups */ + public NumGroups_u32: number = 0; + + /** Number of MAC table entries */ + public NumMacTables_u32: number = 0; + + /** Number of IP table entries */ + public NumIpTables_u32: number = 0; + + /** Number of broadcast packets (Recv) */ + public ["Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastCount_u64"]: number = 0; + + /** Whether SecureNAT is enabled */ + public SecureNATEnabled_bool: boolean = false; + + /** Last communication date and time */ + public LastCommTime_dt: Date = new Date(); + + /** Last login date and time */ + public LastLoginTime_dt: Date = new Date(); + + /** Creation date and time */ + public CreatedTime_dt: Date = new Date(); + + /** Number of logins */ + public NumLogin_u32: number = 0; + + /** Constructor for the 'VpnRpcHubStatus' class: Get the state HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** List of services provided by IPsec server */ +export class VpnIPsecServices +{ + /** Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. */ + public L2TP_Raw_bool: boolean = false; + + /** Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option. */ + public L2TP_IPsec_bool: boolean = false; + + /** Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging. */ + public EtherIP_IPsec_bool: boolean = false; + + /** Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters. */ + public IPsec_Secret_str: string = ""; + + /** Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. */ + public L2TP_DefaultHub_str: string = ""; + + /** Constructor for the 'VpnIPsecServices' class: List of services provided by IPsec server */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Keep alive protocol */ +export enum VpnRpcKeepAliveProtocol +{ + /** TCP */ + TCP = 0, + + /** UDP */ + UDP = 1, + +} + +/** Keep Alive settings */ +export class VpnRpcKeep +{ + /** The flag to enable keep-alive to the Internet */ + public UseKeepConnect_bool: boolean = false; + + /** Specify the host name or IP address of the destination */ + public KeepConnectHost_str: string = ""; + + /** Specify the port number of the destination */ + public KeepConnectPort_u32: number = 0; + + /** Protocol type */ + public KeepConnectProtocol_u32: VpnRpcKeepAliveProtocol = 0; + + /** Interval Between Packets Sends (Seconds) */ + public KeepConnectInterval_u32: number = 0; + + /** Constructor for the 'VpnRpcKeep' class: Keep Alive settings */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** State of the client session */ +export enum VpnRpcClientSessionStatus +{ + /** Connecting */ + Connecting = 0, + + /** Negotiating */ + Negotiation = 1, + + /** During user authentication */ + Auth = 2, + + /** Connection complete */ + Established = 3, + + /** Wait to retry */ + Retry = 4, + + /** Idle state */ + Idle = 5, + +} + +/** Get the link state */ +export class VpnRpcLinkStatus +{ + /** The Virtual Hub name */ + public HubName_Ex_str: string = ""; + + /** The name of the cascade connection */ + public AccountName_utf: string = ""; + + /** The flag whether the cascade connection is enabled */ + public Active_bool: boolean = false; + + /** The flag whether the cascade connection is established */ + public Connected_bool: boolean = false; + + /** The session status */ + public SessionStatus_u32: VpnRpcClientSessionStatus = 0; + + /** The destination VPN server name */ + public ServerName_str: string = ""; + + /** The port number of the server */ + public ServerPort_u32: number = 0; + + /** Server product name */ + public ServerProductName_str: string = ""; + + /** Server product version */ + public ServerProductVer_u32: number = 0; + + /** Server product build number */ + public ServerProductBuild_u32: number = 0; + + /** Server's X.509 certificate */ + public ServerX_bin: Uint8Array = new Uint8Array([]); + + /** Client certificate */ + public ClientX_bin: Uint8Array = new Uint8Array([]); + + /** Connection start time */ + public StartTime_dt: Date = new Date(); + + /** Connection completion time of the first connection */ + public FirstConnectionEstablisiedTime_dt: Date = new Date(); + + /** Connection completion time of this connection */ + public CurrentConnectionEstablishTime_dt: Date = new Date(); + + /** Number of connections have been established so far */ + public NumConnectionsEatablished_u32: number = 0; + + /** Half-connection */ + public HalfConnection_bool: boolean = false; + + /** VoIP / QoS */ + public QoS_bool: boolean = false; + + /** Maximum number of the underlying TCP connections */ + public MaxTcpConnections_u32: number = 0; + + /** Number of current underlying TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Number of underlying inbound TCP connections */ + public NumTcpConnectionsUpload_u32: number = 0; + + /** Number of underlying outbound TCP connections */ + public NumTcpConnectionsDownload_u32: number = 0; + + /** Use of encryption */ + public UseEncrypt_bool: boolean = false; + + /** Cipher algorithm name */ + public CipherName_str: string = ""; + + /** Use of compression */ + public UseCompress_bool: boolean = false; + + /** The flag whether this is a R-UDP session */ + public IsRUDPSession_bool: boolean = false; + + /** Underlying physical communication protocol */ + public UnderlayProtocol_str: string = ""; + + /** The UDP acceleration is enabled */ + public IsUdpAccelerationEnabled_bool: boolean = false; + + /** The UDP acceleration is being actually used */ + public IsUsingUdpAcceleration_bool: boolean = false; + + /** Session name */ + public SessionName_str: string = ""; + + /** Connection name */ + public ConnectionName_str: string = ""; + + /** Session key */ + public SessionKey_bin: Uint8Array = new Uint8Array([]); + + /** Total transmitted data size */ + public TotalSendSize_u64: number = 0; + + /** Total received data size */ + public TotalRecvSize_u64: number = 0; + + /** Total transmitted data size (no compression) */ + public TotalSendSizeReal_u64: number = 0; + + /** Total received data size (no compression) */ + public TotalRecvSizeReal_u64: number = 0; + + /** The flag whether the VPN session is Bridge Mode */ + public IsBridgeMode_bool: boolean = false; + + /** The flag whether the VPN session is Monitor mode */ + public IsMonitorMode_bool: boolean = false; + + /** VLAN ID */ + public VLanId_u32: number = 0; + + /** Constructor for the 'VpnRpcLinkStatus' class: Get the link state */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Setting of SSTP and OpenVPN */ +export class VpnOpenVpnSstpConfig +{ + /** Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. */ + public EnableOpenVPN_bool: boolean = false; + + /** Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. */ + public OpenVPNPortList_str: string = ""; + + /** pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. */ + public EnableSSTP_bool: boolean = false; + + /** Constructor for the 'VpnOpenVpnSstpConfig' class: Setting of SSTP and OpenVPN */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Virtual host option */ +export class VpnVhOption +{ + /** Target Virtual HUB name */ + public RpcHubName_str: string = ""; + + /** MAC address */ + public MacAddress_bin: Uint8Array = new Uint8Array([]); + + /** IP address */ + public Ip_ip: string = ""; + + /** Subnet mask */ + public Mask_ip: string = ""; + + /** Use flag of the Virtual NAT function */ + public UseNat_bool: boolean = false; + + /** MTU value (Standard: 1500) */ + public Mtu_u32: number = 0; + + /** NAT TCP timeout in seconds */ + public NatTcpTimeout_u32: number = 0; + + /** NAT UDP timeout in seconds */ + public NatUdpTimeout_u32: number = 0; + + /** Using flag of DHCP function */ + public UseDhcp_bool: boolean = false; + + /** Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) */ + public DhcpLeaseIPStart_ip: string = ""; + + /** Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) */ + public DhcpLeaseIPEnd_ip: string = ""; + + /** Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) */ + public DhcpSubnetMask_ip: string = ""; + + /** Specify the expiration date in second units for leasing an IP address to a client. */ + public DhcpExpireTimeSpan_u32: number = 0; + + /** Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway. */ + public DhcpGatewayAddress_ip: string = ""; + + /** Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. */ + public DhcpDnsServerAddress_ip: string = ""; + + /** Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. */ + public DhcpDnsServerAddress2_ip: string = ""; + + /** Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name. */ + public DhcpDomainName_str: string = ""; + + /** Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting. */ + public SaveLog_bool: boolean = false; + + /** The flag to enable the DhcpPushRoutes_str field. */ + public ApplyDhcpPushRoutes_bool: boolean = false; + + /** Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes. */ + public DhcpPushRoutes_str: string = ""; + + /** Constructor for the 'VpnVhOption' class: Virtual host option */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** RPC_NAT_STATUS */ +export class VpnRpcNatStatus +{ + /** Virtual Hub Name */ + public HubName_str: string = ""; + + /** Number of TCP sessions */ + public NumTcpSessions_u32: number = 0; + + /** Ntmber of UDP sessions */ + public NumUdpSessions_u32: number = 0; + + /** Nymber of ICMP sessions */ + public NumIcmpSessions_u32: number = 0; + + /** Number of DNS sessions */ + public NumDnsSessions_u32: number = 0; + + /** Number of DHCP clients */ + public NumDhcpClients_u32: number = 0; + + /** Whether the NAT is operating in the Kernel Mode */ + public IsKernelMode_bool: boolean = false; + + /** Whether the NAT is operating in the Raw IP Mode */ + public IsRawIpMode_bool: boolean = false; + + /** Constructor for the 'VpnRpcNatStatus' class: RPC_NAT_STATUS */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Key pair */ +export class VpnRpcKeyPair +{ + /** The body of the certificate */ + public Cert_bin: Uint8Array = new Uint8Array([]); + + /** The body of the private key */ + public Key_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcKeyPair' class: Key pair */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Single string value */ +export class VpnRpcStr +{ + /** A string value */ + public String_str: string = ""; + + /** Constructor for the 'VpnRpcStr' class: Single string value */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Type of VPN Server */ +export enum VpnRpcServerType +{ + /** Stand-alone server */ + Standalone = 0, + + /** Farm controller server */ + FarmController = 1, + + /** Farm member server */ + FarmMember = 2, + +} + +/** Operating system type */ +export enum VpnRpcOsType +{ + /** Windows 95 */ + WINDOWS_95 = 1100, + + /** Windows 98 */ + WINDOWS_98 = 1200, + + /** Windows Me */ + WINDOWS_ME = 1300, + + /** Windows (unknown) */ + WINDOWS_UNKNOWN = 1400, + + /** Windows NT 4.0 Workstation */ + WINDOWS_NT_4_WORKSTATION = 2100, + + /** Windows NT 4.0 Server */ + WINDOWS_NT_4_SERVER = 2110, + + /** Windows NT 4.0 Server, Enterprise Edition */ + WINDOWS_NT_4_SERVER_ENTERPRISE = 2111, + + /** Windows NT 4.0 Terminal Server */ + WINDOWS_NT_4_TERMINAL_SERVER = 2112, + + /** BackOffice Server 4.5 */ + WINDOWS_NT_4_BACKOFFICE = 2113, + + /** Small Business Server 4.5 */ + WINDOWS_NT_4_SMS = 2114, + + /** Windows 2000 Professional */ + WINDOWS_2000_PROFESSIONAL = 2200, + + /** Windows 2000 Server */ + WINDOWS_2000_SERVER = 2211, + + /** Windows 2000 Advanced Server */ + WINDOWS_2000_ADVANCED_SERVER = 2212, + + /** Windows 2000 Datacenter Server */ + WINDOWS_2000_DATACENTER_SERVER = 2213, + + /** BackOffice Server 2000 */ + WINDOWS_2000_BACKOFFICE = 2214, + + /** Small Business Server 2000 */ + WINDOWS_2000_SBS = 2215, + + /** Windows XP Home Edition */ + WINDOWS_XP_HOME = 2300, + + /** Windows XP Professional */ + WINDOWS_XP_PROFESSIONAL = 2301, + + /** Windows Server 2003 Web Edition */ + WINDOWS_2003_WEB = 2410, + + /** Windows Server 2003 Standard Edition */ + WINDOWS_2003_STANDARD = 2411, + + /** Windows Server 2003 Enterprise Edition */ + WINDOWS_2003_ENTERPRISE = 2412, + + /** Windows Server 2003 DataCenter Edition */ + WINDOWS_2003_DATACENTER = 2413, + + /** BackOffice Server 2003 */ + WINDOWS_2003_BACKOFFICE = 2414, + + /** Small Business Server 2003 */ + WINDOWS_2003_SBS = 2415, + + /** Windows Vista */ + WINDOWS_LONGHORN_PROFESSIONAL = 2500, + + /** Windows Server 2008 */ + WINDOWS_LONGHORN_SERVER = 2510, + + /** Windows 7 */ + WINDOWS_7 = 2600, + + /** Windows Server 2008 R2 */ + WINDOWS_SERVER_2008_R2 = 2610, + + /** Windows 8 */ + WINDOWS_8 = 2700, + + /** Windows Server 2012 */ + WINDOWS_SERVER_8 = 2710, + + /** Windows 8.1 */ + WINDOWS_81 = 2701, + + /** Windows Server 2012 R2 */ + WINDOWS_SERVER_81 = 2711, + + /** Windows 10 */ + WINDOWS_10 = 2702, + + /** Windows Server 10 */ + WINDOWS_SERVER_10 = 2712, + + /** Windows 11 or later */ + WINDOWS_11 = 2800, + + /** Windows Server 11 or later */ + WINDOWS_SERVER_11 = 2810, + + /** Unknown UNIX */ + UNIX_UNKNOWN = 3000, + + /** Linux */ + LINUX = 3100, + + /** Solaris */ + SOLARIS = 3200, + + /** Cygwin */ + CYGWIN = 3300, + + /** BSD */ + BSD = 3400, + + /** MacOS X */ + MACOS_X = 3500, + +} + +/** VPN Server Information */ +export class VpnRpcServerInfo +{ + /** Server product name */ + public ServerProductName_str: string = ""; + + /** Server version string */ + public ServerVersionString_str: string = ""; + + /** Server build information string */ + public ServerBuildInfoString_str: string = ""; + + /** Server version integer value */ + public ServerVerInt_u32: number = 0; + + /** Server build number integer value */ + public ServerBuildInt_u32: number = 0; + + /** Server host name */ + public ServerHostName_str: string = ""; + + /** Type of server */ + public ServerType_u32: VpnRpcServerType = 0; + + /** Build date and time of the server */ + public ServerBuildDate_dt: Date = new Date(); + + /** Family name */ + public ServerFamilyName_str: string = ""; + + /** OS type */ + public OsType_u32: VpnRpcOsType = 0; + + /** Service pack number */ + public OsServicePack_u32: number = 0; + + /** OS system name */ + public OsSystemName_str: string = ""; + + /** OS product name */ + public OsProductName_str: string = ""; + + /** OS vendor name */ + public OsVendorName_str: string = ""; + + /** OS version */ + public OsVersion_str: string = ""; + + /** Kernel name */ + public KernelName_str: string = ""; + + /** Kernel version */ + public KernelVersion_str: string = ""; + + /** Constructor for the 'VpnRpcServerInfo' class: VPN Server Information */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Server status */ +export class VpnRpcServerStatus +{ + /** Type of server */ + public ServerType_u32: VpnRpcServerType = 0; + + /** Total number of TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Number of Local TCP connections */ + public NumTcpConnectionsLocal_u32: number = 0; + + /** Number of remote TCP connections */ + public NumTcpConnectionsRemote_u32: number = 0; + + /** Total number of HUBs */ + public NumHubTotal_u32: number = 0; + + /** Nymber of stand-alone HUB */ + public NumHubStandalone_u32: number = 0; + + /** Number of static HUBs */ + public NumHubStatic_u32: number = 0; + + /** Number of Dynamic HUBs */ + public NumHubDynamic_u32: number = 0; + + /** Total number of sessions */ + public NumSessionsTotal_u32: number = 0; + + /** Number of local VPN sessions */ + public NumSessionsLocal_u32: number = 0; + + /** The number of remote sessions */ + public NumSessionsRemote_u32: number = 0; + + /** Number of MAC table entries (total sum of all Virtual Hubs) */ + public NumMacTables_u32: number = 0; + + /** Number of IP table entries (total sum of all Virtual Hubs) */ + public NumIpTables_u32: number = 0; + + /** Number of users (total sum of all Virtual Hubs) */ + public NumUsers_u32: number = 0; + + /** Number of groups (total sum of all Virtual Hubs) */ + public NumGroups_u32: number = 0; + + /** Number of assigned bridge licenses (Useful to make a commercial version) */ + public AssignedBridgeLicenses_u32: number = 0; + + /** Number of assigned client licenses (Useful to make a commercial version) */ + public AssignedClientLicenses_u32: number = 0; + + /** Number of Assigned bridge license (cluster-wide), useful to make a commercial version */ + public AssignedBridgeLicensesTotal_u32: number = 0; + + /** Number of assigned client licenses (cluster-wide), useful to make a commercial version */ + public AssignedClientLicensesTotal_u32: number = 0; + + /** Number of broadcast packets (Recv) */ + public ["Recv.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Recv) */ + public ["Recv.BroadcastCount_u64"]: number = 0; + + /** Unicast count (Recv) */ + public ["Recv.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Recv) */ + public ["Recv.UnicastCount_u64"]: number = 0; + + /** Number of broadcast packets (Send) */ + public ["Send.BroadcastBytes_u64"]: number = 0; + + /** Broadcast bytes (Send) */ + public ["Send.BroadcastCount_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastBytes_u64"]: number = 0; + + /** Unicast bytes (Send) */ + public ["Send.UnicastCount_u64"]: number = 0; + + /** Current time */ + public CurrentTime_dt: Date = new Date(); + + /** 64 bit High-Precision Logical System Clock */ + public CurrentTick_u64: number = 0; + + /** VPN Server Start-up time */ + public StartTime_dt: Date = new Date(); + + /** Memory information: Total Memory */ + public TotalMemory_u64: number = 0; + + /** Memory information: Used Memory */ + public UsedMemory_u64: number = 0; + + /** Memory information: Free Memory */ + public FreeMemory_u64: number = 0; + + /** Memory information: Total Phys */ + public TotalPhys_u64: number = 0; + + /** Memory information: Used Phys */ + public UsedPhys_u64: number = 0; + + /** Memory information: Free Phys */ + public FreePhys_u64: number = 0; + + /** Constructor for the 'VpnRpcServerStatus' class: Server status */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** VPN Session status */ +export class VpnRpcSessionStatus +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** VPN session name */ + public Name_str: string = ""; + + /** User name */ + public Username_str: string = ""; + + /** Real user name which was used for the authentication */ + public RealUsername_str: string = ""; + + /** Group name */ + public GroupName_str: string = ""; + + /** Is Cascade Session */ + public LinkMode_bool: boolean = false; + + /** Client IP address */ + public Client_Ip_Address_ip: string = ""; + + /** Client host name */ + public SessionStatus_ClientHostName_str: string = ""; + + /** Operation flag */ + public Active_bool: boolean = false; + + /** Connected flag */ + public Connected_bool: boolean = false; + + /** State of the client session */ + public SessionStatus_u32: VpnRpcClientSessionStatus = 0; + + /** Server name */ + public ServerName_str: string = ""; + + /** Port number of the server */ + public ServerPort_u32: number = 0; + + /** Server product name */ + public ServerProductName_str: string = ""; + + /** Server product version */ + public ServerProductVer_u32: number = 0; + + /** Server product build number */ + public ServerProductBuild_u32: number = 0; + + /** Connection start time */ + public StartTime_dt: Date = new Date(); + + /** Connection completion time of the first connection */ + public FirstConnectionEstablisiedTime_dt: Date = new Date(); + + /** Connection completion time of this connection */ + public CurrentConnectionEstablishTime_dt: Date = new Date(); + + /** Number of connections have been established so far */ + public NumConnectionsEatablished_u32: number = 0; + + /** Half-connection */ + public HalfConnection_bool: boolean = false; + + /** VoIP / QoS */ + public QoS_bool: boolean = false; + + /** Maximum number of the underlying TCP connections */ + public MaxTcpConnections_u32: number = 0; + + /** Number of current underlying TCP connections */ + public NumTcpConnections_u32: number = 0; + + /** Number of inbound underlying connections */ + public NumTcpConnectionsUpload_u32: number = 0; + + /** Number of outbound underlying connections */ + public NumTcpConnectionsDownload_u32: number = 0; + + /** Use of encryption */ + public UseEncrypt_bool: boolean = false; + + /** Cipher algorithm name */ + public CipherName_str: string = ""; + + /** Use of compression */ + public UseCompress_bool: boolean = false; + + /** Is R-UDP session */ + public IsRUDPSession_bool: boolean = false; + + /** Physical underlying communication protocol */ + public UnderlayProtocol_str: string = ""; + + /** The UDP acceleration is enabled */ + public IsUdpAccelerationEnabled_bool: boolean = false; + + /** Using the UDP acceleration function */ + public IsUsingUdpAcceleration_bool: boolean = false; + + /** VPN session name */ + public SessionName_str: string = ""; + + /** Connection name */ + public ConnectionName_str: string = ""; + + /** Session key */ + public SessionKey_bin: Uint8Array = new Uint8Array([]); + + /** Total transmitted data size */ + public TotalSendSize_u64: number = 0; + + /** Total received data size */ + public TotalRecvSize_u64: number = 0; + + /** Total transmitted data size (no compression) */ + public TotalSendSizeReal_u64: number = 0; + + /** Total received data size (no compression) */ + public TotalRecvSizeReal_u64: number = 0; + + /** Is Bridge Mode */ + public IsBridgeMode_bool: boolean = false; + + /** Is Monitor mode */ + public IsMonitorMode_bool: boolean = false; + + /** VLAN ID */ + public VLanId_u32: number = 0; + + /** Client product name */ + public ClientProductName_str: string = ""; + + /** Client version */ + public ClientProductVer_u32: number = 0; + + /** Client build number */ + public ClientProductBuild_u32: number = 0; + + /** Client OS name */ + public ClientOsName_str: string = ""; + + /** Client OS version */ + public ClientOsVer_str: string = ""; + + /** Client OS Product ID */ + public ClientOsProductId_str: string = ""; + + /** Client host name */ + public ClientHostname_str: string = ""; + + /** Unique ID */ + public UniqueId_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcSessionStatus' class: VPN Session status */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Set the special listener */ +export class VpnRpcSpecialListener +{ + /** The flag to activate the VPN over ICMP server function */ + public VpnOverIcmpListener_bool: boolean = false; + + /** The flag to activate the VPN over DNS function */ + public VpnOverDnsListener_bool: boolean = false; + + /** Constructor for the 'VpnRpcSpecialListener' class: Set the special listener */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Syslog configuration */ +export enum VpnSyslogSaveType +{ + /** Do not use syslog */ + None = 0, + + /** Only server log */ + ServerLog = 1, + + /** Server and Virtual HUB security log */ + ServerAndHubSecurityLog = 2, + + /** Server, Virtual HUB security, and packet log */ + ServerAndHubAllLog = 3, + +} + +/** Syslog configuration */ +export class VpnSyslogSetting +{ + /** The behavior of the syslog function */ + public SaveType_u32: VpnSyslogSaveType = 0; + + /** Specify the host name or IP address of the syslog server */ + public Hostname_str: string = ""; + + /** Specify the port number of the syslog server */ + public Port_u32: number = 0; + + /** Constructor for the 'VpnSyslogSetting' class: Syslog configuration */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** VPN Gate Server Config */ +export class VpnVgsConfig +{ + /** Active flag */ + public IsEnabled_bool: boolean = false; + + /** Message */ + public Message_utf: string = ""; + + /** Owner name */ + public Owner_utf: string = ""; + + /** Abuse email */ + public Abuse_utf: string = ""; + + /** Log save flag */ + public NoLog_bool: boolean = false; + + /** Save log permanently */ + public LogPermanent_bool: boolean = false; + + /** Enable the L2TP VPN function */ + public EnableL2TP_bool: boolean = false; + + /** Constructor for the 'VpnVgsConfig' class: VPN Gate Server Config */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Read a Log file */ +export class VpnRpcReadLogFile +{ + /** Server name */ + public ServerName_str: string = ""; + + /** File Path */ + public FilePath_str: string = ""; + + /** Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field. */ + public Offset_u32: number = 0; + + /** Received buffer */ + public Buffer_bin: Uint8Array = new Uint8Array([]); + + /** Constructor for the 'VpnRpcReadLogFile' class: Read a Log file */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Rename link */ +export class VpnRpcRenameLink +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** The old name of the cascade connection */ + public OldAccountName_utf: string = ""; + + /** The new name of the cascade connection */ + public NewAccountName_utf: string = ""; + + /** Constructor for the 'VpnRpcRenameLink' class: Rename link */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Online or offline the HUB */ +export class VpnRpcSetHubOnline +{ + /** The Virtual Hub name */ + public HubName_str: string = ""; + + /** Online / offline flag */ + public Online_bool: boolean = false; + + /** Constructor for the 'VpnRpcSetHubOnline' class: Online or offline the HUB */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + +/** Set Password */ +export class VpnRpcSetPassword +{ + /** The plaintext password */ + public PlainTextPassword_str: string = ""; + + /** Constructor for the 'VpnRpcSetPassword' class: Set Password */ + public constructor(init?: Partial) + { + Object.assign(this, init); + } +} + + + + + +// --- Utility codes --- + +/** JSON-RPC request class. See https://www.jsonrpc.org/specification */ +export class JsonRpcRequest +{ + public jsonrpc: string = "2.0"; + public method: string; + public params: any; + public id: string; + + constructor(method: string = "", param: any = null, id: string = "") + { + this.method = method; + this.params = param; + this.id = id; + } +} + +/** JSON-RPC error class. See https://www.jsonrpc.org/specification */ +export class JsonRpcError +{ + public code: number; + public message: string; + public data: any; + + constructor(code: number = 0, message: string = "", data: any = null) + { + this.code = code; + this.message = message; + this.data = data; + } +} + +/** JSON-RPC response class with generics */ +export class JsonRpcResponse +{ + public jsonrpc: string = "2.0"; + public result: TResult = null!; + public error: JsonRpcError = null!; + public id: string = ""; +} + +/** JSON-RPC client class. See https://www.jsonrpc.org/specification */ +export class JsonRpcClient +{ + /** A utility function to convert any object to JSON string */ + public static ObjectToJson(obj: any): string + { + return JSON.stringify(obj, + (key, value) => + { + if (key.endsWith("_bin")) + { + return Util_Base64_Encode(value); + } + return value; + } + , 4); + } + + /** A utility function to convert JSON string to object */ + public static JsonToObject(str: string): any + { + return JSON.parse(str, + (key, value) => + { + if (key.endsWith("_bin")) + { + return Util_Base64_Decode(value); + } + else if (key.endsWith("_dt")) + { + return new Date(value); + } + return value; + }); + } + + /** Base URL */ + public BaseUrl: string; + + /** The instance of HTTP client */ + private client: HttpClient; + + /** Additional HTTP headers */ + private headers: { [name: string]: string }; + + /** + * JSON-RPC client class constructor + * @param url The URL + * @param headers Additional HTTP headers + * @param send_credential Set true to use the same credential with the browsing web site. Valid only if the code is running on the web browser. + */ + constructor(url: string, headers: { [name: string]: string }, send_credential: boolean, nodejs_https_client_reject_untrusted_server_cert: boolean) + { + this.BaseUrl = url; + this.headers = headers; + + this.client = new HttpClient(); + this.client.SendCredential = send_credential; + this.client.NodeJS_HTTPS_Client_Reject_Unauthorized = nodejs_https_client_reject_untrusted_server_cert; + } + + /** + * Call a single RPC call (without error check). You can wait for the response with Promise or await statement. + * @param method_name The name of RPC method + * @param param The parameters + */ + public async CallInternalAsync(method_name: string, param: any): Promise + { + let id = "1"; + + let req = new JsonRpcRequest(method_name, param, id); + + let req_string = JsonRpcClient.ObjectToJson(req); + + if (debug_mode) + { + console.log("--- RPC Request Body ---"); + console.log(req_string); + console.log("------------------------"); + } + + let http_response = await this.client.PostAsync(this.BaseUrl, this.headers, + req_string, "application/json"); + + let ret_string = http_response.Body; + + if (debug_mode) + { + console.log("--- RPC Response Body ---"); + console.log(ret_string); + console.log("-------------------------"); + } + + return ret_string; + } + + /** + * Call a single RPC call (with error check). You can wait for the response with Promise or await statement. In the case of error, it will be thrown. + * @param method_name The name of RPC method + * @param param The parameters + */ + public async CallAsync(method_name: string, param: any): Promise + { + let ret_string = await this.CallInternalAsync(method_name, param); + + let ret: JsonRpcResponse = JSON.parse(ret_string); + + if (is_null(ret.error) === false) + { + throw new JsonRpcException(ret.error); + } + + return ret.result; + } +} + +/** JSON-RPC exception class */ +export class JsonRpcException extends Error +{ + public Error: JsonRpcError; + + constructor(error: JsonRpcError) + { + super(`Code=${error.code}, Message=${error.message}`); + this.Error = error; + } +} + +/** HTTP client exception class */ +export class HttpClientException extends Error +{ + constructor(message: string) + { + super(message); + } +} + +/** HTTP client response class */ +export class HttpClientResponse +{ + public Body: string = ""; +} + +/** An HTTP client which can be used in both web browsers and Node.js */ +export class HttpClient +{ + public TimeoutMsecs: number = 60 * 5 * 1000; + public SendCredential: boolean = true; + public NodeJS_HTTPS_Client_Reject_Unauthorized: boolean = false; + + /** Post method. In web browsers this function will process the request by itself. In Node.js this function will call PostAsync_NodeJS() instead. */ + public async PostAsync(url: string, headers: { [name: string]: string }, + req_body: string, req_media_type: string): Promise + { + if (is_node_js) + { + return this.PostAsync_NodeJS(url, headers, req_body, req_media_type); + } + + let fetch_header_list = new Headers(); + + for (let name of Object.keys(headers)) + { + fetch_header_list.append(name, headers[name]); + } + + let fetch_init: RequestInit = + { + mode: "cors", + headers: fetch_header_list, + credentials: (this.SendCredential ? "include" : "omit"), + method: "POST", + cache: "no-cache", + keepalive: true, + redirect: "follow", + body: req_body, + }; + + let fetch_response = await fetch(url, fetch_init); + + if (fetch_response.ok === false) + { + throw new HttpClientException("HTTP Error: " + fetch_response.status + " " + fetch_response.statusText); + } + + let ret = new HttpClientResponse(); + + ret.Body = await fetch_response.text(); + + return ret; + } + + /** Post method for Node.js. */ + public PostAsync_NodeJS(url: string, headers: { [name: string]: string }, + req_body: string, req_media_type: string): Promise + { + const https = require("https"); + const keepAliveAgent = new https.Agent({ keepAlive: true }); + const urlparse = require("url"); + + const urlobj = urlparse.parse(url); + + if (is_null(urlobj.host)) throw new Error("URL is invalid."); + + let options = + { + host: urlobj.hostname, + port: urlobj.port, + path: urlobj.path, + rejectUnauthorized: this.NodeJS_HTTPS_Client_Reject_Unauthorized, + method: "POST", + timeout: this.TimeoutMsecs, + agent: keepAliveAgent, + }; + + return new Promise(function (resolve, reject) + { + let req = https.request(options, (res: any) => + { + if (res.statusCode !== 200) + { + reject(new HttpClientException("HTTP Error: " + res.statusCode + " " + res.statusMessage)); + } + + let recv_str: string = ""; + + res.on("data", (body: any) => + { + recv_str += body; + }); + + res.on("end", () => + { + let ret = new HttpClientResponse(); + + ret.Body = recv_str; + + resolve(ret); + }); + }).on("error", (err: any) => + { + throw err; + } + ); + + for (let name of Object.keys(headers)) + { + req.setHeader(name, !is_null(headers[name]) ? headers[name] : ""); + } + req.setHeader("Content-Type", req_media_type); + req.setHeader("Content-Length", Buffer.byteLength(req_body)); + req.write(req_body); + req.end(); + }); + } +} + + + + +//////// BEGIN: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js +// The MIT License(MIT) +// Copyright(c) 2014 +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +var lookup: any = []; +var revLookup: any = []; + +var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +for (var i = 0, len = code.length; i < len; ++i) +{ + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup["-".charCodeAt(0)] = 62; +revLookup["_".charCodeAt(0)] = 63; + +function getLens(b64: any) +{ + var len = b64.length; + + if (len % 4 > 0) + { + throw new Error("Invalid string. Length must be a multiple of 4"); + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf("="); + if (validLen === -1) validLen = len; + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4); + + return [validLen, placeHoldersLen]; +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength(b64: any) +{ + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen; +} + +function _byteLength(b64: any, validLen: any, placeHoldersLen: any) +{ + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen; +} + +export function Util_Base64_Decode(b64: any) +{ + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + + var arr = new Uint8Array(_byteLength(b64, validLen, placeHoldersLen)); + + var curByte = 0; + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen; + + for (var i = 0; i < len; i += 4) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)]; + arr[curByte++] = (tmp >> 16) & 0xFF; + arr[curByte++] = (tmp >> 8) & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 2) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4); + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 1) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2); + arr[curByte++] = (tmp >> 8) & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + return arr; +} + +function tripletToBase64(num: any) +{ + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F]; +} + +function encodeChunk(uint8: any, start: any, end: any) +{ + var tmp; + var output = []; + for (var i = start; i < end; i += 3) + { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF); + output.push(tripletToBase64(tmp)); + } + return output.join(""); +} + +export function Util_Base64_Encode(uint8: any) +{ + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) + { + parts.push(encodeChunk( + uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) + )); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) + { + tmp = uint8[len - 1]; + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + "==" + ); + } else if (extraBytes === 2) + { + tmp = (uint8[len - 2] << 8) + uint8[len - 1]; + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + "=" + ); + } + + return parts.join(""); +} +//////// END: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/CodeGen/CodeGen.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/CodeGen/CodeGen.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/CodeGen/CodeGen.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/CodeGen/CodeGen.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,2067 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using System.Linq; +using static System.Console; +using System.Xml.Linq; +using SoftEther.JsonRpc; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using Markdig; + +namespace VPNServer_JSONRPC_CodeGen +{ + public enum TargetLang + { + CSharp, + TypeScript, + } + + static class CodeGenUtil + { + public static string AppExeDir; + public static string ProjectDir; + public static string VpnSrcDir; + public static string OutputDir_Clients; + public static string OutputDir_HamCore; + + static CodeGenUtil() + { + AppExeDir = System.AppContext.BaseDirectory; + ProjectDir = AppExeDir; + string tmp = AppExeDir; + while (true) + { + try + { + tmp = Path.GetDirectoryName(tmp); + if (Directory.GetFiles(tmp, "*.csproj").Length >= 1) + { + ProjectDir = tmp; + break; + } + } + catch + { + break; + } + } + OutputDir_Clients = Path.Combine(ProjectDir, @"..\vpnserver-jsonrpc-clients"); + + string root_dir = Path.Combine(ProjectDir, @"..\.."); + string dirname = null; + if (Directory.Exists(Path.Combine(root_dir, "Main"))) dirname = "Main"; + if (Directory.Exists(Path.Combine(root_dir, "src"))) dirname = "src"; + if (string.IsNullOrEmpty(dirname)) throw new ApplicationException($"Directory '{root_dir}' is not a root dir."); + + VpnSrcDir = dirname; + + OutputDir_HamCore = Path.Combine(root_dir, dirname, @"bin\hamcore"); + if (Directory.Exists(OutputDir_HamCore) == false) throw new ApplicationException($"Direction '{OutputDir_HamCore}' not found."); + } + + public static void MakeDir(string path) + { + try + { + Directory.CreateDirectory(path); + } + catch + { + } + } + } + + class CSharpSourceCode + { + public SyntaxTree Tree { get; } + public CompilationUnitSyntax Root { get; } + public SemanticModel Model { get; set; } + + public CSharpSourceCode(string filename) : this(File.ReadAllText(filename), filename) + { + } + + public CSharpSourceCode(string body, string filename) + { + this.Tree = CSharpSyntaxTree.ParseText(body, path: filename); + this.Root = this.Tree.GetCompilationUnitRoot(); + } + } + + + class CSharpCompiler + { + public string AssemblyName { get; } + public List ReferencesList { get; } = new List(); + public List SourceCodeList { get; } = new List(); + + CSharpCompilation _compilation = null; + + public CSharpCompilation Compilation + { + get + { + if (_compilation == null) + { + _compilation = CSharpCompilation.Create(this.AssemblyName, + this.SourceCodeList.Select(s => s.Tree), + this.ReferencesList, + options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Debug, + assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default)); + + } + return _compilation; + } + } + + public CSharpCompiler(string assembly_name) + { + this.AssemblyName = assembly_name; + } + + public void AddReference(MetadataReference r) + { + this.ReferencesList.Add(r); + } + public void AddReferenceByPath(string path) + { + AddReference(MetadataReference.CreateFromFile(path)); + } + public void AddReferenceByType(Type type) + { + AddReferenceByPath(type.Assembly.Location); + } + public void AddReferenceByAssemblyName(string name) + { + var a = System.Reflection.Assembly.Load(new System.Reflection.AssemblyName(name)); + + AddReferenceByPath(a.Location); + } + public void AddReferenceDotNetStandard() + { + var a = System.Reflection.Assembly.Load(new System.Reflection.AssemblyName("netstandard")); + + AddReferenceByPath(a.Location); + + string dir = Path.GetDirectoryName(a.Location); + + AddReferenceByPath(Path.Combine(dir, "System.Private.CoreLib.dll")); + + foreach (var refa in a.GetReferencedAssemblies()) + { + string dll_name = Path.Combine(dir, refa.Name) + ".dll"; + + if (File.Exists(dll_name)) + { + AddReferenceByPath(dll_name); + } + } + } + + public void AddSourceCode(CSharpSourceCode cs) + { + this.SourceCodeList.Add(cs); + } + + public bool OkOrPrintErrors() + { + MemoryStream ms = new MemoryStream(); + Microsoft.CodeAnalysis.Emit.EmitResult ret = Compilation.Emit(ms); + + if (ret.Success) + { + return true; + } + + IEnumerable failures = ret.Diagnostics.Where(diagnostic => + diagnostic.IsWarningAsError || + diagnostic.Severity == DiagnosticSeverity.Error); + + foreach (Diagnostic diagnostic in failures) + { + WriteLine(diagnostic.ToString()); + } + return false; + } + + public void Compile(bool test_full_compile = false) + { + if (test_full_compile) + { + if (OkOrPrintErrors() == false) + { + throw new ApplicationException("Compile Error."); + } + } + + foreach (CSharpSourceCode cs in this.SourceCodeList) + { + cs.Model = this.Compilation.GetSemanticModel(cs.Tree); + } + } + } + + class GeneratedCodePart + { + public int Seq = 0; + public string Text = ""; + } + + class GeneratedCodeSection + { + public List PartList = new List(); + + public override string ToString() + { + StringWriter w = new StringWriter(); + var a = this.PartList.OrderBy(x => x.Seq); + + foreach (var b in a) + { + w.Write(b.Text.ToString()); + } + + return w.ToString(); + } + + public void AddPart(int seq, string text) + { + this.PartList.Add(new GeneratedCodePart() { Seq = seq, Text = text }); + } + } + + class GeneratedCode + { + public GeneratedCodeSection Types = new GeneratedCodeSection(); + public GeneratedCodeSection Stubs = new GeneratedCodeSection(); + public GeneratedCodeSection Tests = new GeneratedCodeSection(); + + public override string ToString() + { + StringWriter w = new StringWriter(); + + w.WriteLine("// --- Types ---"); + w.Write(this.Types.ToString()); + w.WriteLine(); + + w.WriteLine("// --- Stubs ---"); + w.Write(this.Stubs.ToString()); + w.WriteLine(); + + w.WriteLine("// --- Tests ---"); + w.Write(this.Tests.ToString()); + w.WriteLine(); + + return w.ToString(); + } + } + + class GeneratedCodeForLang + { + public GeneratedCode TypeScript = new GeneratedCode(); + + public string DocsRpc = ""; + } + + static class CodeGenExtensions + { + public static string GetDocumentStr(this ISymbol sym) + { + if (sym == null) return ""; + string xml = sym.GetDocumentationCommentXml(); + if (string.IsNullOrEmpty(xml)) return ""; + XDocument doc = XDocument.Parse(xml); + var summary = doc.Descendants("summary").FirstOrDefault(); + string str = summary.Value; + if (string.IsNullOrEmpty(str)) return ""; + str = str.Replace(" (Async mode)", "", StringComparison.InvariantCultureIgnoreCase); + str = str.Trim(); + return str; + } + } + + class RpcInfo + { + public string Name; + public string TypeName; + + public IMethodSymbol Symbol; + + public HashSet InputParamMembers = new HashSet(); + } + + class RpcTypeParameterInfo + { + public string Name; + public string Type; + public string Description; + } + + class RpcTypeInfo + { + public string Name; + public string Description; + + public List Params = new List(); + public List SubTypes = new List(); + } + + class CodeGen + { + CSharpSourceCode cs_types, cs_stubs, cs_tests; + + public Dictionary rpc_list = new Dictionary(); + public Dictionary rpc_type_list = new Dictionary(); + + CSharpCompiler csc; + + public CodeGen() + { + csc = new CSharpCompiler("Test"); + + csc.AddReferenceDotNetStandard(); + csc.AddReferenceByType(typeof(Newtonsoft.Json.JsonPropertyAttribute)); + + cs_types = new CSharpSourceCode(Path.Combine(CodeGenUtil.ProjectDir, @"VpnServerRpc\VPNServerRpcTypes.cs")); + csc.AddSourceCode(cs_types); + + cs_stubs = new CSharpSourceCode(Path.Combine(CodeGenUtil.ProjectDir, @"VpnServerRpc\VPNServerRpc.cs")); + csc.AddSourceCode(cs_stubs); + + cs_tests = new CSharpSourceCode(Path.Combine(CodeGenUtil.ProjectDir, @"VpnServerRpcTest\VpnServerRpcTest.cs")); + csc.AddSourceCode(cs_tests); + + csc.Compile(); + } + + void generate_types(GeneratedCodeForLang ret) + { + var model = cs_types.Model; + + var class_list = cs_types.Root.DescendantNodes().OfType(); + + foreach (ClassDeclarationSyntax c in class_list) + { + StringWriter ts = new StringWriter(); + + string doc = model.GetDeclaredSymbol(c).GetDocumentStr(); + if (string.IsNullOrEmpty(doc) == false) + { + ts.WriteLine($"/** {doc} */"); + } + + RpcTypeInfo info = new RpcTypeInfo() + { + Name = c.Identifier.Text, + Description = doc, + }; + rpc_type_list[c.Identifier.Text] = info; + + ts.WriteLine($"export class {c.Identifier.Text}"); + ts.WriteLine("{"); + + foreach (var member in model.GetDeclaredSymbol(c).GetMembers()) + { + string json_name = ""; + bool json_name_has_special_char = false; + var atts = member.GetAttributes(); + var y = atts.Where(x => x.AttributeClass.Name == "JsonPropertyAttribute").FirstOrDefault(); + if (y != null) + { + json_name = y.ConstructorArguments.FirstOrDefault().Value.ToString(); + if (json_name.IndexOf(':') != -1 || json_name.IndexOf('.') != -1) json_name_has_special_char = true; + } + + string default_value = "\"\""; + + string enum_type = ""; + + switch (member) + { + case IFieldSymbol field: + string ts_type = ""; + ITypeSymbol type = field.Type; + switch (type.Kind) + { + case SymbolKind.NamedType: + switch (type.Name) + { + case "UInt32": + case "UInt64": + ts_type = "number"; + default_value = "0"; + break; + + case "String": + ts_type = "string"; + break; + + case "Boolean": + ts_type = "boolean"; + default_value = "false"; + break; + + case "DateTime": + ts_type = "Date"; + default_value = "new Date()"; + break; + + default: + if (type.TypeKind == TypeKind.Enum) + { + ts_type = type.Name; + enum_type = type.Name; + default_value = "0"; + break; + } + throw new ApplicationException($"{c.Identifier}.{member.Name}: type.Name = {type.Name}"); + } + break; + + case SymbolKind.ArrayType: + ITypeSymbol type2 = ((IArrayTypeSymbol)type).ElementType; + + default_value = "[]"; + + switch (type2.Kind) + { + case SymbolKind.NamedType: + switch (type2.Name) + { + case "UInt32": + case "UInt64": + ts_type = "number[]"; + break; + + case "String": + ts_type = "string[]"; + break; + + case "Boolean": + ts_type = "boolean[]"; + break; + + case "Byte": + ts_type = "Uint8Array"; + default_value = "new Uint8Array([])"; + break; + + default: + if (type2.ContainingAssembly.Name == csc.AssemblyName) + { + ts_type = type2.Name + "[]"; + enum_type = type2.Name; + break; + } + throw new ApplicationException($"{c.Identifier}.{member.Name}: type2.Name = {type2.Name}"); + } + break; + + default: + throw new ApplicationException($"{c.Identifier}.{member.Name}: type2.Kind = {type2.Kind}"); + } + + break; + + default: + throw new ApplicationException($"{c.Identifier}.{member.Name}: type.Kind = {type.Kind}"); + } + + if (string.IsNullOrEmpty(ts_type) == false) + { + string field_name = field.Name; + string doc2 = member.GetDocumentStr(); + + if (string.IsNullOrEmpty(json_name) == false) field_name = json_name; + + string info_type = ts_type; + string info_type2 = ""; + if (field_name.EndsWith("_str")) info_type2 = "ASCII"; + if (field_name.EndsWith("_utf")) info_type2 = "UTF8"; + if (field_name.EndsWith("_ip")) info_type2 = "IP address"; + if (field_name.EndsWith("_u32")) info_type2 = "uint32"; + if (field_name.EndsWith("_u64")) info_type2 = "uint64"; + if (field_name.EndsWith("_bin")) { info_type2 = "Base64 binary"; info_type = "string"; } + + string docs_add = ""; + + if (string.IsNullOrEmpty(enum_type) == false) + { + Type et = Type.GetType("SoftEther.VPNServerRpc." + enum_type); + if (et.IsEnum) + { + docs_add += "
Values:"; + + var ed = cs_types.Root.DescendantNodes().OfType() + .Where(e => e.Identifier.Text == enum_type) + .Single(); + + foreach (var em in model.GetDeclaredSymbol(ed).GetMembers()) + { + switch (em) + { + case IFieldSymbol ef: + if (ef.IsConst && ef.IsDefinition) + { + string doc3 = em.GetDocumentStr(); + docs_add += $"
`{ef.ConstantValue}`: {doc3}"; + } + break; + } + } + + info_type = "number"; + info_type2 = "enum"; + } + else + { + if (info.SubTypes.Contains(enum_type) == false) + { + info.SubTypes.Add(enum_type); + info_type = "Array object"; + } + } + } + + info_type = "`" + info_type + "`"; + if (string.IsNullOrEmpty(info_type2) == false) info_type += " (" + info_type2 + ")"; + + info.Params.Add(new RpcTypeParameterInfo() + { + Name = field_name, + Type = info_type, + Description = doc2 + docs_add, + }); + + if (json_name_has_special_char) field_name = $"[\"{json_name}\"]"; + + if (string.IsNullOrEmpty(doc2) == false) + { + ts.WriteLine($" /** {doc2} */"); + } + + ts.WriteLine($" public {field_name}: {ts_type} = {default_value};"); + + ts.WriteLine(); + } + break; + + case IMethodSymbol method when method.MethodKind == MethodKind.Constructor: + break; + + default: + throw new ApplicationException($"{c.Identifier}.{member.Name}: type = {member.GetType()}"); + } + } + + if (string.IsNullOrEmpty(doc) == false) + { + ts.WriteLine($" /** Constructor for the '{c.Identifier.Text}' class: {doc} */"); + } + ts.WriteLine($" public constructor(init?: Partial<{c.Identifier.Text}>)"); + ts.WriteLine(" {"); + ts.WriteLine(" Object.assign(this, init);"); + ts.WriteLine(" }"); + + ts.WriteLine("}"); + ts.WriteLine(); + + ret.TypeScript.Types.AddPart(c.SpanStart, ts.ToString()); + } + + var enum_list = cs_types.Root.DescendantNodes().OfType(); + + foreach (EnumDeclarationSyntax e in enum_list) + { + StringWriter ts = new StringWriter(); + + string doc = model.GetDeclaredSymbol(e).GetDocumentStr(); + if (string.IsNullOrEmpty(doc) == false) + { + ts.WriteLine($"/** {doc} */"); + } + + ts.WriteLine($"export enum {e.Identifier.Text}"); + ts.WriteLine("{"); + + foreach (var member in model.GetDeclaredSymbol(e).GetMembers()) + { + switch (member) + { + case IFieldSymbol field: + if (field.IsConst && field.IsDefinition) + { + string doc2 = member.GetDocumentStr(); + if (string.IsNullOrEmpty(doc2) == false) + { + ts.WriteLine($" /** {doc2} */"); + } + + ts.WriteLine($" {field.Name} = {field.ConstantValue},"); + + ts.WriteLine(); + } + break; + } + } + + ts.WriteLine("}"); + ts.WriteLine(); + + ret.TypeScript.Types.AddPart(e.SpanStart, ts.ToString()); + } + } + + void generate_stubs(GeneratedCodeForLang ret) + { + var model = cs_stubs.Model; + + var rpc_class = cs_stubs.Root.DescendantNodes().OfType().Where(c => c.Identifier.Text == "VpnServerRpc").First(); + + var members = model.GetDeclaredSymbol(rpc_class).GetMembers(); + + var methods = members.Where(m => m is IMethodSymbol).Select(m => m as IMethodSymbol).Where(m => m.IsStatic == false) + .Where(m => m.IsAsync).Where(m => m.Name != "CallAsync"); + + foreach (var method in methods) + { + string method_name = method.Name; + if (method_name.EndsWith("Async") == false) throw new ApplicationException($"{method.Name}: method_name = {method_name}"); + method_name = method_name.Substring(0, method_name.Length - 5); + + INamedTypeSymbol ret_type = (INamedTypeSymbol)method.ReturnType; + if (ret_type.Name != "Task") throw new ApplicationException($"{method.Name}: ret_type.Name = {ret_type.Name}"); + + var ret_type_args = ret_type.TypeArguments; + if (ret_type_args.Length != 1) throw new ApplicationException($"{method.Name}: type_args.Length = {ret_type_args.Length}"); + + var ret_type_name = ret_type_args[0].Name; + + if (method.Parameters.Length >= 2) throw new ApplicationException($"{method.Name}: method.Parameters.Length = {method.Parameters.Length}"); + + if (method.DeclaringSyntaxReferences.Length != 1) throw new ApplicationException($"{method.Name}: method.DeclaringSyntaxReferences.Length = {method.DeclaringSyntaxReferences.Length}"); + + MethodDeclarationSyntax syntax = (MethodDeclarationSyntax)method.DeclaringSyntaxReferences[0].GetSyntax(); + if (syntax.Body != null) throw new ApplicationException($"{method.Name}: syntax.Body != null"); + if (syntax.ExpressionBody == null) throw new ApplicationException($"{method.Name}: syntax.ExpressionBody == null"); + + ArrowExpressionClauseSyntax body = syntax.ExpressionBody; + InvocationExpressionSyntax invoke = body.DescendantNodes().OfType().Single(); + + if (model.GetSymbolInfo(invoke.Expression).Symbol.Name != "CallAsync") throw new ApplicationException($"{method.Name}: model.GetSymbolInfo(invoke.Expression).Symbol.Name = {model.GetSymbolInfo(invoke.Expression).Symbol.Name}"); + + if (invoke.ArgumentList.Arguments.Count != 2) throw new ApplicationException($"{method.Name}: invoke.ArgumentList.Arguments.Count = {invoke.ArgumentList.Arguments.Count}"); + + LiteralExpressionSyntax str_syntax = (LiteralExpressionSyntax)invoke.ArgumentList.Arguments[0].Expression; + + string str = str_syntax.Token.Text; + + StringWriter ts = new StringWriter(); + + string doc2 = method.GetDocumentStr(); + if (string.IsNullOrEmpty(doc2) == false) + { + ts.WriteLine($" /** {doc2} */"); + } + + if (method.Parameters.Length == 0) + { + ts.WriteLine($" public {method_name} = (): Promise<{ret_type_name}> =>"); + ts.WriteLine(" {"); + ts.WriteLine($" return this.CallAsync<{ret_type_name}>({str}, new {ret_type_name}());"); + ts.WriteLine(" }"); + ts.WriteLine(" "); + } + else + { + ts.WriteLine($" public {method_name} = (in_param: {ret_type_name}): Promise<{ret_type_name}> =>"); + ts.WriteLine(" {"); + ts.WriteLine($" return this.CallAsync<{ret_type_name}>({str}, in_param);"); + ts.WriteLine(" }"); + ts.WriteLine(" "); + } + + rpc_list[method_name] = new RpcInfo() + { + Name = method_name, + TypeName = ret_type_name, + Symbol = method, + }; + + ret.TypeScript.Stubs.AddPart(method.DeclaringSyntaxReferences[0].Span.Start, ts.ToString()); + } + } + + class CcWalker : CSharpSyntaxWalker + { + StringWriter w = new StringWriter(); + + List lines = new List(); + string current_line = ""; + int current_depth = 0; + const int TabSpace = 4; + CSharpSourceCode src; + + TargetLang lang; + + public CcWalker(CSharpSourceCode src, TargetLang lang) : base(SyntaxWalkerDepth.StructuredTrivia) + { + this.src = src; + this.lang = lang; + } + + string convert_type(string src) + { + if (lang == TargetLang.TypeScript) + { + if (src.StartsWith("Vpn")) + { + src = "VPN." + src; + } + + if (src == "int" || src == "uint" || src == "long" || src == "ulong") + { + src = "number"; + } + + if (src == "bool") + { + src = "boolean"; + } + + if (src == "DateTime") + { + src = "Date"; + } + } + return src; + } + + string convert_function(string src) + { + if (lang == TargetLang.TypeScript) + { + if (src == "Console.WriteLine" || src == "print_object") + { + src = "console.log"; + } + + if (src.StartsWith("api.") || src.StartsWith("Test_")) + { + src = "await " + src; + } + } + return src; + } + + void _emit_internal(string str, bool new_line) + { + if (string.IsNullOrEmpty(current_line)) + { + current_line += new string(' ', current_depth * TabSpace); + } + current_line += str; + if (new_line) + { + lines.Add(current_line); + current_line = ""; + } + } + + void emit_line(string str = "") => emit(str + "\r\n"); + + void emit(string str, bool new_line) + { + if (new_line == false) + { + emit(str); + } + else + { + emit_line(str); + } + } + + void emit(string str) + { + string tmp = ""; + for (int i = 0; i < str.Length; i++) + { + char c = str[i]; + if (c == '\r') { } + else if (c == '\n') + { + _emit_internal(tmp, true); + tmp = ""; + } + else + { + tmp += c; + } + } + if (String.IsNullOrEmpty(tmp) == false) + { + _emit_internal(tmp, false); + } + } + + public override void VisitMethodDeclaration(MethodDeclarationSyntax node) + { + if (node.Identifier.Text == "print_object") return; + + if (lang == TargetLang.TypeScript) + { + emit_line(); + + var sem = src.Model.GetDeclaredSymbol(node); + string doc2 = sem.GetDocumentStr(); + if (string.IsNullOrEmpty(doc2) == false) + { + emit_line($"/** {doc2} */"); + } + + emit("async function "); + emit(node.Identifier.Text); + Visit(node.ParameterList); + emit(": "); + emit("Promise<"); + Visit(node.ReturnType); + emit(">"); + emit_line(""); + + Visit(node.Body); + } + else + { + emit("public"); + emit(" "); + Visit(node.ReturnType); + emit(" "); + emit(node.Identifier.Text); + Visit(node.ParameterList); + emit_line(""); + + Visit(node.Body); + } + } + + public override void VisitParameter(ParameterSyntax node) + { + if (lang == TargetLang.TypeScript) + { + emit($"{node.Identifier.Text}"); + emit(": "); + Visit(node.Type); + } + else + { + Visit(node.Type); + emit(" "); + emit($"{node.Identifier.Text}"); + } + } + + public override void VisitParameterList(ParameterListSyntax node) + { + emit("("); + int num = 0; + foreach (ParameterSyntax p in node.Parameters) + { + if (num >= 1) + { + emit(", "); + } + + Visit(p); + + num++; + } + emit(")"); + } + + public override void VisitArgumentList(ArgumentListSyntax node) + { + emit("("); + int num = 0; + foreach (ArgumentSyntax arg in node.Arguments) + { + if (num >= 1) + { + emit(", "); + } + + this.VisitArgument(arg); + + num++; + } + emit(")"); + } + + public override void VisitAssignmentExpression(AssignmentExpressionSyntax node) + { + if (lang == TargetLang.TypeScript) + { + if (node.Parent.Kind() == SyntaxKind.ObjectInitializerExpression) + { + Visit(node.Left); + + emit(": "); + + Visit(node.Right); + } + else + { + Visit(node.Left); + + emit(" = "); + + Visit(node.Right); + } + } + else + { + Visit(node.Left); + + emit(" = "); + + Visit(node.Right); + } + } + + public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node) + { + Visit(node.Expression); + + emit(node.OperatorToken.Text); + + Visit(node.Name); + } + + public override void VisitCastExpression(CastExpressionSyntax node) + { + if (lang == TargetLang.TypeScript) + { + Visit(node.Expression); + } + else + { + emit("("); + Visit(node.Type); + emit(")"); + Visit(node.Expression); + } + } + + public override void VisitBreakStatement(BreakStatementSyntax node) + { + emit_line("break;"); + } + + public override void VisitReturnStatement(ReturnStatementSyntax node) + { + if (node.Expression == null) + { + emit_line("return;"); + } + else + { + emit("return"); + emit(" "); + Visit(node.Expression); + emit_line(";"); + } + } + + public override void VisitForEachStatement(ForEachStatementSyntax node) + { + if (lang == TargetLang.TypeScript) + { + emit("for (let "); + emit(node.Identifier.Text); + emit(" of "); + Visit(node.Expression); + emit_line(")"); + Visit(node.Statement); + } + else + { + emit("foreach ("); + + Visit(node.Type); + + emit(" "); + + emit(node.Identifier.Text); + + emit(" in "); + + Visit(node.Expression); + + emit_line(")"); + + Visit(node.Statement); + } + } + + public override void VisitExpressionStatement(ExpressionStatementSyntax node) + { + Visit(node.Expression); + + emit_line(";"); + } + + public override void VisitConditionalExpression(ConditionalExpressionSyntax node) + { + Visit(node.Condition); + emit(" ? "); + Visit(node.WhenTrue); + emit(" : "); + Visit(node.WhenFalse); + } + + public override void VisitIfStatement(IfStatementSyntax node) + { + emit("if ("); + Visit(node.Condition); + emit_line(")"); + + Visit(node.Statement); + + if (node.Else != null) + { + if (node.Else.Statement is IfStatementSyntax) + { + emit("else "); + } + else + { + emit_line("else"); + } + + Visit(node.Else.Statement); + } + } + + public override void VisitInitializerExpression(InitializerExpressionSyntax node) + { + if (lang == TargetLang.TypeScript) + { + if (node.Kind() == SyntaxKind.ArrayInitializerExpression) + { + bool is_byte_array = false; + + if (node.Parent.Kind() == SyntaxKind.ArrayCreationExpression && + ((ArrayCreationExpressionSyntax)node.Parent).Type.ElementType.ToString() == "byte") + { + is_byte_array = true; + } + + if (is_byte_array) + { + emit("new Uint8Array("); + } + + emit("[ "); + current_depth++; + + foreach (var exp in node.Expressions) + { + this.Visit(exp); + + emit(", "); + } + + current_depth--; + emit(" ]"); + + if (is_byte_array) + { + emit(")"); + } + } + else + { + emit_line("{"); + current_depth++; + + foreach (var exp in node.Expressions) + { + this.Visit(exp); + + emit_line(","); + } + + current_depth--; + emit("}"); + } + } + else + { + if (node.Kind() == SyntaxKind.ArrayInitializerExpression) + { + emit("{ "); + current_depth++; + + foreach (var exp in node.Expressions) + { + this.Visit(exp); + + emit(", "); + } + + current_depth--; + emit(" }"); + } + else + { + emit_line("{"); + current_depth++; + + foreach (var exp in node.Expressions) + { + this.Visit(exp); + + emit_line(","); + } + + current_depth--; + emit("}"); + } + } + } + + public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node) + { + if (lang == TargetLang.TypeScript) + { + var type = node.Type; + + if (node.Initializer != null) + { + emit(" "); + Visit(node.Initializer); + } + else + { + emit("[]"); + } + } + else + { + var type = node.Type; + + emit("new "); + + Visit(node.Type); + + if (node.Initializer != null) + { + emit(" "); + Visit(node.Initializer); + } + } + } + + public override void VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) + { + if (lang == TargetLang.TypeScript) + { + var type = (IdentifierNameSyntax)node.Type; + + if (node.Initializer == null) + { + emit("new "); + Visit(node.Type); +// emit($"new {type.Identifier.Text}"); + + Visit(node.ArgumentList); + } + else + { + emit("new "); + Visit(node.Type); + emit_line("("); + Visit(node.Initializer); + emit(")"); + } + } + else + { + var type = (IdentifierNameSyntax)node.Type; + + emit($"new {type.Identifier.Text}"); + + Visit(node.ArgumentList); + + if (node.Initializer != null) + { + emit_line(""); + Visit(node.Initializer); + } + } + } + + public override void VisitLiteralExpression(LiteralExpressionSyntax node) + { + emit(node.Token.Text); + } + + public override void VisitParenthesizedExpression(ParenthesizedExpressionSyntax node) + { + emit("("); + base.Visit(node.Expression); + emit(")"); + } + + public override void VisitBinaryExpression(BinaryExpressionSyntax node) + { + base.Visit(node.Left); + emit($" {node.OperatorToken.Text} "); + base.Visit(node.Right); + } + + public override void VisitIdentifierName(IdentifierNameSyntax node) + { + string name = node.Identifier.Text; + + if (node.Parent.Kind() == SyntaxKind.VariableDeclaration + || node.Parent.Kind() == SyntaxKind.MethodDeclaration + || node.Parent.Kind() == SyntaxKind.SimpleMemberAccessExpression + || node.Parent.Kind() == SyntaxKind.ForEachStatement + || node.Parent.Kind() == SyntaxKind.Parameter + || node.Parent.Kind() == SyntaxKind.ObjectCreationExpression) + { + name = convert_type(name); + } + + var sym = src.Model.GetSymbolInfo(node); + string json_name = ""; + bool json_name_has_special_char = false; + var atts = sym.Symbol.GetAttributes(); + var y = atts.Where(x => x.AttributeClass.Name == "JsonPropertyAttribute").FirstOrDefault(); + if (y != null) + { + json_name = y.ConstructorArguments.FirstOrDefault().Value.ToString(); + if (json_name.IndexOf(':') != -1 || json_name.IndexOf('.') != -1) json_name_has_special_char = true; + } + + string field_name = name; + if (lang == TargetLang.TypeScript) + { + if (string.IsNullOrEmpty(json_name) == false) field_name = json_name; + if (json_name_has_special_char) field_name = $"[\"{json_name}\"]"; + } + + emit(field_name); + } + + public override void VisitInvocationExpression(InvocationExpressionSyntax node) + { + string func_name = node.Expression.ToString(); + func_name = convert_function(func_name); + + if (lang == TargetLang.TypeScript) + { + if (func_name == "rand.Next") + { + string a = node.ArgumentList.Arguments[0].ToString(); + string b = node.ArgumentList.Arguments[1].ToString(); + emit($"Math.floor((Math.random() * ({b} - {a})) + {a})"); + return; + } + + if (func_name == "System.Threading.Thread.Sleep") + { + string a = node.ArgumentList.Arguments[0].ToString(); + emit($"await new Promise((r) => setTimeout(r, {a}))"); + return; + } + } + + emit(func_name); + + Visit(node.ArgumentList); + } + + public override void VisitPredefinedType(PredefinedTypeSyntax node) + { + string name = node.Keyword.Text; + name = convert_type(name); + emit(name); + } + + public override void VisitArrayRankSpecifier(ArrayRankSpecifierSyntax node) + { + emit("["); + + int num = 0; + + foreach (ExpressionSyntax exp in node.Sizes) + { + if (num >= 1) + { + emit(","); + } + + Visit(exp); + + num++; + } + + emit("]"); + } + + public override void VisitConstructorDeclaration(ConstructorDeclarationSyntax node) + { + /*foreach (var statement in node.Body.Statements) + { + Visit(statement); + }*/ + } + + public override void VisitArrayType(ArrayTypeSyntax node) + { + Visit(node.ElementType); + + foreach (var rank in node.RankSpecifiers) + { + Visit(rank); + } + } + + public void VisitVariableDeclarator(VariableDeclaratorSyntax node, TypeSyntax type) + { + if (lang == TargetLang.TypeScript) + { +// if (node.Parent.Parent.Kind() == SyntaxKind.LocalDeclarationStatement) + { + emit("let "); + } + + emit($"{node.Identifier.Text}"); + + emit(": "); + + var type_dec = src.Model.GetTypeInfo(type); + + if (type is PredefinedTypeSyntax) + { + Visit(type); + } + else if (type is ArrayTypeSyntax) + { + Visit(type); + } + else if (type is IdentifierNameSyntax) + { + Visit(type); + } + else + { + throw new ApplicationException($"VisitVariableDeclarator: {type.GetType().ToString()}"); + } + + if (node.Initializer != null) + { + emit(" = "); + + var value = node.Initializer.Value; + + base.Visit(value); + } + + emit_line(";"); + } + else + { + var type_dec = src.Model.GetTypeInfo(type); + + if (type is PredefinedTypeSyntax) + { + Visit(type); + } + else if (type is ArrayTypeSyntax) + { + Visit(type); + } + else if (type is IdentifierNameSyntax) + { + Visit(type); + } + else + { + throw new ApplicationException($"VisitVariableDeclarator: {type.GetType().ToString()}"); + } + + emit($" {node.Identifier.Text}"); + + if (node.Initializer != null) + { + emit(" = "); + + var value = node.Initializer.Value; + + base.Visit(value); + } + + emit_line(";"); + } + } + + public override void VisitVariableDeclaration(VariableDeclarationSyntax node) + { + foreach (var v in node.Variables) + { + VisitVariableDeclarator(v, node.Type); + } + } + + public override void VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node) + { + Visit(node.Declaration); + } + + public override void VisitFieldDeclaration(FieldDeclarationSyntax node) + { + //Visit(node.Declaration); + } + + public override void VisitBlock(BlockSyntax node) + { + emit_line("{"); + current_depth++; + + foreach (var statement in node.Statements) + { + Visit(statement); + } + + current_depth--; + emit_line("}"); + } + + public override void VisitClassDeclaration(ClassDeclarationSyntax node) + { + if (lang == TargetLang.TypeScript) + { + base.VisitClassDeclaration(node); + } + else + { + emit_line($"class {node.Identifier.Text}"); + emit_line("{"); + + current_depth++; + + base.VisitClassDeclaration(node); + + current_depth--; + + emit_line("}"); + } + } + + public override string ToString() + { + StringWriter w = new StringWriter(); + this.lines.ForEach(x => w.WriteLine(x)); + if (String.IsNullOrEmpty(this.current_line) == false) w.WriteLine(this.current_line); + return w.ToString(); + } + } + + void generate_tests(GeneratedCodeForLang ret) + { + var test_class = cs_tests.Root.DescendantNodes().OfType().Where(c => c.Identifier.Text == "VPNRPCTest").First(); + + CcWalker ts_walker = new CcWalker(cs_tests, TargetLang.TypeScript); + ts_walker.Visit(test_class); + ret.TypeScript.Tests.PartList.Add(new GeneratedCodePart() { Seq = 0, Text = ts_walker.ToString() }); + } + + void doc_write_parameters(StringWriter w, RpcTypeInfo type_info) + { + List plist = new List(); + + foreach (RpcTypeParameterInfo p in type_info.Params) + { + plist.Add(p); + } + + foreach (string subtype in type_info.SubTypes) + { + foreach (RpcTypeParameterInfo p in rpc_type_list[subtype].Params) + { + plist.Add(p); + } + } + + w.WriteLine("Name | Type | Description"); + w.WriteLine("--- | --- | ---"); + foreach (RpcTypeParameterInfo p in plist) + { + w.WriteLine($"`{p.Name}` | {p.Type} | {p.Description}"); + } + } + + void doc_write_function(StringWriter w, RpcInfo rpc) + { + string func_summary = rpc.Symbol.GetDocumentStr(); + int index = func_summary.IndexOf("."); + if (index != -1) func_summary = func_summary.Substring(0, index + 1); + func_summary = func_summary.TrimEnd('.'); + + w.WriteLine($""); + w.WriteLine($"## \"{rpc.Name}\" RPC API - {func_summary}"); + + w.WriteLine("### Description"); + + w.WriteLine(rpc.Symbol.GetDocumentStr()); + + var model = cs_tests.Model; + + var func = cs_tests.Root.DescendantNodes().OfType() + .Where(f => f.Identifier.Text == "Test_" + rpc.Name) + .Single(); + + var fields = func.DescendantNodes().OfType() + .Where(i => i.Kind() == SyntaxKind.ObjectInitializerExpression) + .SelectMany(o => o.DescendantNodes().OfType()) + .Where(a => a.Kind() == SyntaxKind.SimpleAssignmentExpression) + .Select(a => (a.Left as IdentifierNameSyntax)); + + foreach (var field in fields) + { + string json_name = field.Identifier.Text; + var sym = model.GetSymbolInfo(field); + + var atts = sym.Symbol.GetAttributes(); + var y = atts.Where(x => x.AttributeClass.Name == "JsonPropertyAttribute").FirstOrDefault(); + if (y != null) + { + json_name = y.ConstructorArguments.FirstOrDefault().Value.ToString(); + } + + rpc.InputParamMembers.Add(json_name); + } + + Type obj_type = Type.GetType("SoftEther.VPNServerRpc." + rpc.TypeName); + + object in_object = Activator.CreateInstance(obj_type); + object out_object = Activator.CreateInstance(obj_type); + + JsonRpcRequest rpc_in = new JsonRpcRequest() { Method = rpc.Name, Params = in_object, Id = "rpc_call_id", }; + Type rpc_out_type = typeof(JsonRpcResponse<>).MakeGenericType(obj_type); + var rpc_out = Activator.CreateInstance(rpc_out_type); + + rpc_out_type.GetProperty("Id").SetValue(rpc_out, "rpc_call_id"); + rpc_out_type.GetProperty("Result").SetValue(rpc_out, out_object); + + sample_fill_object(in_object); + sample_fill_object(out_object); + + JsonSerializerSettings rpc_in_settings = new JsonSerializerSettings() + { + MaxDepth = 8, + NullValueHandling = NullValueHandling.Include, + ReferenceLoopHandling = ReferenceLoopHandling.Error, + PreserveReferencesHandling = PreserveReferencesHandling.None, + ContractResolver = new JSonInputContractResolver(rpc), + }; + + JsonSerializerSettings rpc_out_settings = new JsonSerializerSettings() + { + MaxDepth = 8, + NullValueHandling = NullValueHandling.Include, + ReferenceLoopHandling = ReferenceLoopHandling.Error, + PreserveReferencesHandling = PreserveReferencesHandling.None, + ContractResolver = new JSonOutputContractResolver(rpc), + }; + + string in_str = JsonConvert.SerializeObject(rpc_in, Formatting.Indented, rpc_in_settings); + string out_str = JsonConvert.SerializeObject(rpc_out, Formatting.Indented, rpc_out_settings); + + w.WriteLine(); + w.WriteLine("### Input JSON-RPC Format"); + w.WriteLine("```json"); + w.WriteLine(in_str); + w.WriteLine("```"); + + w.WriteLine(); + w.WriteLine("### Output JSON-RPC Format"); + w.WriteLine("```json"); + w.WriteLine(out_str); + w.WriteLine("```"); + + w.WriteLine(); + w.WriteLine("### Parameters"); + w.WriteLine(); + doc_write_parameters(w, rpc_type_list[rpc.TypeName]); + + //w.WriteLine("
"); + w.WriteLine(); + } + + class JSonOutputContractResolver : DefaultContractResolver + { + RpcInfo rpc_info; + + public JSonOutputContractResolver(RpcInfo info) : base() + { + this.rpc_info = info; + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + if (member.Name == "Error") return null; + JsonProperty ret = base.CreateProperty(member, memberSerialization); + return ret; + } + } + + + class JSonInputConverter : JsonConverter + { + RpcInfo rpc_info; + + public JSonInputConverter(RpcInfo info) + { + this.rpc_info = info; + } + + public override bool CanRead => false; + + public override bool CanConvert(Type objectType) + { + return true; + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + + public override void WriteJson(JsonWriter w, object value, JsonSerializer serializer) + { + JToken t = JToken.FromObject(value); + List a = new List(); + bool all = false; + if (rpc_info.Name == "SetHubLog") all = true; + + foreach (var p1 in t.Children()) + { + foreach (var p2 in p1.Children()) + { + if (rpc_info.InputParamMembers.Contains(p2.Name) == false) a.Add(p2); + } + if (rpc_info.InputParamMembers.Contains(p1.Name) == false) a.Add(p1); + } + if (all == false) + { + foreach (var p in a) + { + try + { + p.Remove(); + } + catch + { + } + } + } + t.WriteTo(w); + } + } + + class JSonInputContractResolver : DefaultContractResolver + { + RpcInfo rpc_info; + + public JSonInputContractResolver(RpcInfo info) : base() + { + this.rpc_info = info; + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty ret = base.CreateProperty(member, memberSerialization); + ret.Converter = new JSonInputConverter(this.rpc_info); + return ret; + } + } + + void sample_fill_object(object o) + { + Type t = o.GetType(); + + var fields = t.GetFields(); + foreach (var field in fields) + { + Type t2 = field.FieldType; + object v = null; + + if (t2 == typeof(string)) + { + string tmp = field.Name.ToLowerInvariant(); + if (tmp.EndsWith("_str") || tmp.EndsWith("_utf")) tmp = tmp.Substring(0, tmp.Length - 4); + if (tmp.EndsWith("_ip")) + { + if (tmp.IndexOf("mask", StringComparison.InvariantCultureIgnoreCase) == -1) + tmp = "192.168.0.1"; + else + tmp = "255.255.255.255"; + } + v = tmp; + } + else if (t2 == typeof(uint)) + v = (uint)0; + else if (t2 == typeof(ulong)) + v = (ulong)0; + else if (t2 == typeof(bool)) + v = (bool)false; + else if (t2 == typeof(byte[])) + v = Encoding.UTF8.GetBytes("Hello World"); + else if (t2 == typeof(DateTime)) + v = new DateTime(DateTime.Now.Year + 1, 8, 1, 12, 24, 36, 123); + else if (t2.IsEnum) + { + v = (int)0; + } + else if (t2.IsArray) + { + if (t2 == typeof(uint[])) + { + v = new uint[] { 1, 2, 3 }; + } + else + { + if (t2.GetArrayRank() != 1) throw new ApplicationException("Array rank != 1"); + Type obj_type = t2.GetElementType(); + + if (obj_type.IsEnum) + { + v = new int[] { 1, 2, 3 }; + } + else + { + int num = 3; + + if (field.Name.IndexOf("single", StringComparison.CurrentCultureIgnoreCase) != -1) + { + num = 1; + } + + object list = Activator.CreateInstance(typeof(List<>).MakeGenericType(obj_type)); + + for (int i = 0; i < num; i++) + { + object a = Activator.CreateInstance(obj_type); + sample_fill_object(a); + + list.GetType().GetMethod("Add").Invoke(list, new object[] { a }); + } + + v = list.GetType().GetMethod("ToArray").Invoke(list, new object[] { } ); + } + } + } + else if (t2.Name.StartsWith("Vpn")) + { + Type obj_type = Type.GetType("SoftEther.VPNServerRpc." + t2.Name); + v = Activator.CreateInstance(obj_type); + sample_fill_object(v); + } + else + { + throw new ApplicationException($"sample_fill_object: type: {t2.ToString()}"); + } + + field.SetValue(o, v); + } + } + + void generate_documents(GeneratedCodeForLang ret) + { + StringWriter w = new StringWriter(); + + string doc_txt = read_text_resource("doc.txt"); + w.WriteLine(doc_txt); + + w.WriteLine("## Table of contents"); + foreach (RpcInfo rpc in rpc_list.Values) + { + string func_summary = rpc.Symbol.GetDocumentStr(); + int index = func_summary.IndexOf("."); + if (index != -1) func_summary = func_summary.Substring(0, index + 1); + func_summary = func_summary.TrimEnd('.'); + + w.WriteLine($"- [{rpc.Name} - {func_summary}](#{rpc.Name.ToLowerInvariant()})"); + + } + + w.WriteLine(); + w.WriteLine("***"); + + foreach (RpcInfo rpc in rpc_list.Values) + { + if (rpc.Name.IndexOf("Vgs", StringComparison.Ordinal) == -1) + { + doc_write_function(w, rpc); + + w.WriteLine("***"); + } + } + + w.WriteLine($"Automatically generated at {timestamp.ToString("yyyy-MM-dd HH:mm:ss")} by vpnserver-jsonrpc-codegen. "); + w.WriteLine("Copyright (c) 2014-" + DateTime.Now.Year + " [SoftEther VPN Project](https://www.softether.org/) under the Apache License 2.0. "); + w.WriteLine(); + + ret.DocsRpc = w.ToString(); + } + + public GeneratedCodeForLang GenerateCodes() + { + GeneratedCodeForLang ret = new GeneratedCodeForLang(); + + generate_stubs(ret); + + generate_tests(ret); + + generate_types(ret); + + generate_documents(ret); + + return ret; + } + + public void GenerateAndSaveCodes(string output_dir) + { + CodeGenUtil.MakeDir(output_dir); + + WriteLine($"GenerateAndSaveCodes(): output_dir = '{output_dir}'"); + WriteLine(); + WriteLine("Generating codes ..."); + GeneratedCodeForLang codes = GenerateCodes(); + WriteLine("Generating codes: done."); + WriteLine(); + + output_docs(codes, output_dir); + + output_csharp(Path.Combine(output_dir, "vpnserver-jsonrpc-client-csharp")); + + output_typescript(codes.TypeScript, Path.Combine(output_dir, "vpnserver-jsonrpc-client-typescript")); + } + + static Assembly this_assembly = Assembly.GetExecutingAssembly(); + static string read_text_resource(string name) + { + var x = this_assembly.GetManifestResourceNames(); + string resourceName = this_assembly.GetManifestResourceNames().Single(str => str.EndsWith(name)); + using (Stream stream = this_assembly.GetManifestResourceStream(resourceName)) + { + using (StreamReader reader = new StreamReader(stream)) + { + return reader.ReadToEnd(); + } + } + } + + static string read_text_file(string name) + { + using (Stream stream = File.OpenRead(name)) + { + using (StreamReader reader = new StreamReader(stream)) + { + return reader.ReadToEnd(); + } + } + } + + static string replace_strings(string src, params string[] replace_list) + { + int i; + for (i = 0; i < replace_list.Length / 2; i++) + { + string s1 = replace_list[i * 2]; + string s2 = replace_list[i * 2 + 1]; + src = src.Replace(s1, s2, StringComparison.InvariantCultureIgnoreCase); + } + return src; + } + + static string normalize_crlf(string src, string crlf) + { + StringReader r = new StringReader(src); + StringWriter w = new StringWriter(); + w.NewLine = crlf; + while (true) + { + string line = r.ReadLine(); + if (line == null) break; + w.WriteLine(line); + } + return w.ToString(); + } + + static void normalize(ref string str, string crlf, params string[] replace_list) + { + str = normalize_crlf(replace_strings(str, replace_list), crlf); + } + + static void save(string path, string body, bool bom) + { + string dir_name = Path.GetDirectoryName(path); + CodeGenUtil.MakeDir(dir_name); + + if (bom) + File.WriteAllText(path, body, Encoding.UTF8); + else + File.WriteAllText(path, body); + } + + DateTime timestamp = DateTime.Now; + + void output_docs(GeneratedCodeForLang c, string output_dir) + { + CodeGenUtil.MakeDir(output_dir); + + save(Path.Combine(output_dir, "README.md"), c.DocsRpc, true); + + var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build(); + + string md_html_body = Markdown.ToHtml(c.DocsRpc, pipeline); + + string html = read_text_resource("md_html.html"); + + string[] replace_list = + { + "__BODY__", md_html_body, + }; + + normalize(ref html, "\r\n", replace_list); + + save(Path.Combine(output_dir, "README.html"), html, true); + save(Path.Combine(CodeGenUtil.OutputDir_HamCore, "vpnserver_api_doc.html"), html, true); + } + + void output_typescript(GeneratedCode c, string output_dir) + { + CodeGenUtil.MakeDir(output_dir); + + string ts_rpc = read_text_resource("ts_rpc.txt"); + string ts_test = read_text_resource("ts_test.txt"); + + string[] replace_list = + { + "__YEAR__", timestamp.Year.ToString(), + "__TESTS__", c.Tests.ToString(), + "__STUBS__", c.Stubs.ToString(), + "__TYPES__", c.Types.ToString(), + "__TIMESTAMP__", timestamp.ToString("yyyy-MM-dd HH:mm:ss"), + }; + + normalize(ref ts_rpc, "\n", replace_list); + normalize(ref ts_test, "\n", replace_list); + + save(Path.Combine(output_dir, "vpnrpc.ts"), ts_rpc, true); + save(Path.Combine(output_dir, "sample.ts"), ts_test, true); + + save(Path.Combine(output_dir + "/../vpnserver-jsonrpc-client-nodejs-package/src/", "vpnrpc.ts"), ts_rpc, true); + save(Path.Combine(output_dir + "/../vpnserver-jsonrpc-client-nodejs-package/src/", "sample.ts"), ts_test, true); + } + + void output_csharp(string output_dir) + { + CodeGenUtil.MakeDir(output_dir); + + string cs_proj = read_text_resource("cs_proj.txt"); + string cs_sln = read_text_resource("cs_sln.txt"); + string cs_main = read_text_resource("cs_main.txt"); + + string cs_code_jsonrpc = read_text_file(Path.Combine(CodeGenUtil.ProjectDir, + @"VpnServerRpc/JsonRpc.cs")); + + string cs_code_vpnserver_rpc = read_text_file(Path.Combine(CodeGenUtil.ProjectDir, + @"VpnServerRpc/VPNServerRpc.cs")); + + string cs_code_vpnserver_rpc_types = read_text_file(Path.Combine(CodeGenUtil.ProjectDir, + @"VpnServerRpc/VPNServerRpcTypes.cs")); + + string cs_code_vpnserver_rpc_test = read_text_file(Path.Combine(CodeGenUtil.ProjectDir, + @"VpnServerRpcTest/VpnServerRpcTest.cs")); + + string[] replace_list = + { + "__YEAR__", timestamp.Year.ToString(), + "__TIMESTAMP__", timestamp.ToString("yyyy-MM-dd HH:mm:ss"), + }; + + normalize(ref cs_main, "\r\n", replace_list); + normalize(ref cs_proj, "\r\n", replace_list); + normalize(ref cs_sln, "\r\n", replace_list); + normalize(ref cs_code_jsonrpc, "\r\n", replace_list); + normalize(ref cs_code_vpnserver_rpc, "\r\n", replace_list); + normalize(ref cs_code_vpnserver_rpc_types, "\r\n", replace_list); + normalize(ref cs_code_vpnserver_rpc_test, "\r\n", replace_list); + + save(Path.Combine(output_dir, "vpnserver-jsonrpc-client-csharp.csproj"), + cs_proj, true); + + save(Path.Combine(output_dir, "vpnserver-jsonrpc-client-csharp.sln"), + cs_sln, true); + + save(Path.Combine(output_dir, @"rpc-stubs\JsonRpc.cs"), + cs_code_jsonrpc, true); + + save(Path.Combine(output_dir, @"rpc-stubs\VPNServerRpc.cs"), + cs_code_vpnserver_rpc, true); + + save(Path.Combine(output_dir, @"rpc-stubs\VPNServerRpcTypes.cs"), + cs_code_vpnserver_rpc_types, true); + + save(Path.Combine(output_dir, @"sample\VpnServerRpcTest.cs"), + cs_code_vpnserver_rpc_test, true); + + save(Path.Combine(output_dir, @"sample\Main.cs"), + cs_main, true); + } + + public void Test() + { + GeneratedCodeForLang ret = GenerateCodes(); + + Console.WriteLine(ret.TypeScript.ToString()); + + return; + var model = cs_types.Model; + + var type_classes = cs_types.Root.DescendantNodes() + .OfType(); + + foreach (ClassDeclarationSyntax v in type_classes) + { + WriteLine(v.Identifier.Text); + + var info = model.GetDeclaredSymbol(v); + + var x = info.GetMembers(); + + foreach (var y in x) + { + WriteLine(y.Name); + } + + break; + } + + Console.WriteLine(); + } + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Program.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Program.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Program.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Program.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,37 @@ +using System; +using System.IO; +using System.Diagnostics; +using Newtonsoft.Json; +using SoftEther.VPNServerRpc; +using System.Text; +using SoftEther.JsonRpc; + + +namespace VPNServer_JSONRPC_CodeGen +{ + class Program + { + static void Main(string[] args) + { + string output_dir = CodeGenUtil.OutputDir_Clients; + + try + { + Directory.CreateDirectory(output_dir); + } + catch + { + } + + CodeGen g = new CodeGen(); + + g.GenerateAndSaveCodes(output_dir); + } + } +} + + + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_main.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_main.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_main.txt 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_main.txt 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,17 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// Program.cs - The Main() entry point +// +// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-__YEAR__ SoftEther VPN Project + +class Program +{ + static void Main(string[] args) + { + VPNRPCTest test = new VPNRPCTest(); + test.Test_All(); + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_proj.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_proj.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_proj.txt 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_proj.txt 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp2.1 + SoftEther.VPNServerRpc + + + + + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_sln.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_sln.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_sln.txt 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/cs_sln.txt 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2041 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vpnserver-jsonrpc-client-csharp", "vpnserver-jsonrpc-client-csharp.csproj", "{81CA3EC4-026E-4D37-9889-828186BBB8C0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {81CA3EC4-026E-4D37-9889-828186BBB8C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81CA3EC4-026E-4D37-9889-828186BBB8C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81CA3EC4-026E-4D37-9889-828186BBB8C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81CA3EC4-026E-4D37-9889-828186BBB8C0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D87E5CF1-9A10-431C-AC42-F1041470AEE8} + EndGlobalSection +EndGlobal diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/doc.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/doc.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/doc.txt 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/doc.txt 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,77 @@ +# SoftEther VPN Server JSON-RPC API Suite Document +This reference describes all JSON-RPC functions available on SoftEther VPN Server. + + +You can access to the latest [SoftEther VPN Server JSON-RPC Document on GitHub](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/). + + +## What is SoftEther VPN Server JSON-RPC API Suite? +The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions). + + - Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API. + - You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.) + - If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server. + - No need to use any specific API client library since all APIs are provided on the [JSON-RPC 2.0 Specification](https://www.jsonrpc.org/specification). You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment. + - Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. [The Node.js Client Library for VPN Server RPC (vpnrpc)](https://www.npmjs.com/package/vpnrpc) package is also available. + + +## Principle + +### Entry point +The entry point URL of JSON-RPC is: +``` +https://:/api/ +``` + + - Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs. + - If you want to completely disable the JSON-RPC on your VPN Server, set the `DisableJsonRpcWebApi` variable to `true` on the `vpn_server.config`. + + +### JSON-RPC specification +You must use HTTPS 1.1 `POST` method to call each of JSON-RPC APIs. +All APIs are based on the [JSON-RPC 2.0 Specification](https://www.jsonrpc.org/specification). + - JSON-RPC Notification is not supported. + - JSON-RPC Batch is not supported. + + +### "vpnrpc": Node.js Client Library package for VPN Server JSON-RPC +If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [JavaScript Client Library for VPN Server RPC (vpnrpc)](https://www.npmjs.com/package/vpnrpc). + + - You can use the `vpnrpc` library in JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js. + - As a sample code there is the [sample.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts) program in TypeScript. This sample calls all of available JSON-RPC APIs against the specified SoftEther VPN Server. (Note: This sample code is written in TypeScript.) + +You can use the following command to download the `vpnrpc` library package with Node.js. +``` +$ npm install --save-dev vpnrpc +``` + + + +### "vpnrpc.ts": TypeScript Client Library for VPN Server JSON-RPC +If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [TypeScript Client Library for VPN Server RPC (vpnrpc.ts)](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/). + + - You can use the [vpnrpc.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/vpnrpc.ts) library in TypeScript / JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js. + - As a sample code there is the [sample.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts) program in TypeScript. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server. + + +### "vpnserver-jsonrpc-client-csharp": C# Client Library for VPN Server JSON-RPC +If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [vpnserver-jsonrpc-client-csharp C# library](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/). + + - The [client library codes for C#](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/) is written in pure C# 7.3. It works on .NET Core 2.1 or later on Windows, Linux and macOS. Very comfort with Visual Studio for both Windows or macOS. + - As a sample code there is the [VpnServerRpcTest.cs](https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/VpnServerRpcTest.cs) program in C#. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server. + + + +### HTTPS Authentication +You must specify the following HTTPS custom headers for authentication on each of requests. + + +Value | Description +--- | --- +`X-VPNADMIN-HUBNAME` | The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify empty string if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. +`X-VPNADMIN-PASSWORD` | Specify the administration password. + + +- You can omit the above HTTPS custom authentication headers if you are calling JSON-RPC APIs from the web browser which is already logged in to the VPN Server with HTTPS Basic Authentication. In such usage the credential of HTTPS Basic Authtication will be used. + +*** diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/md_html.html softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/md_html.html --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/md_html.html 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/md_html.html 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,16 @@ + + + + + SoftEther VPN Server JSON-RPC Suite Document + + + + + + +
+__BODY__ +
+ + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_rpc.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_rpc.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_rpc.txt 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_rpc.txt 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,576 @@ +// SoftEther VPN Server JSON-RPC Stub code for TypeScript +// +// vpnrpc.ts +// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-__YEAR__ SoftEther VPN Project + + +// Trivial utility codes +let is_node_js = (typeof navigator === "undefined") || navigator.userAgent.indexOf("Node.js") !== -1 || navigator.userAgent.indexOf("jsdom") !== -1; +function is_null(obj: any) +{ + return (typeof obj === "undefined") || (obj === null); +} +let debug_mode: boolean = false; + +/** VPN Server RPC Stubs */ +export class VpnServerRpc +{ + /** Determine if this JavaScript environment is on the Node.js or not. */ + public static IsNodeJS(): boolean + { + return is_node_js; + } + + /** Set the debug mode flag */ + public static SetDebugMode(flag: boolean): void + { + debug_mode = flag; + } + + private rpc_url: string; + private rpc_client: JsonRpcClient; + + /** + * Constructor of the VpnServerRpc class + * @param vpnserver_hostname The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param vpnserver_port The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + * @param hubname The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. + * @param password Specify the administration password. This value is valid only if vpnserver_hostname is sepcified. + * @param nodejs_https_client_reject_untrusted_server_cert In Node.js set this true to check the SSL server certificate on the destination VPN Server. Set this false to ignore the SSL server certification. + */ + constructor(vpnserver_hostname?: string, vpnserver_port?: number, hubname?: string, password?: string, nodejs_https_client_reject_untrusted_server_cert?: boolean) + { + let headers: { [name: string]: string } = {}; + let send_credentials: boolean = false; + + nodejs_https_client_reject_untrusted_server_cert = is_null(nodejs_https_client_reject_untrusted_server_cert) ? false : nodejs_https_client_reject_untrusted_server_cert!; + + if (is_null(vpnserver_hostname)) + { + this.rpc_url = "/api/"; + send_credentials = true; + } + else + { + if (is_null(vpnserver_port)) vpnserver_port = 443; + this.rpc_url = `https://${vpnserver_hostname}:${vpnserver_port}/api/`; + + + headers["X-VPNADMIN-HUBNAME"] = is_null(hubname) ? "" : hubname!; + headers["X-VPNADMIN-PASSWORD"] = is_null(password) ? "" : password!; + } + + if (is_null(nodejs_https_client_reject_untrusted_server_cert)) nodejs_https_client_reject_untrusted_server_cert = false; + + this.rpc_client = new JsonRpcClient(this.rpc_url, headers, send_credentials, nodejs_https_client_reject_untrusted_server_cert); + } + + // --- Stubs --- +__STUBS__ + + // -- Utility functions -- + /** Call a RPC procedure */ + public async CallAsync(method_name: string, request: T): Promise + { + let response: T = await this.rpc_client.CallAsync(method_name, request); + + return response; + } +} + + + + +// --- Types --- +__TYPES__ + + + +// --- Utility codes --- + +/** JSON-RPC request class. See https://www.jsonrpc.org/specification */ +export class JsonRpcRequest +{ + public jsonrpc: string = "2.0"; + public method: string; + public params: any; + public id: string; + + constructor(method: string = "", param: any = null, id: string = "") + { + this.method = method; + this.params = param; + this.id = id; + } +} + +/** JSON-RPC error class. See https://www.jsonrpc.org/specification */ +export class JsonRpcError +{ + public code: number; + public message: string; + public data: any; + + constructor(code: number = 0, message: string = "", data: any = null) + { + this.code = code; + this.message = message; + this.data = data; + } +} + +/** JSON-RPC response class with generics */ +export class JsonRpcResponse +{ + public jsonrpc: string = "2.0"; + public result: TResult = null!; + public error: JsonRpcError = null!; + public id: string = ""; +} + +/** JSON-RPC client class. See https://www.jsonrpc.org/specification */ +export class JsonRpcClient +{ + /** A utility function to convert any object to JSON string */ + public static ObjectToJson(obj: any): string + { + return JSON.stringify(obj, + (key, value) => + { + if (key.endsWith("_bin")) + { + return Util_Base64_Encode(value); + } + return value; + } + , 4); + } + + /** A utility function to convert JSON string to object */ + public static JsonToObject(str: string): any + { + return JSON.parse(str, + (key, value) => + { + if (key.endsWith("_bin")) + { + return Util_Base64_Decode(value); + } + else if (key.endsWith("_dt")) + { + return new Date(value); + } + return value; + }); + } + + /** Base URL */ + public BaseUrl: string; + + /** The instance of HTTP client */ + private client: HttpClient; + + /** Additional HTTP headers */ + private headers: { [name: string]: string }; + + /** + * JSON-RPC client class constructor + * @param url The URL + * @param headers Additional HTTP headers + * @param send_credential Set true to use the same credential with the browsing web site. Valid only if the code is running on the web browser. + */ + constructor(url: string, headers: { [name: string]: string }, send_credential: boolean, nodejs_https_client_reject_untrusted_server_cert: boolean) + { + this.BaseUrl = url; + this.headers = headers; + + this.client = new HttpClient(); + this.client.SendCredential = send_credential; + this.client.NodeJS_HTTPS_Client_Reject_Unauthorized = nodejs_https_client_reject_untrusted_server_cert; + } + + /** + * Call a single RPC call (without error check). You can wait for the response with Promise or await statement. + * @param method_name The name of RPC method + * @param param The parameters + */ + public async CallInternalAsync(method_name: string, param: any): Promise + { + let id = "1"; + + let req = new JsonRpcRequest(method_name, param, id); + + let req_string = JsonRpcClient.ObjectToJson(req); + + if (debug_mode) + { + console.log("--- RPC Request Body ---"); + console.log(req_string); + console.log("------------------------"); + } + + let http_response = await this.client.PostAsync(this.BaseUrl, this.headers, + req_string, "application/json"); + + let ret_string = http_response.Body; + + if (debug_mode) + { + console.log("--- RPC Response Body ---"); + console.log(ret_string); + console.log("-------------------------"); + } + + return ret_string; + } + + /** + * Call a single RPC call (with error check). You can wait for the response with Promise or await statement. In the case of error, it will be thrown. + * @param method_name The name of RPC method + * @param param The parameters + */ + public async CallAsync(method_name: string, param: any): Promise + { + let ret_string = await this.CallInternalAsync(method_name, param); + + let ret: JsonRpcResponse = JSON.parse(ret_string); + + if (is_null(ret.error) === false) + { + throw new JsonRpcException(ret.error); + } + + return ret.result; + } +} + +/** JSON-RPC exception class */ +export class JsonRpcException extends Error +{ + public Error: JsonRpcError; + + constructor(error: JsonRpcError) + { + super(`Code=${error.code}, Message=${error.message}`); + this.Error = error; + } +} + +/** HTTP client exception class */ +export class HttpClientException extends Error +{ + constructor(message: string) + { + super(message); + } +} + +/** HTTP client response class */ +export class HttpClientResponse +{ + public Body: string = ""; +} + +/** An HTTP client which can be used in both web browsers and Node.js */ +export class HttpClient +{ + public TimeoutMsecs: number = 60 * 5 * 1000; + public SendCredential: boolean = true; + public NodeJS_HTTPS_Client_Reject_Unauthorized: boolean = false; + + /** Post method. In web browsers this function will process the request by itself. In Node.js this function will call PostAsync_NodeJS() instead. */ + public async PostAsync(url: string, headers: { [name: string]: string }, + req_body: string, req_media_type: string): Promise + { + if (is_node_js) + { + return this.PostAsync_NodeJS(url, headers, req_body, req_media_type); + } + + let fetch_header_list = new Headers(); + + for (let name of Object.keys(headers)) + { + fetch_header_list.append(name, headers[name]); + } + + let fetch_init: RequestInit = + { + mode: "cors", + headers: fetch_header_list, + credentials: (this.SendCredential ? "include" : "omit"), + method: "POST", + cache: "no-cache", + keepalive: true, + redirect: "follow", + body: req_body, + }; + + let fetch_response = await fetch(url, fetch_init); + + if (fetch_response.ok === false) + { + throw new HttpClientException("HTTP Error: " + fetch_response.status + " " + fetch_response.statusText); + } + + let ret = new HttpClientResponse(); + + ret.Body = await fetch_response.text(); + + return ret; + } + + /** Post method for Node.js. */ + public PostAsync_NodeJS(url: string, headers: { [name: string]: string }, + req_body: string, req_media_type: string): Promise + { + const https = require("https"); + const keepAliveAgent = new https.Agent({ keepAlive: true }); + const urlparse = require("url"); + + const urlobj = urlparse.parse(url); + + if (is_null(urlobj.host)) throw new Error("URL is invalid."); + + let options = + { + host: urlobj.hostname, + port: urlobj.port, + path: urlobj.path, + rejectUnauthorized: this.NodeJS_HTTPS_Client_Reject_Unauthorized, + method: "POST", + timeout: this.TimeoutMsecs, + agent: keepAliveAgent, + }; + + return new Promise(function (resolve, reject) + { + let req = https.request(options, (res: any) => + { + if (res.statusCode !== 200) + { + reject(new HttpClientException("HTTP Error: " + res.statusCode + " " + res.statusMessage)); + } + + let recv_str: string = ""; + + res.on("data", (body: any) => + { + recv_str += body; + }); + + res.on("end", () => + { + let ret = new HttpClientResponse(); + + ret.Body = recv_str; + + resolve(ret); + }); + }).on("error", (err: any) => + { + throw err; + } + ); + + for (let name of Object.keys(headers)) + { + req.setHeader(name, !is_null(headers[name]) ? headers[name] : ""); + } + req.setHeader("Content-Type", req_media_type); + req.setHeader("Content-Length", Buffer.byteLength(req_body)); + req.write(req_body); + req.end(); + }); + } +} + + + + +//////// BEGIN: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js +// The MIT License(MIT) +// Copyright(c) 2014 +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +var lookup: any = []; +var revLookup: any = []; + +var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +for (var i = 0, len = code.length; i < len; ++i) +{ + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup["-".charCodeAt(0)] = 62; +revLookup["_".charCodeAt(0)] = 63; + +function getLens(b64: any) +{ + var len = b64.length; + + if (len % 4 > 0) + { + throw new Error("Invalid string. Length must be a multiple of 4"); + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf("="); + if (validLen === -1) validLen = len; + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4); + + return [validLen, placeHoldersLen]; +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength(b64: any) +{ + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen; +} + +function _byteLength(b64: any, validLen: any, placeHoldersLen: any) +{ + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen; +} + +export function Util_Base64_Decode(b64: any) +{ + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + + var arr = new Uint8Array(_byteLength(b64, validLen, placeHoldersLen)); + + var curByte = 0; + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen; + + for (var i = 0; i < len; i += 4) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)]; + arr[curByte++] = (tmp >> 16) & 0xFF; + arr[curByte++] = (tmp >> 8) & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 2) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4); + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 1) + { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2); + arr[curByte++] = (tmp >> 8) & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + return arr; +} + +function tripletToBase64(num: any) +{ + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F]; +} + +function encodeChunk(uint8: any, start: any, end: any) +{ + var tmp; + var output = []; + for (var i = start; i < end; i += 3) + { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF); + output.push(tripletToBase64(tmp)); + } + return output.join(""); +} + +export function Util_Base64_Encode(uint8: any) +{ + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) + { + parts.push(encodeChunk( + uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) + )); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) + { + tmp = uint8[len - 1]; + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + "==" + ); + } else if (extraBytes === 2) + { + tmp = (uint8[len - 2] << 8) + uint8[len - 1]; + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + "=" + ); + } + + return parts.join(""); +} +//////// END: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_test.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_test.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_test.txt 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_test.txt 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,48 @@ +// Test sample code for SoftEther VPN Server JSON-RPC Stub +// Runs on both web browsers and Node.js +// +// sample.ts +// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen +// +// This sample code shows how to call all available RPC functions. +// You can copy and paste test code to write your own web browser TypeScript / JavaScript codes. +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-__YEAR__ SoftEther VPN Project + +// On the web browser uncomment below imports as necessary to support old browsers. +// import "core-js/es6/promise"; +// import "core-js/es6/string"; +// import "whatwg-fetch"; + + +// Import the vpnrpc.ts RPC stub. +import * as VPN from "./vpnrpc"; + +// Output JSON-RPC request / reply strings to the debug console. +VPN.VpnServerRpc.SetDebugMode(true); + +let api: VPN.VpnServerRpc; +// Creating the VpnServerRpc class instance here. +if (VPN.VpnServerRpc.IsNodeJS() === false) // // Determine if this JavaScript environment is on the Node.js or not +{ + // On the web browser. We do not need to specify any hostname, port or credential as the web browser already knows it. + api = new VPN.VpnServerRpc(); +} +else +{ + // On the Node.js. We need to specify the target VPN Server's hostname, port and credential. + api = new VPN.VpnServerRpc("127.0.0.1", 443, "", "PASSWORD_HERE", false); +} + +// A variable for test +let hub_name = "test"; + +// Call the Test_All() function to test almost all VPN APIs. +Test_All(); + + + +__TESTS__ + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/vpnserver-jsonrpc-codegen.csproj softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/vpnserver-jsonrpc-codegen.csproj --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/vpnserver-jsonrpc-codegen.csproj 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/vpnserver-jsonrpc-codegen.csproj 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,35 @@ + + + + Exe + netcoreapp2.1 + VPNServer_JSONRPC_CodeGen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/vpnserver-jsonrpc-codegen.sln softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/vpnserver-jsonrpc-codegen.sln --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/vpnserver-jsonrpc-codegen.sln 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/vpnserver-jsonrpc-codegen.sln 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2041 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vpnserver-jsonrpc-codegen", "vpnserver-jsonrpc-codegen.csproj", "{00B41CF0-7AE9-4542-9970-77B312412535}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {00B41CF0-7AE9-4542-9970-77B312412535}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00B41CF0-7AE9-4542-9970-77B312412535}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00B41CF0-7AE9-4542-9970-77B312412535}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00B41CF0-7AE9-4542-9970-77B312412535}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EBB5B5A2-21A9-42A1-B4F4-7ED92CD8BBC1} + EndGlobalSection +EndGlobal diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/JsonRpc.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/JsonRpc.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/JsonRpc.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/JsonRpc.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,282 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// JsonRpc.cs - JSON-RPC Client Utility Functions +// +// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-__YEAR__ SoftEther VPN Project + +using System; +using System.IO; +using System.Net.Security; +using System.Net.Http; +using System.Collections.Generic; +using System.Text; +using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace SoftEther.JsonRpc +{ + /// + /// Internal utility class + /// + static class ClientUtil + { + public const int DefaultMaxDepth = 8; + + public static string NonNull(this string s) { if (s == null) return ""; else return s; } + public static bool IsEmpty(this string str) + { + if (str == null || str.Trim().Length == 0) + return true; + else + return false; + } + public static bool IsFilled(this string str) => !IsEmpty(str); + + public static string ObjectToJson(this object obj, bool include_null = false, bool escape_html = false, int? max_depth = ClientUtil.DefaultMaxDepth, bool compact = false, bool reference_handling = false) => ClientUtil.Serialize(obj, include_null, escape_html, max_depth, compact, reference_handling); + public static T JsonToObject(this string str, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) => ClientUtil.Deserialize(str, include_null, max_depth); + public static object JsonToObject(this string str, Type type, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) => ClientUtil.Deserialize(str, type, include_null, max_depth); + + public static string Serialize(object obj, bool include_null = false, bool escape_html = false, int? max_depth = ClientUtil.DefaultMaxDepth, bool compact = false, bool reference_handling = false) + { + JsonSerializerSettings setting = new JsonSerializerSettings() + { + MaxDepth = max_depth, + NullValueHandling = include_null ? NullValueHandling.Include : NullValueHandling.Ignore, + ReferenceLoopHandling = ReferenceLoopHandling.Error, + PreserveReferencesHandling = reference_handling ? PreserveReferencesHandling.All : PreserveReferencesHandling.None, + StringEscapeHandling = escape_html ? StringEscapeHandling.EscapeHtml : StringEscapeHandling.Default, + }; + return JsonConvert.SerializeObject(obj, compact ? Formatting.None : Formatting.Indented, setting); + } + + public static T Deserialize(string str, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) + => (T)Deserialize(str, typeof(T), include_null, max_depth); + + public static object Deserialize(string str, Type type, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) + { + JsonSerializerSettings setting = new JsonSerializerSettings() + { + MaxDepth = max_depth, + NullValueHandling = include_null ? NullValueHandling.Include : NullValueHandling.Ignore, + ObjectCreationHandling = ObjectCreationHandling.Replace, + ReferenceLoopHandling = ReferenceLoopHandling.Error, + }; + return JsonConvert.DeserializeObject(str, type, setting); + } + + public static void Print(this object o) + { + string str = o.ObjectToJson(); + + if (o is string) str = (string)o; + + Console.WriteLine(str); + } + } + + /// + /// JSON-RPC exception class + /// + class JsonRpcException : Exception + { + public JsonRpcError RpcError { get; } + public JsonRpcException(JsonRpcError err) + : base($"Code={err.Code}, Message={err.Message.NonNull()}" + + (err == null || err.Data == null ? "" : $", Data={err.Data.ObjectToJson(compact: true)}")) + { + this.RpcError = err; + } + } + + /// + /// JSON-RPC request class. See https://www.jsonrpc.org/specification + /// + class JsonRpcRequest + { + [JsonProperty("jsonrpc", Order = 1)] + public string Version { get; set; } = "2.0"; + + [JsonProperty("id", Order = 2)] + public string Id { get; set; } = null; + + [JsonProperty("method", Order = 3)] + public string Method { get; set; } = ""; + + [JsonProperty("params", Order = 4)] + public object Params { get; set; } = null; + + public JsonRpcRequest() { } + + public JsonRpcRequest(string method, object param, string id) + { + this.Method = method; + this.Params = param; + this.Id = id; + } + } + + /// + /// JSON-RPC response class with generics + /// + /// + class JsonRpcResponse + { + [JsonProperty("jsonrpc", Order = 1)] + public virtual string Version { get; set; } = "2.0"; + + [JsonProperty("id", NullValueHandling = NullValueHandling.Include, Order = 2)] + public virtual string Id { get; set; } = null; + + [JsonProperty("result", Order = 3)] + public virtual TResult Result { get; set; } = default(TResult); + + [JsonProperty("error", Order = 4)] + public virtual JsonRpcError Error { get; set; } = null; + + [JsonIgnore] + public virtual bool IsError => this.Error != null; + + [JsonIgnore] + public virtual bool IsOk => !IsError; + + public virtual void ThrowIfError() + { + if (this.IsError) throw new JsonRpcException(this.Error); + } + + public override string ToString() + { + return this.ObjectToJson(compact: true); + } + } + + /// + /// JSON-RPC error class. See https://www.jsonrpc.org/specification + /// + class JsonRpcError + { + public JsonRpcError() { } + public JsonRpcError(int code, string message, object data = null) + { + this.Code = code; + this.Message = message.NonNull(); + if (this.Message.IsEmpty()) this.Message = $"JSON-RPC Error {code}"; + this.Data = data; + } + + [JsonProperty("code")] + public int Code { get; set; } = 0; + + [JsonProperty("message")] + public string Message { get; set; } = null; + + [JsonProperty("data")] + public object Data { get; set; } = null; + } + + /// + /// JSON-RPC client. See https://www.jsonrpc.org/specification + /// + class JsonRpcClient + { + HttpClientHandler client_handler; + HttpClient client; + public const int DefaultTimeoutMsecs = 60 * 1000; + public int TimeoutMsecs { get => (int)client.Timeout.TotalMilliseconds; set => client.Timeout = new TimeSpan(0, 0, 0, 0, value); } + public Dictionary HttpHeaders { get; } = new Dictionary(); + + string base_url; + + /// + /// JSON-RPC client class constructor + /// + /// The URL + /// The SSL certificate validation callback + public JsonRpcClient(string url, Func cert_check_proc = null) + { + if (cert_check_proc == null) cert_check_proc = (message, cert, chain, errors) => true; + client_handler = new HttpClientHandler(); + + this.client_handler.AllowAutoRedirect = true; + this.client_handler.MaxAutomaticRedirections = 10; + + client_handler.ServerCertificateCustomValidationCallback = cert_check_proc; + + client = new HttpClient(client_handler, true); + //Console.WriteLine("new HttpClient(client_handler, true);"); + + this.base_url = url; + + this.TimeoutMsecs = DefaultTimeoutMsecs; + } + + /// + /// Call a single RPC call (without error check). You can wait for the response with Task or await statement. + /// + /// The name of RPC method + /// The parameters + public async Task CallInternalAsync(string method_name, object param) + { + string id = DateTime.Now.Ticks.ToString(); + + JsonRpcRequest req = new JsonRpcRequest(method_name, param, id); + + string req_string = req.ObjectToJson(); + + //Console.WriteLine($"req: {req_string}"); + + HttpContent content = new StringContent(req_string, Encoding.UTF8, "application/json"); + + foreach (string key in this.HttpHeaders.Keys) + { + string value = this.HttpHeaders[key]; + + content.Headers.Add(key, value); + } + + HttpResponseMessage response = await this.client.PostAsync(base_url, content); + + Stream responseStream = await response.Content.ReadAsStreamAsync(); + + if (!response.IsSuccessStatusCode) + { + using (StreamReader streamReader = new StreamReader(responseStream)) + { + throw new Exception($"Error: {response.StatusCode}: {await streamReader.ReadToEndAsync()}"); + } + } + + string ret_string; + + using (StreamReader streamReader = new StreamReader(responseStream)) + { + ret_string = await streamReader.ReadToEndAsync(); + } + + //Console.WriteLine($"ret: {ret_string}"); + + return ret_string; + } + + /// + /// Call a single RPC call (with error check). You can wait for the response with Promise or await statement. In the case of error, it will be thrown. + /// + /// The name of RPC method + /// The parameters + public async Task CallAsync(string method_name, object param) + { + string ret_string = await CallInternalAsync(method_name, param); + + JsonRpcResponse ret = ret_string.JsonToObject>(); + + ret.ThrowIfError(); + + return ret.Result; + } + } +} + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/VPNServerRpc.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/VPNServerRpc.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/VPNServerRpc.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/VPNServerRpc.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,1399 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// VPNServerRpc.cs - SoftEther VPN Server's JSON-RPC Stubs +// +// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-__YEAR__ SoftEther VPN Project + +using System.Threading.Tasks; +using SoftEther.JsonRpc; + +namespace SoftEther.VPNServerRpc +{ + /// + /// VPN Server RPC Stubs + /// + public class VpnServerRpc + { + JsonRpcClient rpc_client; + + /// + /// Constructor of the VpnServerRpc class + /// + /// The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + /// The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself. + /// Specify the administration password. This value is valid only if vpnserver_hostname is sepcified. + /// The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode. + public VpnServerRpc(string vpnserver_host, int vpnserver_port, string admin_password, string hub_name = null) + { + rpc_client = new JsonRpcClient($"https://{vpnserver_host}:{vpnserver_port}/api/", null); + + rpc_client.HttpHeaders.Add("X-VPNADMIN-HUBNAME", string.IsNullOrEmpty(hub_name) ? "" : hub_name); + rpc_client.HttpHeaders.Add("X-VPNADMIN-PASSWORD", admin_password); + } + + /// + /// Call a RPC procedure + /// + public async Task CallAsync(string method_name, T request) + { + T response = await rpc_client.CallAsync(method_name, request); + + return response; + } + + /// + /// Test RPC function (Async mode). Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. + /// + public async Task TestAsync(VpnRpcTest t) => await CallAsync("Test", t); + + /// + /// Test RPC function (Sync mode). Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field. + /// + public VpnRpcTest Test(VpnRpcTest t) => TestAsync(t).Result; + + /// + /// Get server information (Async mode). This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. + /// + public async Task GetServerInfoAsync() => await CallAsync("GetServerInfo", new VpnRpcServerInfo()); + + /// + /// Get server information (Sync mode). This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on. + /// + public VpnRpcServerInfo GetServerInfo() => GetServerInfoAsync().Result; + + /// + /// Get Current Server Status (Async mode). This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. + /// + public async Task GetServerStatusAsync() => await CallAsync("GetServerStatus", new VpnRpcServerStatus()); + + /// + /// Get Current Server Status (Sync mode). This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS. + /// + public VpnRpcServerStatus GetServerStatus() => GetServerStatusAsync().Result; + + /// + /// Create New TCP Listener (Async mode). This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. + /// + public async Task CreateListenerAsync(VpnRpcListener t) => await CallAsync("CreateListener", t); + + /// + /// Create New TCP Listener (Sync mode). This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges. + /// + public VpnRpcListener CreateListener(VpnRpcListener t) => CreateListenerAsync(t).Result; + + /// + /// Get List of TCP Listeners (Async mode). This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. + /// + public async Task EnumListenerAsync() => await CallAsync("EnumListener", new VpnRpcListenerList()); + + /// + /// Get List of TCP Listeners (Async mode). This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcListenerList EnumListener() => EnumListenerAsync().Result; + + /// + /// Delete TCP Listener (Async mode). This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task DeleteListenerAsync(VpnRpcListener t) => await CallAsync("DeleteListener", t); + + /// + /// Delete TCP Listener (Async mode). This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcListener DeleteListener(VpnRpcListener t) => DeleteListenerAsync(t).Result; + + /// + /// Enable / Disable TCP Listener (Async mode). This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task EnableListenerAsync(VpnRpcListener t) => await CallAsync("EnableListener", t); + + /// + /// Enable / Disable TCP Listener (Async mode). This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcListener EnableListener(VpnRpcListener t) => EnableListenerAsync(t).Result; + + /// + /// Set VPN Server Administrator Password (Async mode). This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. + /// + public async Task SetServerPasswordAsync(VpnRpcSetPassword t) => await CallAsync("SetServerPassword", t); + + /// + /// Set VPN Server Administrator Password (Async mode). This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcSetPassword SetServerPassword(VpnRpcSetPassword t) => SetServerPasswordAsync(t).Result; + + /// + /// Set the VPN Server clustering configuration (Async mode). Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. + /// + public async Task SetFarmSettingAsync(VpnRpcFarm t) => await CallAsync("SetFarmSetting", t); + + /// + /// Set the VPN Server clustering configuration (Async mode). Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge. + /// + public VpnRpcFarm SetFarmSetting(VpnRpcFarm t) => SetFarmSettingAsync(t).Result; + + /// + /// Get Clustering Configuration of Current VPN Server (Async mode). You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. + /// + public async Task GetFarmSettingAsync() => await CallAsync("GetFarmSetting", new VpnRpcFarm()); + + /// + /// Get Clustering Configuration of Current VPN Server (Async mode). You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcFarm GetFarmSetting() => GetFarmSettingAsync().Result; + + /// + /// Get Cluster Member Information (Async mode). When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. + /// + public async Task GetFarmInfoAsync(VpnRpcFarmInfo t) => await CallAsync("GetFarmInfo", t); + + /// + /// Get Cluster Member Information (Async mode). When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcFarmInfo GetFarmInfo(VpnRpcFarmInfo t) => GetFarmInfoAsync(t).Result; + + /// + /// Get List of Cluster Members (Async mode). Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. + /// + public async Task EnumFarmMemberAsync() => await CallAsync("EnumFarmMember", new VpnRpcEnumFarm()); + + /// + /// Get List of Cluster Members (Async mode). Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcEnumFarm EnumFarmMember() => EnumFarmMemberAsync().Result; + + /// + /// Get Connection Status to Cluster Controller (Async mode). Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. + /// + public async Task GetFarmConnectionStatusAsync() => await CallAsync("GetFarmConnectionStatus", new VpnRpcFarmConnectionStatus()); + + /// + /// Get Connection Status to Cluster Controller (Sync mode). Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcFarmConnectionStatus GetFarmConnectionStatus() => GetFarmConnectionStatusAsync().Result; + + /// + /// Set SSL Certificate and Private Key of VPN Server (Async mode). You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. + /// + public async Task SetServerCertAsync(VpnRpcKeyPair t) => await CallAsync("SetServerCert", t); + + /// + /// Set SSL Certificate and Private Key of VPN Server (Sync mode). You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcKeyPair SetServerCert(VpnRpcKeyPair t) => SetServerCertAsync(t).Result; + + /// + /// Get SSL Certificate and Private Key of VPN Server (Async mode). Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. + /// + public async Task GetServerCertAsync() => await CallAsync("GetServerCert", new VpnRpcKeyPair()); + + /// + /// Get SSL Certificate and Private Key of VPN Server (Async mode). Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcKeyPair GetServerCert() => GetServerCertAsync().Result; + + /// + /// Get the Encrypted Algorithm Used for VPN Communication (Async mode). Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. + /// + public async Task GetServerCipherAsync() => await CallAsync("GetServerCipher", new VpnRpcStr()); + + /// + /// Get the Encrypted Algorithm Used for VPN Communication (Async mode). Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server. + /// + public VpnRpcStr GetServerCipher() => GetServerCipherAsync().Result; + + /// + /// Set the Encrypted Algorithm Used for VPN Communication (Async mode). Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. + /// + public async Task SetServerCipherAsync(VpnRpcStr t) => await CallAsync("SetServerCipher", t); + + /// + /// Set the Encrypted Algorithm Used for VPN Communication (Async mode). Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcStr SetServerCipher(VpnRpcStr t) => SetServerCipherAsync(t).Result; + + /// + /// Create New Virtual Hub (Async mode). Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + /// + public async Task CreateHubAsync(VpnRpcCreateHub input_param) => await CallAsync("CreateHub", input_param); + + /// + /// Create New Virtual Hub (Async mode). Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + /// + public VpnRpcCreateHub CreateHub(VpnRpcCreateHub input_param) => CreateHubAsync(input_param).Result; + + /// + /// Set the Virtual Hub configuration (Async mode). You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. + /// + public async Task SetHubAsync(VpnRpcCreateHub input_param) => await CallAsync("SetHub", input_param); + + /// + /// Set the Virtual Hub configuration (Async mode). You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API. + /// + public VpnRpcCreateHub SetHub(VpnRpcCreateHub input_param) => SetHubAsync(input_param).Result; + + /// + /// Get the Virtual Hub configuration (Async mode). You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. + /// + public async Task GetHubAsync(VpnRpcCreateHub input_param) => await CallAsync("GetHub", input_param); + + /// + /// Get the Virtual Hub configuration (Async mode). You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API. + /// + public VpnRpcCreateHub GetHub(VpnRpcCreateHub input_param) => GetHubAsync(input_param).Result; + + /// + /// Get List of Virtual Hubs (Async mode). Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. + /// + public async Task EnumHubAsync() => await CallAsync("EnumHub", new VpnRpcEnumHub()); + + /// + /// Get List of Virtual Hubs (Async mode). Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed. + /// + public VpnRpcEnumHub EnumHub() => EnumHubAsync().Result; + + /// + /// Delete Virtual Hub (Async mode). Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + /// + public async Task DeleteHubAsync(VpnRpcDeleteHub input_param) => await CallAsync("DeleteHub", input_param); + + /// + /// Delete Virtual Hub (Async mode). Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member. + /// + public VpnRpcDeleteHub DeleteHub(VpnRpcDeleteHub input_param) => DeleteHubAsync(input_param).Result; + + /// + /// Get Setting of RADIUS Server Used for User Authentication (Async mode). Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetHubRadiusAsync(VpnRpcRadius input_param) => await CallAsync("GetHubRadius", input_param); + + /// + /// Get Setting of RADIUS Server Used for User Authentication (Async mode). Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcRadius GetHubRadius(VpnRpcRadius input_param) => GetHubRadiusAsync(input_param).Result; + + /// + /// Set RADIUS Server to use for User Authentication (Async mode). To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetHubRadiusAsync(VpnRpcRadius input_param) => await CallAsync("SetHubRadius", input_param); + + /// + /// Set RADIUS Server to use for User Authentication (Async mode). To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcRadius SetHubRadius(VpnRpcRadius input_param) => SetHubRadiusAsync(input_param).Result; + + /// + /// Get List of TCP Connections Connecting to the VPN Server (Async mode). Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. + /// + public async Task EnumConnectionAsync() => await CallAsync("EnumConnection", new VpnRpcEnumConnection()); + + /// + /// Get List of TCP Connections Connecting to the VPN Server (Async mode). Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcEnumConnection EnumConnection() => EnumConnectionAsync().Result; + + /// + /// Disconnect TCP Connections Connecting to the VPN Server (Async mode). Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. + /// + public async Task DisconnectConnectionAsync(VpnRpcDisconnectConnection input_param) => await CallAsync("DisconnectConnection", input_param); + + /// + /// Disconnect TCP Connections Connecting to the VPN Server (Async mode). Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcDisconnectConnection DisconnectConnection(VpnRpcDisconnectConnection input_param) => DisconnectConnectionAsync(input_param).Result; + + /// + /// Get Information of TCP Connections Connecting to the VPN Server (Async mode). Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. + /// + public async Task GetConnectionInfoAsync(VpnRpcConnectionInfo input_param) => await CallAsync("GetConnectionInfo", input_param); + + /// + /// Get Information of TCP Connections Connecting to the VPN Server (Async mode). Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcConnectionInfo GetConnectionInfo(VpnRpcConnectionInfo input_param) => GetConnectionInfoAsync(input_param).Result; + + /// + /// Switch Virtual Hub to Online or Offline (Async mode). Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetHubOnlineAsync(VpnRpcSetHubOnline input_param) => await CallAsync("SetHubOnline", input_param); + + /// + /// Switch Virtual Hub to Online or Offline (Async mode). Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcSetHubOnline SetHubOnline(VpnRpcSetHubOnline input_param) => SetHubOnlineAsync(input_param).Result; + + /// + /// Get Current Status of Virtual Hub (Async mode). Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. + /// + public async Task GetHubStatusAsync(VpnRpcHubStatus input_param) => await CallAsync("GetHubStatus", input_param); + + /// + /// Get Current Status of Virtual Hub (Async mode). Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data. + /// + public VpnRpcHubStatus GetHubStatus(VpnRpcHubStatus input_param) => GetHubStatusAsync(input_param).Result; + + /// + /// Set the logging configuration of the Virtual Hub (Async mode). Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. + /// + public async Task SetHubLogAsync(VpnRpcHubLog input_param) => await CallAsync("SetHubLog", input_param); + + /// + /// Set the logging configuration of the Virtual Hub (Async mode). Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API. + /// + public VpnRpcHubLog SetHubLog(VpnRpcHubLog input_param) => SetHubLogAsync(input_param).Result; + + /// + /// Get the logging configuration of the Virtual Hub (Async mode). Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. + /// + public async Task GetHubLogAsync(VpnRpcHubLog input_param) => await CallAsync("GetHubLog", input_param); + + /// + /// Get the logging configuration of the Virtual Hub (Async mode). Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API. + /// + public VpnRpcHubLog GetHubLog(VpnRpcHubLog input_param) => GetHubLogAsync(input_param).Result; + + /// + /// Add Trusted CA Certificate (Async mode). Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task AddCaAsync(VpnRpcHubAddCA input_param) => await CallAsync("AddCa", input_param); + + /// + /// Add Trusted CA Certificate (Async mode). Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcHubAddCA AddCa(VpnRpcHubAddCA input_param) => AddCaAsync(input_param).Result; + + /// + /// Get List of Trusted CA Certificates (Async mode). Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task EnumCaAsync(VpnRpcHubEnumCA input_param) => await CallAsync("EnumCa", input_param); + + /// + /// Get List of Trusted CA Certificates (Async mode). Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcHubEnumCA EnumCa(VpnRpcHubEnumCA input_param) => EnumCaAsync(input_param).Result; + + /// + /// Get Trusted CA Certificate (Async mode). Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task GetCaAsync(VpnRpcHubGetCA input_param) => await CallAsync("GetCa", input_param); + + /// + /// Get Trusted CA Certificate (Async mode). Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcHubGetCA GetCa(VpnRpcHubGetCA input_param) => GetCaAsync(input_param).Result; + + /// + /// Delete Trusted CA Certificate (Async mode). Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task DeleteCaAsync(VpnRpcHubDeleteCA input_param) => await CallAsync("DeleteCa", input_param); + + /// + /// Delete Trusted CA Certificate (Async mode). Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcHubDeleteCA DeleteCa(VpnRpcHubDeleteCA input_param) => DeleteCaAsync(input_param).Result; + + /// + /// Create New Cascade Connection (Async mode). Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task CreateLinkAsync(VpnRpcCreateLink input_param) => await CallAsync("CreateLink", input_param); + + /// + /// Create New Cascade Connection (Async mode). Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCreateLink CreateLink(VpnRpcCreateLink input_param) => CreateLinkAsync(input_param).Result; + + /// + /// Get the Cascade Connection Setting (Async mode). Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetLinkAsync(VpnRpcCreateLink input_param) => await CallAsync("GetLink", input_param); + + /// + /// Get the Cascade Connection Setting (Async mode). Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCreateLink GetLink(VpnRpcCreateLink input_param) => GetLinkAsync(input_param).Result; + + /// + /// Change Existing Cascade Connection (Async mode). Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. + /// + public async Task SetLinkAsync(VpnRpcCreateLink input_param) => await CallAsync("SetLink", input_param); + + /// + /// Change Existing Cascade Connection (Async mode). Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub. + /// + public VpnRpcCreateLink SetLink(VpnRpcCreateLink input_param) => SetLinkAsync(input_param).Result; + + /// + /// Get List of Cascade Connections (Async mode). Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumLinkAsync(VpnRpcEnumLink input_param) => await CallAsync("EnumLink", input_param); + + /// + /// Get List of Cascade Connections (Async mode). Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumLink EnumLink(VpnRpcEnumLink input_param) => EnumLinkAsync(input_param).Result; + + /// + /// Switch Cascade Connection to Online Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetLinkOnlineAsync(VpnRpcLink input_param) => await CallAsync("SetLinkOnline", input_param); + + /// + /// Switch Cascade Connection to Online Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcLink SetLinkOnline(VpnRpcLink input_param) => SetLinkOnlineAsync(input_param).Result; + + /// + /// Switch Cascade Connection to Offline Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetLinkOfflineAsync(VpnRpcLink input_param) => await CallAsync("SetLinkOffline", input_param); + + /// + /// Switch Cascade Connection to Offline Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcLink SetLinkOffline(VpnRpcLink input_param) => SetLinkOfflineAsync(input_param).Result; + + /// + /// Delete Cascade Connection Setting (Async mode). Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task DeleteLinkAsync(VpnRpcLink input_param) => await CallAsync("DeleteLink", input_param); + + /// + /// Delete Cascade Connection Setting (Async mode). Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcLink DeleteLink(VpnRpcLink input_param) => DeleteLinkAsync(input_param).Result; + + /// + /// Change Name of Cascade Connection (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task RenameLinkAsync(VpnRpcRenameLink input_param) => await CallAsync("RenameLink", input_param); + + /// + /// Change Name of Cascade Connection (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcRenameLink RenameLink(VpnRpcRenameLink input_param) => RenameLinkAsync(input_param).Result; + + /// + /// Get Current Cascade Connection Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetLinkStatusAsync(VpnRpcLinkStatus input_param) => await CallAsync("GetLinkStatus", input_param); + + /// + /// Get Current Cascade Connection Status (Async mode). When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcLinkStatus GetLinkStatus(VpnRpcLinkStatus input_param) => GetLinkStatusAsync(input_param).Result; + + /// + /// Add Access List Rule (Async mode). Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task AddAccessAsync(VpnRpcAddAccess input_param) => await CallAsync("AddAccess", input_param); + + /// + /// Add Access List Rule (Async mode). Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcAddAccess AddAccess(VpnRpcAddAccess input_param) => AddAccessAsync(input_param).Result; + + /// + /// Delete Rule from Access List (Async mode). Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task DeleteAccessAsync(VpnRpcDeleteAccess input_param) => await CallAsync("DeleteAccess", input_param); + + /// + /// Delete Rule from Access List (Async mode). Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcDeleteAccess DeleteAccess(VpnRpcDeleteAccess input_param) => DeleteAccessAsync(input_param).Result; + + /// + /// Get Access List Rule List (Async mode). Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task EnumAccessAsync(VpnRpcEnumAccessList input_param) => await CallAsync("EnumAccess", input_param); + + /// + /// Get Access List Rule List (Async mode). Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcEnumAccessList EnumAccess(VpnRpcEnumAccessList input_param) => EnumAccessAsync(input_param).Result; + + /// + /// Replace all access lists on a single bulk API call (Async mode). This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. + /// + public async Task SetAccessListAsync(VpnRpcEnumAccessList input_param) => await CallAsync("SetAccessList", input_param); + + /// + /// Replace all access lists on a single bulk API call (Async mode). This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter. + /// + public VpnRpcEnumAccessList SetAccessList(VpnRpcEnumAccessList input_param) => SetAccessListAsync(input_param).Result; + + /// + /// Create a user (Async mode). Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task CreateUserAsync(VpnRpcSetUser input_param) => await CallAsync("CreateUser", input_param); + + /// + /// Create a user (Async mode). Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "*" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "*" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetUser CreateUser(VpnRpcSetUser input_param) => CreateUserAsync(input_param).Result; + + /// + /// Change User Settings (Async mode). Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task SetUserAsync(VpnRpcSetUser input_param) => await CallAsync("SetUser", input_param); + + /// + /// Change User Settings (Async mode). Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetUser SetUser(VpnRpcSetUser input_param) => SetUserAsync(input_param).Result; + + /// + /// Get User Settings (Async mode). Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task GetUserAsync(VpnRpcSetUser input_param) => await CallAsync("GetUser", input_param); + + /// + /// Get User Settings (Async mode). Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetUser GetUser(VpnRpcSetUser input_param) => GetUserAsync(input_param).Result; + + /// + /// Delete a user (Async mode). Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task DeleteUserAsync(VpnRpcDeleteUser input_param) => await CallAsync("DeleteUser", input_param); + + /// + /// Delete a user (Sync mode). Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcDeleteUser DeleteUser(VpnRpcDeleteUser input_param) => DeleteUserAsync(input_param).Result; + + /// + /// Get List of Users (Async mode). Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task EnumUserAsync(VpnRpcEnumUser input_param) => await CallAsync("EnumUser", input_param); + + /// + /// Get List of Users (Async mode). Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcEnumUser EnumUser(VpnRpcEnumUser input_param) => EnumUserAsync(input_param).Result; + + /// + /// Create Group (Async mode). Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task CreateGroupAsync(VpnRpcSetGroup input_param) => await CallAsync("CreateGroup", input_param); + + /// + /// Create Group (Async mode). Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetGroup CreateGroup(VpnRpcSetGroup input_param) => CreateGroupAsync(input_param).Result; + + /// + /// Set group settings (Async mode). Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task SetGroupAsync(VpnRpcSetGroup input_param) => await CallAsync("SetGroup", input_param); + + /// + /// Set group settings (Async mode). Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetGroup SetGroup(VpnRpcSetGroup input_param) => SetGroupAsync(input_param).Result; + + /// + /// Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task GetGroupAsync(VpnRpcSetGroup input_param) => await CallAsync("GetGroup", input_param); + + /// + /// Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcSetGroup GetGroup(VpnRpcSetGroup input_param) => GetGroupAsync(input_param).Result; + + /// + /// Delete User from Group (Async mode). Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task DeleteGroupAsync(VpnRpcDeleteUser input_param) => await CallAsync("DeleteGroup", input_param); + + /// + /// Delete User from Group (Async mode). Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcDeleteUser DeleteGroup(VpnRpcDeleteUser input_param) => DeleteGroupAsync(input_param).Result; + + /// + /// Get List of Groups (Async mode). Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public async Task EnumGroupAsync(VpnRpcEnumGroup input_param) => await CallAsync("EnumGroup", input_param); + + /// + /// Get List of Groups (Async mode). Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster. + /// + public VpnRpcEnumGroup EnumGroup(VpnRpcEnumGroup input_param) => EnumGroupAsync(input_param).Result; + + /// + /// Get List of Connected VPN Sessions (Async mode). Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. + /// + public async Task EnumSessionAsync(VpnRpcEnumSession input_param) => await CallAsync("EnumSession", input_param); + + /// + /// Get List of Connected VPN Sessions (Async mode). Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained. + /// + public VpnRpcEnumSession EnumSession(VpnRpcEnumSession input_param) => EnumSessionAsync(input_param).Result; + + /// + /// Get Session Status (Async mode). Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. + /// + public async Task GetSessionStatusAsync(VpnRpcSessionStatus input_param) => await CallAsync("GetSessionStatus", input_param); + + /// + /// Get Session Status (Async mode). Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API. + /// + public VpnRpcSessionStatus GetSessionStatus(VpnRpcSessionStatus input_param) => GetSessionStatusAsync(input_param).Result; + + /// + /// Disconnect Session (Async mode). Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. + /// + public async Task DeleteSessionAsync(VpnRpcDeleteSession input_param) => await CallAsync("DeleteSession", input_param); + + /// + /// Disconnect Session (Async mode). Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API. + /// + public VpnRpcDeleteSession DeleteSession(VpnRpcDeleteSession input_param) => DeleteSessionAsync(input_param).Result; + + /// + /// Get the MAC Address Table Database (Async mode). Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. + /// + public async Task EnumMacTableAsync(VpnRpcEnumMacTable input_param) => await CallAsync("EnumMacTable", input_param); + + /// + /// Get the MAC Address Table Database (Async mode). Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication. + /// + public VpnRpcEnumMacTable EnumMacTable(VpnRpcEnumMacTable input_param) => EnumMacTableAsync(input_param).Result; + + /// + /// Delete MAC Address Table Entry (Async mode). Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. + /// + public async Task DeleteMacTableAsync(VpnRpcDeleteTable input_param) => await CallAsync("DeleteMacTable", input_param); + + /// + /// Delete MAC Address Table Entry (Async mode). Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API. + /// + public VpnRpcDeleteTable DeleteMacTable(VpnRpcDeleteTable input_param) => DeleteMacTableAsync(input_param).Result; + + /// + /// Get the IP Address Table Database (Async mode). Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. + /// + public async Task EnumIpTableAsync(VpnRpcEnumIpTable input_param) => await CallAsync("EnumIpTable", input_param); + + /// + /// Get the IP Address Table Database (Async mode). Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session. + /// + public VpnRpcEnumIpTable EnumIpTable(VpnRpcEnumIpTable input_param) => EnumIpTableAsync(input_param).Result; + + /// + /// Delete IP Address Table Entry (Async mode). Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. + /// + public async Task DeleteIpTableAsync(VpnRpcDeleteTable input_param) => await CallAsync("DeleteIpTable", input_param); + + /// + /// Delete IP Address Table Entry (Async mode). Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API. + /// + public VpnRpcDeleteTable DeleteIpTable(VpnRpcDeleteTable input_param) => DeleteIpTableAsync(input_param).Result; + + /// + /// Set the Keep Alive Internet Connection Function (Async mode). Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. + /// + public async Task SetKeepAsync(VpnRpcKeep input_param) => await CallAsync("SetKeep", input_param); + + /// + /// Set the Keep Alive Internet Connection Function (Async mode). Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges. + /// + public VpnRpcKeep SetKeep(VpnRpcKeep input_param) => SetKeepAsync(input_param).Result; + + /// + /// Get the Keep Alive Internet Connection Function (Async mode). Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. + /// + public async Task GetKeepAsync(VpnRpcKeep input_param) => await CallAsync("GetKeep", input_param); + + /// + /// Get the Keep Alive Internet Connection Function (Async mode). Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function. + /// + public VpnRpcKeep GetKeep(VpnRpcKeep input_param) => GetKeepAsync(input_param).Result; + + /// + /// Enable the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnableSecureNATAsync(VpnRpcHub input_param) => await CallAsync("EnableSecureNAT", input_param); + + /// + /// Enable the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcHub EnableSecureNAT(VpnRpcHub input_param) => EnableSecureNATAsync(input_param).Result; + + /// + /// Disable the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task DisableSecureNATAsync(VpnRpcHub input_param) => await CallAsync("DisableSecureNAT", input_param); + + /// + /// Disable the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcHub DisableSecureNAT(VpnRpcHub input_param) => DisableSecureNATAsync(input_param).Result; + + /// + /// Change Settings of SecureNAT Function (Async mode). Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetSecureNATOptionAsync(VpnVhOption input_param) => await CallAsync("SetSecureNATOption", input_param); + + /// + /// Change Settings of SecureNAT Function (Async mode). Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnVhOption SetSecureNATOption(VpnVhOption input_param) => SetSecureNATOptionAsync(input_param).Result; + + /// + /// Get Settings of SecureNAT Function (Async mode). This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. + /// + public async Task GetSecureNATOptionAsync(VpnVhOption input_param) => await CallAsync("GetSecureNATOption", input_param); + + /// + /// Get Settings of SecureNAT Function (Async mode). This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API. + /// + public VpnVhOption GetSecureNATOption(VpnVhOption input_param) => GetSecureNATOptionAsync(input_param).Result; + + /// + /// Get Virtual NAT Function Session Table of SecureNAT Function (Async mode). Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumNATAsync(VpnRpcEnumNat input_param) => await CallAsync("EnumNAT", input_param); + + /// + /// Get Virtual NAT Function Session Table of SecureNAT Function (Async mode). Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumNat EnumNAT(VpnRpcEnumNat input_param) => EnumNATAsync(input_param).Result; + + /// + /// Get Virtual DHCP Server Function Lease Table of SecureNAT Function (Async mode). Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumDHCPAsync(VpnRpcEnumDhcp input_param) => await CallAsync("EnumDHCP", input_param); + + /// + /// Get Virtual DHCP Server Function Lease Table of SecureNAT Function (Async mode). Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumDhcp EnumDHCP(VpnRpcEnumDhcp input_param) => EnumDHCPAsync(input_param).Result; + + /// + /// Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetSecureNATStatusAsync(VpnRpcNatStatus input_param) => await CallAsync("GetSecureNATStatus", input_param); + + /// + /// Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function) (Async mode). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcNatStatus GetSecureNATStatus(VpnRpcNatStatus input_param) => GetSecureNATStatusAsync(input_param).Result; + + /// + /// Get List of Network Adapters Usable as Local Bridge (Async mode). Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task EnumEthernetAsync() => await CallAsync("EnumEthernet", new VpnRpcEnumEth()); + + /// + /// Get List of Network Adapters Usable as Local Bridge (Async mode). Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcEnumEth EnumEthernet() => EnumEthernetAsync().Result; + + /// + /// Create Local Bridge Connection (Async mode). Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. + /// + public async Task AddLocalBridgeAsync(VpnRpcLocalBridge input_param) => await CallAsync("AddLocalBridge", input_param); + + /// + /// Create Local Bridge Connection (Async mode). Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcLocalBridge AddLocalBridge(VpnRpcLocalBridge input_param) => AddLocalBridgeAsync(input_param).Result; + + /// + /// Delete Local Bridge Connection (Async mode). Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task DeleteLocalBridgeAsync(VpnRpcLocalBridge input_param) => await CallAsync("DeleteLocalBridge", input_param); + + /// + /// Delete Local Bridge Connection (Async mode). Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcLocalBridge DeleteLocalBridge(VpnRpcLocalBridge input_param) => DeleteLocalBridgeAsync(input_param).Result; + + /// + /// Get List of Local Bridge Connection (Async mode). Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. + /// + public async Task EnumLocalBridgeAsync() => await CallAsync("EnumLocalBridge", new VpnRpcEnumLocalBridge()); + + /// + /// Get List of Local Bridge Connection (Async mode). Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status. + /// + public VpnRpcEnumLocalBridge EnumLocalBridge() => EnumLocalBridgeAsync().Result; + + /// + /// Get whether the localbridge function is supported on the current system (Async mode). + /// + public async Task GetBridgeSupportAsync() => await CallAsync("GetBridgeSupport", new VpnRpcBridgeSupport()); + + /// + /// Get whether the localbridge function is supported on the current system (Async mode). + /// + public VpnRpcBridgeSupport GetBridgeSupport() => GetBridgeSupportAsync().Result; + + /// + /// Reboot VPN Server Service (Async mode). Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. + /// + public async Task RebootServerAsync(VpnRpcTest input_param) => await CallAsync("RebootServer", input_param); + + /// + /// Reboot VPN Server Service (Async mode). Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcTest RebootServer(VpnRpcTest input_param) => RebootServerAsync(input_param).Result; + + /// + /// Get List of Server Functions / Capability (Async mode). Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. + /// + public async Task GetCapsAsync() => await CallAsync("GetCaps", new VpnCapslist()); + + /// + /// Get List of Server Functions / Capability (Async mode). Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it. + /// + public VpnCapslist GetCaps() => GetCapsAsync().Result; + + /// + /// Get the current configuration of the VPN Server (Async mode). Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task GetConfigAsync() => await CallAsync("GetConfig", new VpnRpcConfig()); + + /// + /// Get the current configuration of the VPN Server (Async mode). Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcConfig GetConfig() => GetConfigAsync().Result; + + /// + /// Write Configuration File to VPN Server (Async mode). Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. + /// + public async Task SetConfigAsync(VpnRpcConfig input_param) => await CallAsync("SetConfig", input_param); + + /// + /// Write Configuration File to VPN Server (Async mode). Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcConfig SetConfig(VpnRpcConfig input_param) => SetConfigAsync(input_param).Result; + + /// + /// Get Virtual Hub Administration Option default values (Async mode). + /// + public async Task GetDefaultHubAdminOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("GetDefaultHubAdminOptions", input_param); + + /// + /// Get Virtual Hub Administration Option default values (Async mode). + /// + public VpnRpcAdminOption GetDefaultHubAdminOptions(VpnRpcAdminOption input_param) => GetDefaultHubAdminOptionsAsync(input_param).Result; + + /// + /// Get List of Virtual Hub Administration Options (Async mode). Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public async Task GetHubAdminOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("GetHubAdminOptions", input_param); + + /// + /// Get List of Virtual Hub Administration Options (Async mode). Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public VpnRpcAdminOption GetHubAdminOptions(VpnRpcAdminOption input_param) => GetHubAdminOptionsAsync(input_param).Result; + + /// + /// Set Values of Virtual Hub Administration Options (Async mode). Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public async Task SetHubAdminOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("SetHubAdminOptions", input_param); + + /// + /// Set Values of Virtual Hub Administration Options (Async mode). Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public VpnRpcAdminOption SetHubAdminOptions(VpnRpcAdminOption input_param) => SetHubAdminOptionsAsync(input_param).Result; + + /// + /// Get List of Virtual Hub Extended Options (Async mode). Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public async Task GetHubExtOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("GetHubExtOptions", input_param); + + /// + /// Get List of Virtual Hub Extended Options (Async mode). Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public VpnRpcAdminOption GetHubExtOptions(VpnRpcAdminOption input_param) => GetHubExtOptionsAsync(input_param).Result; + + /// + /// Set a Value of Virtual Hub Extended Options (Async mode). Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public async Task SetHubExtOptionsAsync(VpnRpcAdminOption input_param) => await CallAsync("SetHubExtOptions", input_param); + + /// + /// Set a Value of Virtual Hub Extended Options (Async mode). Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member. + /// + public VpnRpcAdminOption SetHubExtOptions(VpnRpcAdminOption input_param) => SetHubExtOptionsAsync(input_param).Result; + + /// + /// Define New Virtual Layer 3 Switch (Async mode). Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public async Task AddL3SwitchAsync(VpnRpcL3Sw input_param) => await CallAsync("AddL3Switch", input_param); + + /// + /// Define New Virtual Layer 3 Switch (Async mode). Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public VpnRpcL3Sw AddL3Switch(VpnRpcL3Sw input_param) => AddL3SwitchAsync(input_param).Result; + + /// + /// Delete Virtual Layer 3 Switch (Async mode). Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public async Task DelL3SwitchAsync(VpnRpcL3Sw input_param) => await CallAsync("DelL3Switch", input_param); + + /// + /// Delete Virtual Layer 3 Switch (Async mode). Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public VpnRpcL3Sw DelL3Switch(VpnRpcL3Sw input_param) => DelL3SwitchAsync(input_param).Result; + + /// + /// Get List of Virtual Layer 3 Switches (Async mode). Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public async Task EnumL3SwitchAsync() => await CallAsync("EnumL3Switch", new VpnRpcEnumL3Sw()); + + /// + /// Get List of Virtual Layer 3 Switches (Async mode). Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public VpnRpcEnumL3Sw EnumL3Switch() => EnumL3SwitchAsync().Result; + + /// + /// Start Virtual Layer 3 Switch Operation (Async mode). Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public async Task StartL3SwitchAsync(VpnRpcL3Sw input_param) => await CallAsync("StartL3Switch", input_param); + + /// + /// Start Virtual Layer 3 Switch Operation (Async mode). Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network. + /// + public VpnRpcL3Sw StartL3Switch(VpnRpcL3Sw input_param) => StartL3SwitchAsync(input_param).Result; + + /// + /// Stop Virtual Layer 3 Switch Operation (Async mode). Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. + /// + public async Task StopL3SwitchAsync(VpnRpcL3Sw input_param) => await CallAsync("StopL3Switch", input_param); + + /// + /// Stop Virtual Layer 3 Switch Operation (Async mode). Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. + /// + public VpnRpcL3Sw StopL3Switch(VpnRpcL3Sw input_param) => StopL3SwitchAsync(input_param).Result; + + /// + /// Add Virtual Interface to Virtual Layer 3 Switch (Async mode). Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public async Task AddL3IfAsync(VpnRpcL3If input_param) => await CallAsync("AddL3If", input_param); + + /// + /// Add Virtual Interface to Virtual Layer 3 Switch (Async mode). Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public VpnRpcL3If AddL3If(VpnRpcL3If input_param) => AddL3IfAsync(input_param).Result; + + /// + /// Delete Virtual Interface of Virtual Layer 3 Switch (Async mode). Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public async Task DelL3IfAsync(VpnRpcL3If input_param) => await CallAsync("DelL3If", input_param); + + /// + /// Delete Virtual Interface of Virtual Layer 3 Switch (Async mode). Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public VpnRpcL3If DelL3If(VpnRpcL3If input_param) => DelL3IfAsync(input_param).Result; + + /// + /// Get List of Interfaces Registered on the Virtual Layer 3 Switch (Async mode). Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public async Task EnumL3IfAsync(VpnRpcEnumL3If input_param) => await CallAsync("EnumL3If", input_param); + + /// + /// Get List of Interfaces Registered on the Virtual Layer 3 Switch (Async mode). Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public VpnRpcEnumL3If EnumL3If(VpnRpcEnumL3If input_param) => EnumL3IfAsync(input_param).Result; + + /// + /// Add Routing Table Entry for Virtual Layer 3 Switch (Async mode). Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public async Task AddL3TableAsync(VpnRpcL3Table input_param) => await CallAsync("AddL3Table", input_param); + + /// + /// Add Routing Table Entry for Virtual Layer 3 Switch (Async mode). Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public VpnRpcL3Table AddL3Table(VpnRpcL3Table input_param) => AddL3TableAsync(input_param).Result; + + /// + /// Delete Routing Table Entry of Virtual Layer 3 Switch (Async mode). Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public async Task DelL3TableAsync(VpnRpcL3Table input_param) => await CallAsync("DelL3Table", input_param); + + /// + /// Delete Routing Table Entry of Virtual Layer 3 Switch (Async mode). Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API. + /// + public VpnRpcL3Table DelL3Table(VpnRpcL3Table input_param) => DelL3TableAsync(input_param).Result; + + /// + /// Get List of Routing Tables of Virtual Layer 3 Switch (Async mode). Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public async Task EnumL3TableAsync(VpnRpcEnumL3Table input_param) => await CallAsync("EnumL3Table", input_param); + + /// + /// Get List of Routing Tables of Virtual Layer 3 Switch (Async mode). Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. + /// + public VpnRpcEnumL3Table EnumL3Table(VpnRpcEnumL3Table input_param) => EnumL3TableAsync(input_param).Result; + + /// + /// Get List of Certificates Revocation List (Async mode). Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumCrlAsync(VpnRpcEnumCrl input_param) => await CallAsync("EnumCrl", input_param); + + /// + /// Get List of Certificates Revocation List (Async mode). Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumCrl EnumCrl(VpnRpcEnumCrl input_param) => EnumCrlAsync(input_param).Result; + + /// + /// Add a Revoked Certificate (Async mode). Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task AddCrlAsync(VpnRpcCrl input_param) => await CallAsync("AddCrl", input_param); + + /// + /// Add a Revoked Certificate (Async mode). Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCrl AddCrl(VpnRpcCrl input_param) => AddCrlAsync(input_param).Result; + + /// + /// Delete a Revoked Certificate (Async mode). Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task DelCrlAsync(VpnRpcCrl input_param) => await CallAsync("DelCrl", input_param); + + /// + /// Delete a Revoked Certificate (Async mode). Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCrl DelCrl(VpnRpcCrl input_param) => DelCrlAsync(input_param).Result; + + /// + /// Get a Revoked Certificate (Async mode). Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetCrlAsync(VpnRpcCrl input_param) => await CallAsync("GetCrl", input_param); + + /// + /// Get a Revoked Certificate (Async mode). Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCrl GetCrl(VpnRpcCrl input_param) => GetCrlAsync(input_param).Result; + + /// + /// Change Existing CRL (Certificate Revocation List) Entry (Async mode). Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetCrlAsync(VpnRpcCrl input_param) => await CallAsync("SetCrl", input_param); + + /// + /// Change Existing CRL (Certificate Revocation List) Entry (Async mode). Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcCrl SetCrl(VpnRpcCrl input_param) => SetCrlAsync(input_param).Result; + + /// + /// Add Rule to Source IP Address Limit List (Async mode). Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetAcListAsync(VpnRpcAcList input_param) => await CallAsync("SetAcList", input_param); + + /// + /// Add Rule to Source IP Address Limit List (Async mode). Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcAcList SetAcList(VpnRpcAcList input_param) => SetAcListAsync(input_param).Result; + + /// + /// Get List of Rule Items of Source IP Address Limit List (Async mode). Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetAcListAsync(VpnRpcAcList input_param) => await CallAsync("GetAcList", input_param); + + /// + /// Get List of Rule Items of Source IP Address Limit List (Async mode). Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcAcList GetAcList(VpnRpcAcList input_param) => GetAcListAsync(input_param).Result; + + /// + /// Get List of Log Files (Async mode). Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + /// + public async Task EnumLogFileAsync() => await CallAsync("EnumLogFile", new VpnRpcEnumLogFile()); + + /// + /// Get List of Log Files (Async mode). Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + /// + public VpnRpcEnumLogFile EnumLogFile() => EnumLogFileAsync().Result; + + /// + /// Download a part of Log File (Async mode). Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + /// + public async Task ReadLogFileAsync(VpnRpcReadLogFile input_param) => await CallAsync("ReadLogFile", input_param); + + /// + /// Download a part of Log File (Async mode). Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management. + /// + public VpnRpcReadLogFile ReadLogFile(VpnRpcReadLogFile input_param) => ReadLogFileAsync(input_param).Result; + + /// + /// Set syslog Send Function (Async mode). Use this to set the usage of syslog send function and which syslog server to use. + /// + public async Task SetSysLogAsync(VpnSyslogSetting input_param) => await CallAsync("SetSysLog", input_param); + + /// + /// Set syslog Send Function (Async mode). Use this to set the usage of syslog send function and which syslog server to use. + /// + public VpnSyslogSetting SetSysLog(VpnSyslogSetting input_param) => SetSysLogAsync(input_param).Result; + + /// + /// Get syslog Send Function (Async mode). This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. + /// + public async Task GetSysLogAsync(VpnSyslogSetting input_param) => await CallAsync("GetSysLog", input_param); + + /// + /// Get syslog Send Function (Async mode). This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use. + /// + public VpnSyslogSetting GetSysLog(VpnSyslogSetting input_param) => GetSysLogAsync(input_param).Result; + + /// + /// Set Today's Message of Virtual Hub (Async mode). The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + /// + public async Task SetHubMsgAsync(VpnRpcMsg input_param) => await CallAsync("SetHubMsg", input_param); + + /// + /// Set Today's Message of Virtual Hub (Async mode). The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + /// + public VpnRpcMsg SetHubMsg(VpnRpcMsg input_param) => SetHubMsgAsync(input_param).Result; + + /// + /// Get Today's Message of Virtual Hub (Async mode). The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + /// + public async Task GetHubMsgAsync(VpnRpcMsg input_param) => await CallAsync("GetHubMsg", input_param); + + /// + /// Get Today's Message of Virtual Hub (Async mode). The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub. + /// + public VpnRpcMsg GetHubMsg(VpnRpcMsg input_param) => GetHubMsgAsync(input_param).Result; + + /// + /// Raise a vital error on the VPN Server / Bridge to terminate the process forcefully (Async mode). This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + /// + public async Task CrashAsync(VpnRpcTest input_param) => await CallAsync("Crash", input_param); + + /// + /// Raise a vital error on the VPN Server / Bridge to terminate the process forcefully (Async mode). This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + /// + public VpnRpcTest Crash(VpnRpcTest input_param) => CrashAsync(input_param).Result; + + /// + /// Get the message for administrators (Async mode). + /// + public async Task GetAdminMsgAsync() => await CallAsync("GetAdminMsg", new VpnRpcMsg()); + + /// + /// Get message for administrators (Sync mode) + /// + public VpnRpcMsg GetAdminMsg() => GetAdminMsgAsync().Result; + + /// + /// Save All Volatile Data of VPN Server / Bridge to the Configuration File (Async mode). The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + /// + public async Task FlushAsync(VpnRpcTest input_param) => await CallAsync("Flush", input_param); + + /// + /// Save All Volatile Data of VPN Server / Bridge to the Configuration File (Sync mode). The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges. + /// + public VpnRpcTest Flush(VpnRpcTest input_param) => FlushAsync(input_param).Result; + + /// + /// Enable or Disable IPsec VPN Server Function (Async mode). Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetIPsecServicesAsync(VpnIPsecServices input_param) => await CallAsync("SetIPsecServices", input_param); + + /// + /// Enable or Disable IPsec VPN Server Function (Async mode). Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnIPsecServices SetIPsecServices(VpnIPsecServices input_param) => SetIPsecServicesAsync(input_param).Result; + + /// + /// Get the Current IPsec VPN Server Settings (Async mode). Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetIPsecServicesAsync() => await CallAsync("GetIPsecServices", new VpnIPsecServices()); + + /// + /// Get the Current IPsec VPN Server Settings (Async mode). Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnIPsecServices GetIPsecServices() => GetIPsecServicesAsync().Result; + + /// + /// Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices (Async mode). Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task AddEtherIpIdAsync(VpnEtherIpId input_param) => await CallAsync("AddEtherIpId", input_param); + + /// + /// Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices (Async mode). Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnEtherIpId AddEtherIpId(VpnEtherIpId input_param) => AddEtherIpIdAsync(input_param).Result; + + /// + /// Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions (Async mode). This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetEtherIpIdAsync(VpnEtherIpId input_param) => await CallAsync("GetEtherIpId", input_param); + + /// + /// Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions (Async mode). This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnEtherIpId GetEtherIpId(VpnEtherIpId input_param) => GetEtherIpIdAsync(input_param).Result; + + /// + /// Delete an EtherIP / L2TPv3 over IPsec Client Setting (Async mode). This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task DeleteEtherIpIdAsync(VpnEtherIpId input_param) => await CallAsync("DeleteEtherIpId", input_param); + + /// + /// Delete an EtherIP / L2TPv3 over IPsec Client Setting (Async mode). This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnEtherIpId DeleteEtherIpId(VpnEtherIpId input_param) => DeleteEtherIpIdAsync(input_param).Result; + + /// + /// Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions (Async mode). This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task EnumEtherIpIdAsync() => await CallAsync("EnumEtherIpId", new VpnRpcEnumEtherIpId()); + + /// + /// Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions (Async mode). This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcEnumEtherIpId EnumEtherIpId() => EnumEtherIpIdAsync().Result; + + /// + /// Set Settings for OpenVPN Clone Server Function (Async mode). The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetOpenVpnSstpConfigAsync(VpnOpenVpnSstpConfig input_param) => await CallAsync("SetOpenVpnSstpConfig", input_param); + + /// + /// Set Settings for OpenVPN Clone Server Function (Async mode). The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnOpenVpnSstpConfig SetOpenVpnSstpConfig(VpnOpenVpnSstpConfig input_param) => SetOpenVpnSstpConfigAsync(input_param).Result; + + /// + /// Get the Current Settings of OpenVPN Clone Server Function (Async mode). Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetOpenVpnSstpConfigAsync() => await CallAsync("GetOpenVpnSstpConfig", new VpnOpenVpnSstpConfig()); + + /// + /// Get the Current Settings of OpenVPN Clone Server Function (Async mode). Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnOpenVpnSstpConfig GetOpenVpnSstpConfig() => GetOpenVpnSstpConfigAsync().Result; + + /// + /// Show the Current Status of Dynamic DNS Function (Async mode). Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public async Task GetDDnsClientStatusAsync() => await CallAsync("GetDDnsClientStatus", new VpnDDnsClientStatus()); + + /// + /// Show the Current Status of Dynamic DNS Function (Async mode). Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public VpnDDnsClientStatus GetDDnsClientStatus() => GetDDnsClientStatusAsync().Result; + + /// + /// Set the Dynamic DNS Hostname (Async mode). You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public async Task ChangeDDnsClientHostnameAsync(VpnRpcTest input_param) => await CallAsync("ChangeDDnsClientHostname", input_param); + + /// + /// Set the Dynamic DNS Hostname (Async mode). You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcTest ChangeDDnsClientHostname(VpnRpcTest input_param) => ChangeDDnsClientHostnameAsync(input_param).Result; + + /// + /// Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server (Async mode). You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task RegenerateServerCertAsync(VpnRpcTest input_param) => await CallAsync("RegenerateServerCert", input_param); + + /// + /// Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server (Async mode). You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcTest RegenerateServerCert(VpnRpcTest input_param) => RegenerateServerCertAsync(input_param).Result; + + /// + /// Generate a Sample Setting File for OpenVPN Client (Async mode). Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task MakeOpenVpnConfigFileAsync() => await CallAsync("MakeOpenVpnConfigFile", new VpnRpcReadLogFile()); + + /// + /// Generate a Sample Setting File for OpenVPN Client (Async mode). Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcReadLogFile MakeOpenVpnConfigFile() => MakeOpenVpnConfigFileAsync().Result; + + /// + /// Enable / Disable the VPN over ICMP / VPN over DNS Server Function (Async mode). You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public async Task SetSpecialListenerAsync(VpnRpcSpecialListener input_param) => await CallAsync("SetSpecialListener", input_param); + + /// + /// Enable / Disable the VPN over ICMP / VPN over DNS Server Function (Async mode). You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcSpecialListener SetSpecialListener(VpnRpcSpecialListener input_param) => SetSpecialListenerAsync(input_param).Result; + + /// + /// Get Current Setting of the VPN over ICMP / VPN over DNS Function (Async mode). Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public async Task GetSpecialListenerAsync() => await CallAsync("GetSpecialListener", new VpnRpcSpecialListener()); + + /// + /// Get Current Setting of the VPN over ICMP / VPN over DNS Function (Async mode). Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. + /// + public VpnRpcSpecialListener GetSpecialListener() => GetSpecialListenerAsync().Result; + + /// + /// Show the current status of VPN Azure function (Async mode). Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task GetAzureStatusAsync() => await CallAsync("GetAzureStatus", new VpnRpcAzureStatus()); + + /// + /// Show the current status of VPN Azure function (Async mode). Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcAzureStatus GetAzureStatus() => GetAzureStatusAsync().Result; + + /// + /// Enable / Disable VPN Azure Function (Async mode). Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public async Task SetAzureStatusAsync(VpnRpcAzureStatus input_param) => await CallAsync("SetAzureStatus", input_param); + + /// + /// Enable / Disable VPN Azure Function (Async mode). Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster. + /// + public VpnRpcAzureStatus SetAzureStatus(VpnRpcAzureStatus input_param) => SetAzureStatusAsync(input_param).Result; + + /// + /// Get the Proxy Settings for Connecting to the DDNS server (Async mode). + /// + public async Task GetDDnsInternetSettngAsync() => await CallAsync("GetDDnsInternetSettng", new VpnInternetSetting()); + + /// + /// Get the Proxy Settings for Connecting to the DDNS server (Async mode). + /// + public VpnInternetSetting GetDDnsInternetSettng() => GetDDnsInternetSettngAsync().Result; + + /// + /// Set the Proxy Settings for Connecting to the DDNS server (Async mode). + /// + public async Task SetDDnsInternetSettngAsync(VpnInternetSetting input_param) => await CallAsync("SetDDnsInternetSettng", input_param); + + /// + /// Set the Proxy Settings for Connecting to the DDNS server (Sync mode). + /// + public VpnInternetSetting SetDDnsInternetSettng(VpnInternetSetting input_param) => SetDDnsInternetSettngAsync(input_param).Result; + + /// + /// Set the VPN Gate Server Configuration (Async mode). This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. + /// + public async Task SetVgsConfigAsync(VpnVgsConfig input_param) => await CallAsync("SetVgsConfig", input_param); + + /// + /// Set the VPN Gate Server Configuration (Sync mode). This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. + /// + public VpnVgsConfig SetVgsConfig(VpnVgsConfig input_param) => SetVgsConfigAsync(input_param).Result; + + /// + /// Get the VPN Gate Server Configuration (Async mode). This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. + /// + public async Task GetVgsConfigAsync() => await CallAsync("GetVgsConfig", new VpnVgsConfig()); + + /// + /// Get the VPN Gate Server Configuration (Sync mode). This API is valid for Win32 binary distribution of the Stable Edition of SoftEther VPN Server. + /// + public VpnVgsConfig GetVgsConfig() => GetVgsConfigAsync().Result; + + + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/VPNServerRpcTypes.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/VPNServerRpcTypes.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/VPNServerRpcTypes.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpc/VPNServerRpcTypes.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,5381 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// VPNServerRpcTypes.cs - Data Type Definition for SoftEther VPN Server JSON-RPC Stubs +// +// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-__YEAR__ SoftEther VPN Project + +using System; +using Newtonsoft.Json; + +namespace SoftEther.VPNServerRpc +{ + /// + /// IP Protocol Numbers + /// + public enum VpnIpProtocolNumber + { + /// + /// ICMP for IPv4 + /// + ICMPv4 = 1, + + /// + /// TCP + /// + TCP = 6, + + /// + /// UDP + /// + UDP = 17, + + /// + /// ICMP for IPv6 + /// + ICMPv6 = 58, + } + + /// + /// The body of the Access list + /// + public class VpnAccess + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Specify a description (note) for this rule + /// + public string Note_utf; + + /// + /// Enabled flag (true: enabled, false: disabled) + /// + public bool Active_bool; + + /// + /// Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values. + /// + public uint Priority_u32; + + /// + /// The flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded. + /// + public bool Discard_bool; + + /// + /// The flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6. + /// + public bool IsIPv6_bool; + + /// + /// Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field. + /// + public string SrcIpAddress_ip; + + /// + /// Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. + /// + public string SrcSubnetMask_ip; + + /// + /// Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field. + /// + public string DestIpAddress_ip; + + /// + /// Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host. + /// + public string DestSubnetMask_ip; + + /// + /// Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field. + /// + public byte[] SrcIpAddress6_bin; + + /// + /// Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. + /// + public byte[] SrcSubnetMask6_bin; + + /// + /// Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field. + /// + public byte[] DestIpAddress6_bin; + + /// + /// Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form. + /// + public byte[] DestSubnetMask6_bin; + + /// + /// The IP protocol number + /// + public VpnIpProtocolNumber Protocol_u32; + + /// + /// The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. + /// + public uint SrcPortStart_u32; + + /// + /// The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. + /// + public uint SrcPortEnd_u32; + + /// + /// The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. + /// + public uint DestPortStart_u32; + + /// + /// The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers. + /// + public uint DestPortEnd_u32; + + /// + /// Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. + /// + public string SrcUsername_str; + + /// + /// Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name. + /// + public string DestUsername_str; + + /// + /// Specify true if you want to check the source MAC address. + /// + public bool CheckSrcMac_bool; + + /// + /// Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true. + /// + public byte[] SrcMacAddress_bin; + + /// + /// Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. + /// + public byte[] SrcMacMask_bin; + + /// + /// Specify true if you want to check the destination MAC address. + /// + public bool CheckDstMac_bool; + + /// + /// Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true. + /// + public byte[] DstMacAddress_bin; + + /// + /// Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true. + /// + public byte[] DstMacMask_bin; + + /// + /// Specify true if you want to check the state of the TCP connection. + /// + public bool CheckTcpState_bool; + + /// + /// Valid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets. + /// + public bool Established_bool; + + /// + /// Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most. + /// + public uint Delay_u32; + + /// + /// Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate. + /// + public uint Jitter_u32; + + /// + /// Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate. + /// + public uint Loss_u32; + + /// + /// The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address. + /// + public string RedirectUrl_str; + } + + /// + /// Add an item to Access List + /// + public class VpnRpcAddAccess + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Access list (Must be a single item) + /// + public VpnAccess[] AccessListSingle; + } + + /// + /// Add CA to HUB + /// + public class VpnRpcHubAddCA + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The body of the X.509 certificate + /// + public byte[] Cert_bin; + } + + /// + /// CRL entry + /// + public class VpnRpcCrl + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Key ID + /// + public uint Key_u32; + + /// + /// CN, optional + /// + public string CommonName_utf; + + /// + /// O, optional + /// + public string Organization_utf; + + /// + /// OU, optional + /// + public string Unit_utf; + + /// + /// C, optional + /// + public string Country_utf; + + /// + /// ST, optional + /// + public string State_utf; + + /// + /// L, optional + /// + public string Local_utf; + + /// + /// Serial, optional + /// + public byte[] Serial_bin; + + /// + /// MD5 Digest, optional + /// + public byte[] DigestMD5_bin; + + /// + /// SHA1 Digest, optional + /// + public byte[] DigestSHA1_bin; + } + + /// + /// EtherIP key list entry + /// + public class VpnEtherIpId + { + /// + /// Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules. + /// + public string Id_str; + + /// + /// Specify the name of the Virtual Hub to connect. + /// + public string HubName_str; + + /// + /// Specify the username to login to the destination Virtual Hub. + /// + public string UserName_str; + + /// + /// Specify the password to login to the destination Virtual Hub. + /// + public string Password_str; + } + + /// + /// Layer-3 virtual interface + /// + public class VpnRpcL3If + { + /// + /// L3 switch name + /// + public string Name_str; + + /// + /// Virtual HUB name + /// + public string HubName_str; + + /// + /// IP address + /// + public string IpAddress_ip; + + /// + /// Subnet mask + /// + public string SubnetMask_ip; + } + + /// + /// Layer-3 switch + /// + public class VpnRpcL3Sw + { + /// + /// Layer-3 Switch name + /// + public string Name_str; + } + + /// + /// Routing table + /// + public class VpnRpcL3Table + { + /// + /// L3 switch name + /// + public string Name_str; + + /// + /// Network address + /// + public string NetworkAddress_ip; + + /// + /// Subnet mask + /// + public string SubnetMask_ip; + + /// + /// Gateway address + /// + public string GatewayAddress_ip; + + /// + /// Metric + /// + public uint Metric_u32; + } + + /// + /// Generic parameter to contain u32, u64, ascii_string and unicode string + /// + public class VpnRpcTest + { + /// + /// A 32-bit integer field + /// + public uint IntValue_u32; + + /// + /// A 64-bit integer field + /// + public ulong Int64Value_u64; + + /// + /// An Ascii string field + /// + public string StrValue_str; + + /// + /// An UTF-8 string field + /// + public string UniStrValue_utf; + } + + /// + /// Local Bridge list item + /// + public class VpnRpcLocalBridge + { + /// + /// Physical Ethernet device name + /// + public string DeviceName_str; + + /// + /// The Virtual Hub name + /// + public string HubNameLB_str; + + /// + /// Online flag + /// + public bool Online_bool; + + /// + /// Running flag + /// + public bool Active_bool; + + /// + /// Specify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions). + /// + public bool TapMode_bool; + } + + /// + /// Create, configure, and get the group + /// + public class VpnRpcSetGroup + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The group name + /// + public string Name_str; + + /// + /// Optional real name (full name) of the group, allow using any Unicode characters + /// + public string Realname_utf; + + /// + /// Optional, specify a description of the group + /// + public string Note_utf; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + + /// + /// The flag whether to use security policy + /// + public bool UsePolicy_bool; + + // ---- Start of Security policy --- + /// + /// Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. + /// + [JsonProperty("policy:Access_bool")] + public bool SecPol_Access_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPFilter_bool")] + public bool SecPol_DHCPFilter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPNoServer_bool")] + public bool SecPol_DHCPNoServer_bool; + + /// + /// Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. + /// + [JsonProperty("policy:DHCPForce_bool")] + public bool SecPol_DHCPForce_bool; + + /// + /// Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. + /// + [JsonProperty("policy:NoBridge_bool")] + public bool SecPol_NoBridge_bool; + + /// + /// Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. + /// + [JsonProperty("policy:NoRouting_bool")] + public bool SecPol_NoRouting_bool; + + /// + /// Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckMac_bool")] + public bool SecPol_CheckMac_bool; + + /// + /// Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckIP_bool")] + public bool SecPol_CheckIP_bool; + + /// + /// Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. + /// + [JsonProperty("policy:ArpDhcpOnly_bool")] + public bool SecPol_ArpDhcpOnly_bool; + + /// + /// Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. + /// + [JsonProperty("policy:PrivacyFilter_bool")] + public bool SecPol_PrivacyFilter_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. + /// + [JsonProperty("policy:NoServer_bool")] + public bool SecPol_NoServer_bool; + + /// + /// Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. + /// + [JsonProperty("policy:NoBroadcastLimiter_bool")] + public bool SecPol_NoBroadcastLimiter_bool; + + /// + /// Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. + /// + [JsonProperty("policy:MonitorPort_bool")] + public bool SecPol_MonitorPort_bool; + + /// + /// Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. + /// + [JsonProperty("policy:MaxConnection_u32")] + public uint SecPol_MaxConnection_u32; + + /// + /// Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. + /// + [JsonProperty("policy:TimeOut_u32")] + public uint SecPol_TimeOut_u32; + + /// + /// Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. + /// + [JsonProperty("policy:MaxMac_u32")] + public uint SecPol_MaxMac_u32; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIP_u32")] + public uint SecPol_MaxIP_u32; + + /// + /// Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. + /// + [JsonProperty("policy:MaxUpload_u32")] + public uint SecPol_MaxUpload_u32; + + /// + /// Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. + /// + [JsonProperty("policy:MaxDownload_u32")] + public uint SecPol_MaxDownload_u32; + + /// + /// Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. + /// + [JsonProperty("policy:FixPassword_bool")] + public bool SecPol_FixPassword_bool; + + /// + /// Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. + /// + [JsonProperty("policy:MultiLogins_u32")] + public uint SecPol_MultiLogins_u32; + + /// + /// Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. + /// + [JsonProperty("policy:NoQoS_bool")] + public bool SecPol_NoQoS_bool; + + /// + /// Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. + /// + [JsonProperty("policy:RSandRAFilter_bool")] + public bool SecPol_RSandRAFilter_bool; + + /// + /// Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. + /// + [JsonProperty("policy:RAFilter_bool")] + public bool SecPol_RAFilter_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPv6Filter_bool")] + public bool SecPol_DHCPv6Filter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPv6NoServer_bool")] + public bool SecPol_DHCPv6NoServer_bool; + + /// + /// Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. + /// + [JsonProperty("policy:NoRoutingV6_bool")] + public bool SecPol_NoRoutingV6_bool; + + /// + /// Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckIPv6_bool")] + public bool SecPol_CheckIPv6_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. + /// + [JsonProperty("policy:NoServerV6_bool")] + public bool SecPol_NoServerV6_bool; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIPv6_u32")] + public uint SecPol_MaxIPv6_u32; + + /// + /// Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. + /// + [JsonProperty("policy:NoSavePassword_bool")] + public bool SecPol_NoSavePassword_bool; + + /// + /// Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. + /// + [JsonProperty("policy:AutoDisconnect_u32")] + public uint SecPol_AutoDisconnect_u32; + + /// + /// Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv4_bool")] + public bool SecPol_FilterIPv4_bool; + + /// + /// Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv6_bool")] + public bool SecPol_FilterIPv6_bool; + + /// + /// Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. + /// + [JsonProperty("policy:FilterNonIP_bool")] + public bool SecPol_FilterNonIP_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRA_bool")] + public bool SecPol_NoIPv6DefaultRouterInRA_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRAWhenIPv6_bool")] + public bool SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool; + + /// + /// Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. + /// + [JsonProperty("policy:VLanId_u32")] + public uint SecPol_VLanId_u32; + + /// + /// Security policy: Whether version 3.0 (must be true) + /// + [JsonProperty("policy:Ver3_bool")] + public bool SecPol_Ver3_bool = true; + // ---- End of Security policy --- + } + + /// + /// Hub types + /// + public enum VpnRpcHubType + { + /// + /// Stand-alone HUB + /// + Standalone = 0, + + /// + /// Static HUB + /// + FarmStatic = 1, + + /// + /// Dynamic HUB + /// + FarmDynamic = 2, + } + + /// + /// Create a HUB + /// + public class VpnRpcCreateHub + { + /// + /// Specify the name of the Virtual Hub to create / update. + /// + public string HubName_str; + + /// + /// Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password. + /// + public string AdminPasswordPlainText_str; + + /// + /// Online flag + /// + public bool Online_bool; + + /// + /// Maximum number of VPN sessions + /// + public uint MaxSession_u32; + + /// + /// No Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server. + /// + public bool NoEnum_bool; + + /// + /// Type of the Virtual Hub (Valid only for Clustered VPN Servers) + /// + public VpnRpcHubType HubType_u32; + } + + public enum VpnRpcClientAuthType + { + /// + /// Anonymous authentication + /// + Anonymous = 0, + + /// + /// SHA-0 hashed password authentication + /// + SHA0_Hashed_Password = 1, + + /// + /// Plain password authentication + /// + PlainPassword = 2, + + /// + /// Certificate authentication + /// + Cert = 3, + } + + /// + /// Create and set of link + /// + public class VpnRpcCreateLink + { + /// + /// The Virtual Hub name + /// + public string HubName_Ex_str; + + /// + /// Online flag + /// + public bool Online_bool; + + /// + /// The flag to enable validation for the server certificate + /// + public bool CheckServerCert_bool; + + /// + /// The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true. + /// + public byte[] ServerCert_bin; + + // ---- Start of Client Option Parameters --- + /// + /// Client Option Parameters: Specify the name of the Cascade Connection + /// + [JsonProperty("AccountName_utf")] + public string ClientOption_AccountName_utf; + + /// + /// Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address. + /// + [JsonProperty("Hostname_str")] + public string ClientOption_Hostname_str; + + /// + /// Client Option Parameters: Specify the port number of the destination VPN Server. + /// + [JsonProperty("Port_u32")] + public uint ClientOption_Port_u32; + + /// + /// Client Option Parameters: The type of the proxy server + /// + [JsonProperty("ProxyType_u32")] + public VpnRpcProxyType ClientOption_ProxyType_u32; + + /// + /// Client Option Parameters: The hostname or IP address of the proxy server name + /// + [JsonProperty("ProxyName_str")] + public string ClientOption_ProxyName_str; + + /// + /// Client Option Parameters: The port number of the proxy server + /// + [JsonProperty("ProxyPort_u32")] + public uint ClientOption_ProxyPort_u32; + + /// + /// Client Option Parameters: The username to connect to the proxy server + /// + [JsonProperty("ProxyUsername_str")] + public string ClientOption_ProxyUsername_str; + + /// + /// Client Option Parameters: The password to connect to the proxy server + /// + [JsonProperty("ProxyPassword_str")] + public string ClientOption_ProxyPassword_str; + + /// + /// Client Option Parameters: The Virtual Hub on the destination VPN Server + /// + [JsonProperty("HubName_str")] + public string ClientOption_HubName_str; + + /// + /// Client Option Parameters: Number of TCP Connections to Use in VPN Communication + /// + [JsonProperty("MaxConnection_u32")] + public uint ClientOption_MaxConnection_u32; + + /// + /// Client Option Parameters: The flag to enable the encryption on the communication + /// + [JsonProperty("UseEncrypt_bool")] + public bool ClientOption_UseEncrypt_bool; + + /// + /// Client Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection + /// + [JsonProperty("UseCompress_bool")] + public bool ClientOption_UseCompress_bool; + + /// + /// Client Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction. + /// + [JsonProperty("HalfConnection_bool")] + public bool ClientOption_HalfConnection_bool; + + /// + /// Client Option Parameters: Connection attempt interval when additional connection will be established + /// + [JsonProperty("AdditionalConnectionInterval_u32")] + public uint ClientOption_AdditionalConnectionInterval_u32; + + /// + /// Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive) + /// + [JsonProperty("ConnectionDisconnectSpan_u32")] + public uint ClientOption_ConnectionDisconnectSpan_u32; + + /// + /// Client Option Parameters: Disable QoS Control Function if the value is true + /// + [JsonProperty("DisableQoS_bool")] + public bool ClientOption_DisableQoS_bool; + + /// + /// Client Option Parameters: Do not use TLS 1.x of the value is true + /// + [JsonProperty("NoTls1_bool")] + public bool ClientOption_NoTls1_bool; + + /// + /// Client Option Parameters: Do not use UDP acceleration mode if the value is true + /// + [JsonProperty("NoUdpAcceleration_bool")] + public bool ClientOption_NoUdpAcceleration_bool; + // ---- End of Client Option --- + + // ---- Start of Client Auth Parameters --- + /// + /// Authentication type + /// + [JsonProperty("AuthType_u32")] + public VpnRpcClientAuthType ClientAuth_AuthType_u32; + + /// + /// User name + /// + [JsonProperty("Username_str")] + public string ClientAuth_Username_str; + + /// + /// SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string). + /// + [JsonProperty("HashedPassword_bin")] + public byte[] ClientAuth_HashedPassword_bin; + + /// + /// Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2). + /// + [JsonProperty("PlainPassword_str")] + public string ClientAuth_PlainPassword_str; + + /// + /// Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). + /// + [JsonProperty("ClientX_bin")] + public byte[] ClientAuth_ClientX_bin; + + /// + /// Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3). + /// + [JsonProperty("ClientK_bin")] + public byte[] ClientAuth_ClientK_bin; + + /// + /// Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPFilter_bool")] + public bool SecPol_DHCPFilter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPNoServer_bool")] + public bool SecPol_DHCPNoServer_bool; + + /// + /// Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. + /// + [JsonProperty("policy:DHCPForce_bool")] + public bool SecPol_DHCPForce_bool; + + /// + /// Security policy: Prohibit the duplicate MAC address + /// + /// Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + public bool SecPol_CheckMac_bool; + + /// + /// Security policy: Prohibit a duplicate IP address (IPv4) + /// + /// Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + public bool SecPol_CheckIP_bool; + + /// + /// Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. + /// + [JsonProperty("policy:ArpDhcpOnly_bool")] + public bool SecPol_ArpDhcpOnly_bool; + + /// + /// Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. + /// + [JsonProperty("policy:PrivacyFilter_bool")] + public bool SecPol_PrivacyFilter_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. + /// + [JsonProperty("policy:NoServer_bool")] + public bool SecPol_NoServer_bool; + + /// + /// Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. + /// + [JsonProperty("policy:NoBroadcastLimiter_bool")] + public bool SecPol_NoBroadcastLimiter_bool; + + /// + /// Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. + /// + [JsonProperty("policy:MaxMac_u32")] + public uint SecPol_MaxMac_u32; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIP_u32")] + public uint SecPol_MaxIP_u32; + + /// + /// Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. + /// + [JsonProperty("policy:MaxUpload_u32")] + public uint SecPol_MaxUpload_u32; + + /// + /// Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. + /// + [JsonProperty("policy:MaxDownload_u32")] + public uint SecPol_MaxDownload_u32; + + /// + /// Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. + /// + [JsonProperty("policy:RSandRAFilter_bool")] + public bool SecPol_RSandRAFilter_bool; + + /// + /// Security policy: Filter the router advertisement packet (IPv6) + /// + /// Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. + public bool SecPol_RAFilter_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPv6Filter_bool")] + public bool SecPol_DHCPv6Filter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPv6NoServer_bool")] + public bool SecPol_DHCPv6NoServer_bool; + + /// + /// Security policy: Prohibit the duplicate IP address (IPv6) + /// + /// Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + public bool SecPol_CheckIPv6_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. + /// + [JsonProperty("policy:NoServerV6_bool")] + public bool SecPol_NoServerV6_bool; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIPv6_u32")] + public uint SecPol_MaxIPv6_u32; + + /// + /// Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv4_bool")] + public bool SecPol_FilterIPv4_bool; + + /// + /// Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv6_bool")] + public bool SecPol_FilterIPv6_bool; + + /// + /// Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. + /// + [JsonProperty("policy:FilterNonIP_bool")] + public bool SecPol_FilterNonIP_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRA_bool")] + public bool SecPol_NoIPv6DefaultRouterInRA_bool; + + /// + /// Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. + /// + [JsonProperty("policy:VLanId_u32")] + public uint SecPol_VLanId_u32; + + /// + /// Security policy: Whether version 3.0 (must be true) + /// + [JsonProperty("policy:Ver3_bool")] + public bool SecPol_Ver3_bool = true; + // ---- End of Security policy --- + } + + /// + /// Listener + /// + public class VpnRpcListener + { + /// + /// Port number (Range: 1 - 65535) + /// + public uint Port_u32; + + /// + /// Active state + /// + public bool Enable_bool; + } + + /// + /// User authentication type (server side) + /// + public enum VpnRpcUserAuthType + { + /// + /// Anonymous authentication + /// + Anonymous = 0, + + /// + /// Password authentication + /// + Password = 1, + + /// + /// User certificate authentication + /// + UserCert = 2, + + /// + /// Root certificate which is issued by trusted Certificate Authority + /// + RootCert = 3, + + /// + /// Radius authentication + /// + Radius = 4, + + /// + /// Windows NT authentication + /// + NTDomain = 5, + } + + /// + /// Create, configure, and get the user + /// + public class VpnRpcSetUser + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Specify the user name of the user + /// + public string Name_str; + + /// + /// Assigned group name for the user + /// + public string GroupName_str; + + /// + /// Optional real name (full name) of the user, allow using any Unicode characters + /// + public string Realname_utf; + + /// + /// Optional User Description + /// + public string Note_utf; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Last modified date and time + /// + public DateTime UpdatedTime_dt; + + /// + /// Expiration date and time + /// + public DateTime ExpireTime_dt; + + /// + /// Authentication method of the user + /// + public VpnRpcUserAuthType AuthType_u32; + + /// + /// User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations. + /// + public string Auth_Password_str; + + /// + /// User certificate, valid only if AuthType_u32 == UserCert(2). + /// + [JsonProperty("UserX_bin")] + public byte[] Auth_UserCert_CertData; + + /// + /// Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3). + /// + [JsonProperty("Serial_bin")] + public byte[] Auth_RootCert_Serial; + + /// + /// Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3). + /// + [JsonProperty("CommonName_utf")] + public string Auth_RootCert_CommonName; + + /// + /// Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4). + /// + [JsonProperty("RadiusUsername_utf")] + public string Auth_Radius_RadiusUsername; + + /// + /// Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5). + /// + [JsonProperty("NtUsername_utf")] + public string Auth_NT_NTUsername; + + /// + /// Number of total logins of the user + /// + public uint NumLogin_u32; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + + /// + /// The flag whether to use security policy + /// + public bool UsePolicy_bool; + + // ---- Start of Security policy --- + /// + /// Security policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server. + /// + [JsonProperty("policy:Access_bool")] + public bool SecPol_Access_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPFilter_bool")] + public bool SecPol_DHCPFilter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPNoServer_bool")] + public bool SecPol_DHCPNoServer_bool; + + /// + /// Security policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side. + /// + [JsonProperty("policy:DHCPForce_bool")] + public bool SecPol_DHCPForce_bool; + + /// + /// Security policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible. + /// + [JsonProperty("policy:NoBridge_bool")] + public bool SecPol_NoBridge_bool; + + /// + /// Security policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. + /// + [JsonProperty("policy:NoRouting_bool")] + public bool SecPol_NoRouting_bool; + + /// + /// Security policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckMac_bool")] + public bool SecPol_CheckMac_bool; + + /// + /// Security policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckIP_bool")] + public bool SecPol_CheckIP_bool; + + /// + /// Security policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting. + /// + [JsonProperty("policy:ArpDhcpOnly_bool")] + public bool SecPol_ArpDhcpOnly_bool; + + /// + /// Security policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered. + /// + [JsonProperty("policy:PrivacyFilter_bool")] + public bool SecPol_PrivacyFilter_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4. + /// + [JsonProperty("policy:NoServer_bool")] + public bool SecPol_NoServer_bool; + + /// + /// Security policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting. + /// + [JsonProperty("policy:NoBroadcastLimiter_bool")] + public bool SecPol_NoBroadcastLimiter_bool; + + /// + /// Security policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub. + /// + [JsonProperty("policy:MonitorPort_bool")] + public bool SecPol_MonitorPort_bool; + + /// + /// Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session. + /// + [JsonProperty("policy:MaxConnection_u32")] + public uint SecPol_MaxConnection_u32; + + /// + /// Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server. + /// + [JsonProperty("policy:TimeOut_u32")] + public uint SecPol_TimeOut_u32; + + /// + /// Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session. + /// + [JsonProperty("policy:MaxMac_u32")] + public uint SecPol_MaxMac_u32; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIP_u32")] + public uint SecPol_MaxIP_u32; + + /// + /// Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub. + /// + [JsonProperty("policy:MaxUpload_u32")] + public uint SecPol_MaxUpload_u32; + + /// + /// Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub. + /// + [JsonProperty("policy:MaxDownload_u32")] + public uint SecPol_MaxDownload_u32; + + /// + /// Security policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar. + /// + [JsonProperty("policy:FixPassword_bool")] + public bool SecPol_FixPassword_bool; + + /// + /// Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy. + /// + [JsonProperty("policy:MultiLogins_u32")] + public uint SecPol_MultiLogins_u32; + + /// + /// Security policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions. + /// + [JsonProperty("policy:NoQoS_bool")] + public bool SecPol_NoQoS_bool; + + /// + /// Security policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection. + /// + [JsonProperty("policy:RSandRAFilter_bool")] + public bool SecPol_RSandRAFilter_bool; + + /// + /// Security policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network. + /// + [JsonProperty("policy:RAFilter_bool")] + public bool SecPol_RAFilter_bool; + + /// + /// Security policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:DHCPv6Filter_bool")] + public bool SecPol_DHCPv6Filter_bool; + + /// + /// Security policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients. + /// + [JsonProperty("policy:DHCPv6NoServer_bool")] + public bool SecPol_DHCPv6NoServer_bool; + + /// + /// Security policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible. + /// + [JsonProperty("policy:NoRoutingV6_bool")] + public bool SecPol_NoRoutingV6_bool; + + /// + /// Security policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting. + /// + [JsonProperty("policy:CheckIPv6_bool")] + public bool SecPol_CheckIPv6_bool; + + /// + /// Security policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6. + /// + [JsonProperty("policy:NoServerV6_bool")] + public bool SecPol_NoServerV6_bool; + + /// + /// Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session. + /// + [JsonProperty("policy:MaxIPv6_u32")] + public uint SecPol_MaxIPv6_u32; + + /// + /// Security policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using *standard* password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access. + /// + [JsonProperty("policy:NoSavePassword_bool")] + public bool SecPol_NoSavePassword_bool; + + /// + /// Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access. + /// + [JsonProperty("policy:AutoDisconnect_u32")] + public uint SecPol_AutoDisconnect_u32; + + /// + /// Security policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv4_bool")] + public bool SecPol_FilterIPv4_bool; + + /// + /// Security policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered. + /// + [JsonProperty("policy:FilterIPv6_bool")] + public bool SecPol_FilterIPv6_bool; + + /// + /// Security policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. + /// + [JsonProperty("policy:FilterNonIP_bool")] + public bool SecPol_FilterNonIP_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRA_bool")] + public bool SecPol_NoIPv6DefaultRouterInRA_bool; + + /// + /// Security policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router. + /// + [JsonProperty("policy:NoIPv6DefaultRouterInRAWhenIPv6_bool")] + public bool SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool; + + /// + /// Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing. + /// + [JsonProperty("policy:VLanId_u32")] + public uint SecPol_VLanId_u32; + + /// + /// Security policy: Whether version 3.0 (must be true) + /// + [JsonProperty("policy:Ver3_bool")] + public bool SecPol_Ver3_bool = true; + // ---- End of Security policy --- + } + + /// + /// Delete the access list + /// + public class VpnRpcDeleteAccess + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// ID + /// + public uint Id_u32; + } + + /// + /// Delete the CA of HUB + /// + public class VpnRpcHubDeleteCA + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Certificate key id to be deleted + /// + public uint Key_u32; + } + + /// + /// Deleting a user or group + /// + public class VpnRpcDeleteUser + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// User or group name + /// + public string Name_str; + } + + /// + /// Delete the HUB + /// + public class VpnRpcDeleteHub + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + } + + /// + /// Delete the table + /// + public class VpnRpcDeleteTable + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Key ID + /// + public uint Key_u32; + } + + /// + /// Specify the Link + /// + public class VpnRpcLink + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The name of the cascade connection + /// + public string AccountName_utf; + } + + /// + /// Disconnect the session + /// + public class VpnRpcDeleteSession + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Session name + /// + public string Name_str; + } + + /// + /// Specify the HUB + /// + public class VpnRpcHub + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + } + + /// + /// Disconnect a connection + /// + public class VpnRpcDisconnectConnection + { + /// + /// Connection name + /// + public string Name_str; + } + + /// + /// Enumeration of the access list + /// + public class VpnRpcEnumAccessList + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Access list + /// + public VpnAccess[] AccessList; + } + + /// + /// CA enumeration items of HUB + /// + public class VpnRpcHubEnumCAItem + { + /// + /// The key id of the item + /// + public uint Key_u32; + + /// + /// Subject + /// + public string SubjectName_utf; + + /// + /// Issuer + /// + public string IssuerName_utf; + + /// + /// Expiration date + /// + public DateTime Expires_dt; + } + + /// + /// CA enumeration of HUB + /// + public class VpnRpcHubEnumCA + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The list of CA + /// + public VpnRpcHubEnumCAItem[] CAList; + } + + /// + /// Type of connection + /// + public enum VpnRpcConnectionType + { + /// + /// VPN Client + /// + Client = 0, + + /// + /// During initialization + /// + Init = 1, + + /// + /// Login connection + /// + Login = 2, + + /// + /// Additional connection + /// + Additional = 3, + + /// + /// RPC for server farm + /// + FarmRpc = 4, + + /// + /// RPC for Management + /// + AdminRpc = 5, + + /// + /// HUB enumeration + /// + EnumHub = 6, + + /// + /// Password change + /// + Password = 7, + + /// + /// SSTP + /// + SSTP = 8, + + /// + /// OpenVPN + /// + OpenVPN = 9, + } + + /// + /// Connection enumeration items + /// + public class VpnRpcEnumConnectionItem + { + /// + /// Connection name + /// + public string Name_str; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Port number + /// + public uint Port_u32; + + /// + /// Connected time + /// + public DateTime ConnectedTime_dt; + + /// + /// Connection type + /// + public VpnRpcConnectionType Type_u32; + } + + /// + /// Connection enumeration + /// + public class VpnRpcEnumConnection + { + /// + /// Number of connections + /// + public uint NumConnection_u32; + + /// + /// Connection list + /// + public VpnRpcEnumConnectionItem[] ConnectionList; + } + + /// + /// Enum CRL Item + /// + public class VpnRpcEnumCrlItem + { + /// + /// Key ID + /// + public uint Key_u32; + + /// + /// The contents of the CRL item + /// + public string CrlInfo_utf; + } + + /// + /// Enum CRL + /// + public class VpnRpcEnumCrl + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// CRL list + /// + public VpnRpcEnumCrlItem[] CRLList; + } + + /// + /// RPC_ENUM_DHCP_ITEM + /// + public class VpnRpcEnumDhcpItem + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Lease time + /// + public DateTime LeasedTime_dt; + + /// + /// Expiration date + /// + public DateTime ExpireTime_dt; + + /// + /// MAC address + /// + public byte[] MacAddress_bin; + + /// + /// IP address + /// + public string IpAddress_ip; + + /// + /// Subnet mask + /// + public uint Mask_u32; + + /// + /// Host name + /// + public string Hostname_str; + } + + /// + /// RPC_ENUM_DHCP + /// + public class VpnRpcEnumDhcp + { + /// + /// Virtual Hub Name + /// + public string HubName_str; + + /// + /// DHCP Item + /// + public VpnRpcEnumDhcpItem[] DhcpTable; + } + + /// + /// EtherIP setting list + /// + public class VpnRpcEnumEtherIpId + { + /// + /// Setting list + /// + public VpnEtherIpId[] Settings; + } + + /// + /// Ethernet Network Adapters list item + /// + public class VpnRpcEnumEthItem + { + /// + /// Device name + /// + public string DeviceName_str; + + /// + /// Network connection name (description) + /// + public string NetworkConnectionName_utf; + } + + /// + /// Ethernet Network Adapters list + /// + public class VpnRpcEnumEth + { + /// + /// Ethernet Network Adapters list + /// + public VpnRpcEnumEthItem[] EthList; + } + + /// + /// Server farm members enumeration items + /// + public class VpnRpcEnumFarmItem + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Controller + /// + public bool Controller_bool; + + /// + /// Connection time + /// + public DateTime ConnectedTime_dt; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// Point + /// + public uint Point_u32; + + /// + /// Number of sessions + /// + public uint NumSessions_u32; + + /// + /// Number of TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Number of HUBs + /// + public uint NumHubs_u32; + + /// + /// Number of assigned client licenses + /// + public uint AssignedClientLicense_u32; + + /// + /// Number of assigned bridge licenses + /// + public uint AssignedBridgeLicense_u32; + } + + /// + /// Server farm member enumeration + /// + public class VpnRpcEnumFarm + { + /// + /// Number of Cluster Members + /// + public uint NumFarm_u32; + + /// + /// Cluster Members list + /// + public VpnRpcEnumFarmItem[] FarmMemberList; + } + + /// + /// Enumeration items in the group + /// + public class VpnRpcEnumGroupItem + { + /// + /// User name + /// + public string Name_str; + + /// + /// Real name + /// + public string Realname_utf; + + /// + /// Note + /// + public string Note_utf; + + /// + /// Number of users + /// + public uint NumUsers_u32; + + /// + /// Access denied + /// + public bool DenyAccess_bool; + } + + /// + /// Group enumeration + /// + public class VpnRpcEnumGroup + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Group list + /// + public VpnRpcEnumGroupItem[] GroupList; + } + + /// + /// Enumeration items of HUB + /// + public class VpnRpcEnumHubItem + { + /// + /// The name of the Virtual Hub + /// + public string HubName_str; + + /// + /// Online state + /// + public bool Online_bool; + + /// + /// Type of HUB (Valid only for Clustered VPN Servers) + /// + public VpnRpcHubType HubType_u32; + + /// + /// Number of users + /// + public uint NumUsers_u32; + + /// + /// Number of registered groups + /// + public uint NumGroups_u32; + + /// + /// Number of registered sessions + /// + public uint NumSessions_u32; + + /// + /// Number of current MAC table entries + /// + public uint NumMacTables_u32; + + /// + /// Number of current IP table entries + /// + public uint NumIpTables_u32; + + /// + /// Last communication date and time + /// + public DateTime LastCommTime_dt; + + /// + /// Last login date and time + /// + public DateTime LastLoginTime_dt; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Number of accumulated logins + /// + public uint NumLogin_u32; + + /// + /// Whether the traffic information is provided + /// + public bool IsTrafficFilled_bool; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Ex.Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Ex.Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Ex.Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Ex.Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Ex.Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Ex.Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Ex.Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Ex.Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + } + + /// + /// Enumeration of HUB + /// + public class VpnRpcEnumHub + { + /// + /// Number of Virtual Hubs + /// + public uint NumHub_u32; + + /// + /// Virtual Hubs + /// + public VpnRpcEnumHubItem[] HubList; + } + + /// + /// Enumeration items of IP table + /// + public class VpnRpcEnumIpTableItem + { + /// + /// Key ID + /// + public uint Key_u32; + + /// + /// Session name + /// + public string SessionName_str; + + /// + /// IP address + /// + public string IpAddress_ip; + + /// + /// Assigned by the DHCP + /// + public bool DhcpAllocated_bool; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Updating date + /// + public DateTime UpdatedTime_dt; + + /// + /// Remote items + /// + public bool RemoteItem_bool; + + /// + /// Remote host name + /// + public string RemoteHostname_str; + } + + /// + /// Enumeration of IP table + /// + public class VpnRpcEnumIpTable + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// MAC table + /// + public VpnRpcEnumIpTableItem[] IpTable; + } + + /// + /// Layer-3 interface enumeration + /// + public class VpnRpcEnumL3If + { + /// + /// Layer-3 switch name + /// + public string Name_str; + + /// + /// Layer-3 interface list + /// + public VpnRpcL3If[] L3IFList; + } + + /// + /// Layer-3 switch enumeration item + /// + public class VpnRpcEnumL3SwItem + { + /// + /// Name of the layer-3 switch + /// + public string Name_str; + + /// + /// Number of layer-3 switch virtual interfaces + /// + public uint NumInterfaces_u32; + + /// + /// Number of routing tables + /// + public uint NumTables_u32; + + /// + /// Activated flag + /// + public bool Active_bool; + + /// + /// Online flag + /// + public bool Online_bool; + } + + /// + /// Layer-3 switch enumeration + /// + public class VpnRpcEnumL3Sw + { + /// + /// Layer-3 switch list + /// + public VpnRpcEnumL3SwItem[] L3SWList; + } + + /// + /// Routing table enumeration + /// + public class VpnRpcEnumL3Table + { + /// + /// L3 switch name + /// + public string Name_str; + + /// + /// Routing table item list + /// + public VpnRpcL3Table[] L3Table; + } + + /// + /// Cascade Connection Enumeration + /// + public class VpnRpcEnumLinkItem + { + /// + /// The name of cascade connection + /// + public string AccountName_utf; + + /// + /// Online flag + /// + public bool Online_bool; + + /// + /// The flag indicates whether the cascade connection is established + /// + public bool Connected_bool; + + /// + /// The error last occurred if the cascade connection is in the fail state + /// + public uint LastError_u32; + + /// + /// Connection completion time + /// + public DateTime ConnectedTime_dt; + + /// + /// Host name of the destination VPN server + /// + public string Hostname_str; + + /// + /// The Virtual Hub name + /// + public string TargetHubName_str; + } + + /// + /// Enumeration of the link + /// + public class VpnRpcEnumLink + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Number of cascade connections + /// + public uint NumLink_u32; + + /// + /// The list of cascade connections + /// + public VpnRpcEnumLinkItem[] LinkList; + } + + /// + /// List of listeners item + /// + public class VpnRpcListenerListItem + { + /// + /// TCP port number (range: 1 - 65535) + /// + public uint Ports_u32; + + /// + /// Active state + /// + public bool Enables_bool; + + /// + /// The flag to indicate if the error occurred on the listener port + /// + public bool Errors_bool; + } + + /// + /// List of listeners + /// + public class VpnRpcListenerList + { + /// + /// List of listener items + /// + public VpnRpcListenerListItem[] ListenerList; + } + + /// + /// Local Bridge enumeration + /// + public class VpnRpcEnumLocalBridge + { + /// + /// Local Bridge list + /// + public VpnRpcLocalBridge[] LocalBridgeList; + } + + /// + /// Log file enumeration + /// + public class VpnRpcEnumLogFileItem + { + /// + /// Server name + /// + public string ServerName_str; + + /// + /// File path + /// + public string FilePath_str; + + /// + /// File size + /// + public uint FileSize_u32; + + /// + /// Last write date + /// + public DateTime UpdatedTime_dt; + } + + /// + /// Log file enumeration + /// + public class VpnRpcEnumLogFile + { + /// + /// Log file list + /// + public VpnRpcEnumLogFileItem[] LogFiles; + } + + /// + /// Enumeration items of the MAC table + /// + public class VpnRpcEnumMacTableItem + { + /// + /// Key ID + /// + public uint Key_u32; + + /// + /// Session name + /// + public string SessionName_str; + + /// + /// MAC address + /// + public byte[] MacAddress_bin; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Updating date + /// + public DateTime UpdatedTime_dt; + + /// + /// Remote items + /// + public bool RemoteItem_bool; + + /// + /// Remote host name + /// + public string RemoteHostname_str; + + /// + /// VLAN ID + /// + public uint VlanId_u32; + } + + /// + /// Enumeration of the MAC table + /// + public class VpnRpcEnumMacTable + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// MAC table + /// + public VpnRpcEnumMacTableItem[] MacTable; + } + + /// + /// NAT Entry Protocol Number + /// + public enum VpnRpcNatProtocol + { + /// + /// TCP + /// + TCP = 0, + + /// + /// UDP + /// + UDP = 1, + + /// + /// DNS + /// + DNS = 2, + + /// + /// ICMP + /// + ICMP = 3, + } + + /// + /// State of NAT session (TCP) + /// + public enum VpnRpcNatTcpState + { + /// + /// Connecting + /// + Connecting = 0, + + /// + /// Send the RST (Connection failure or disconnected) + /// + SendReset = 1, + + /// + /// Connection complete + /// + Connected = 2, + + /// + /// Connection established + /// + Established = 3, + + /// + /// Wait for socket disconnection + /// + WaitDisconnect = 4, + } + + /// + /// VpnRpcEnumNat List Item + /// + public class VpnRpcEnumNatItem + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Protocol + /// + public VpnRpcNatProtocol Protocol_u32; + + /// + /// Source IP address + /// + public string SrcIp_ip; + + /// + /// Source host name + /// + public string SrcHost_str; + + /// + /// Source port number + /// + public uint SrcPort_u32; + + /// + /// Destination IP address + /// + public string DestIp_ip; + + /// + /// Destination host name + /// + public string DestHost_str; + + /// + /// Destination port number + /// + public uint DestPort_u32; + + /// + /// Connection time + /// + public DateTime CreatedTime_dt; + + /// + /// Last communication time + /// + public DateTime LastCommTime_dt; + + /// + /// Transmission size + /// + public ulong SendSize_u64; + + /// + /// Receive size + /// + public ulong RecvSize_u64; + + /// + /// TCP state + /// + public VpnRpcNatTcpState TcpStatus_u32; + } + + /// + /// RPC_ENUM_NAT + /// + public class VpnRpcEnumNat + { + /// + /// Virtual Hub Name + /// + public string HubName_str; + + /// + /// NAT item + /// + public VpnRpcEnumNatItem[] NatTable; + } + + /// + /// Enumeration item of VPN session + /// + public class VpnRpcEnumSessionItem + { + /// + /// Session name + /// + public string Name_str; + + /// + /// Remote session + /// + public bool RemoteSession_bool; + + /// + /// Remote server name + /// + public string RemoteHostname_str; + + /// + /// User name + /// + public string Username_str; + + /// + /// IP address + /// + public string ClientIP_ip; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// Maximum number of underlying TCP connections + /// + public uint MaxNumTcp_u32; + + /// + /// Number of current underlying TCP connections + /// + public uint CurrentNumTcp_u32; + + /// + /// Packet size transmitted + /// + public ulong PacketSize_u64; + + /// + /// Number of packets transmitted + /// + public ulong PacketNum_u64; + + /// + /// Is a Cascade VPN session + /// + public bool LinkMode_bool; + + /// + /// Is a SecureNAT VPN session + /// + public bool SecureNATMode_bool; + + /// + /// Is the VPN session for Local Bridge + /// + public bool BridgeMode_bool; + + /// + /// Is a Layer-3 Switch VPN session + /// + public bool Layer3Mode_bool; + + /// + /// Is in Bridge Mode + /// + public bool Client_BridgeMode_bool; + + /// + /// Is in Monitor Mode + /// + public bool Client_MonitorMode_bool; + + /// + /// VLAN ID + /// + public uint VLanId_u32; + + /// + /// Unique ID of the VPN Session + /// + public byte[] UniqueId_bin; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Last communication date and time + /// + public DateTime LastCommTime_dt; + } + + /// + /// Enumerate VPN sessions + /// + public class VpnRpcEnumSession + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// VPN sessions list + /// + public VpnRpcEnumSessionItem[] SessionList; + } + + /// + /// Enumeration item of user + /// + public class VpnRpcEnumUserItem + { + /// + /// User name + /// + public string Name_str; + + /// + /// Group name + /// + public string GroupName_str; + + /// + /// Real name + /// + public string Realname_utf; + + /// + /// Note + /// + public string Note_utf; + + /// + /// Authentication method + /// + public VpnRpcUserAuthType AuthType_u32; + + /// + /// Number of logins + /// + public uint NumLogin_u32; + + /// + /// Last login date and time + /// + public DateTime LastLoginTime_dt; + + /// + /// Access denied + /// + public bool DenyAccess_bool; + + /// + /// Flag of whether the traffic variable is set + /// + public bool IsTrafficFilled_bool; + + /// + /// Flag of whether expiration date variable is set + /// + public bool IsExpiresFilled_bool; + + /// + /// Expiration date + /// + public DateTime Expires_dt; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Ex.Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Ex.Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Ex.Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Ex.Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Ex.Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Ex.Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Ex.Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Ex.Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + } + + /// + /// Enumeration of user + /// + public class VpnRpcEnumUser + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// User list + /// + public VpnRpcEnumUserItem[] UserList; + } + + /// + /// Source IP Address Limit List Item + /// + public class VpnAc + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// Priority + /// + public uint Priority_u32; + + /// + /// Deny access + /// + public bool Deny_bool; + + /// + /// Set true if you want to specify the SubnetMask_ip item. + /// + public bool Masked_bool; + + /// + /// IP address + /// + public string IpAddress_ip; + + /// + /// Subnet mask, valid only if Masked_bool == true + /// + public string SubnetMask_ip; + } + + /// + /// Source IP Address Limit List + /// + public class VpnRpcAcList + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Source IP Address Limit List + /// + public VpnAc[] ACList; + } + + /// + /// Message + /// + public class VpnRpcMsg + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Message (Unicode strings acceptable) + /// + public byte[] Msg_bin; + } + + /// + /// Get / Set the Azure state + /// + public class VpnRpcAzureStatus + { + /// + /// Whether VPN Azure Function is Enabled + /// + public bool IsEnabled_bool; + + /// + /// Whether connection to VPN Azure Cloud Server is established + /// + public bool IsConnected_bool; + } + + /// + /// Local Bridge support information + /// + public class VpnRpcBridgeSupport + { + /// + /// Whether the OS supports the Local Bridge function + /// + public bool IsBridgeSupportedOs_bool; + + /// + /// Whether WinPcap is necessary to install + /// + public bool IsWinPcapNeeded_bool; + } + + /// + /// Get the CA of HUB + /// + public class VpnRpcHubGetCA + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The key id of the certificate + /// + public uint Key_u32; + + /// + /// The body of the X.509 certificate + /// + public byte[] Cert_bin; + } + + /// + /// Caps item of the VPN Server + /// + public class VpnCaps + { + /// + /// Name + /// + public string CapsName_str; + + /// + /// Value + /// + public uint CapsValue_u32; + + /// + /// Descrption + /// + public string CapsDescrption_utf; + } + + /// + /// Caps list of the VPN Server + /// + public class VpnCapslist + { + /// + /// Caps list of the VPN Server + /// + public VpnCaps[] CapsList; + } + + /// + /// Config operation + /// + public class VpnRpcConfig + { + /// + /// File name (valid only for returning from the server) + /// + public string FileName_str; + + /// + /// File data + /// + public byte[] FileData_bin; + } + + /// + /// Connection information + /// + public class VpnRpcConnectionInfo + { + /// + /// Connection name + /// + public string Name_str; + + /// + /// Type + /// + public VpnRpcConnectionType Type_u32; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Port number + /// + public uint Port_u32; + + /// + /// Connected time + /// + public DateTime ConnectedTime_dt; + + /// + /// Server string + /// + public string ServerStr_str; + + /// + /// Server version + /// + public uint ServerVer_u32; + + /// + /// Server build number + /// + public uint ServerBuild_u32; + + /// + /// Client string + /// + public string ClientStr_str; + + /// + /// Client version + /// + public uint ClientVer_u32; + + /// + /// Client build number + /// + public uint ClientBuild_u32; + } + + /// + /// Proxy type + /// + public enum VpnRpcProxyType + { + /// + /// Direct TCP connection + /// + Direct = 0, + + /// + /// Connection via HTTP proxy server + /// + HTTP = 1, + + /// + /// Connection via SOCKS proxy server + /// + SOCKS = 2, + } + + /// + /// The current status of the DDNS + /// + public class VpnDDnsClientStatus + { + /// + /// Last error code (IPv4) + /// + public uint Err_IPv4_u32; + + /// + /// Last error string (IPv4) + /// + public string ErrStr_IPv4_utf; + + /// + /// Last error code (IPv6) + /// + public uint Err_IPv6_u32; + + /// + /// Last error string (IPv6) + /// + public string ErrStr_IPv6_utf; + + /// + /// Current DDNS host name + /// + public string CurrentHostName_str; + + /// + /// Current FQDN of the DDNS hostname + /// + public string CurrentFqdn_str; + + /// + /// DDNS suffix + /// + public string DnsSuffix_str; + + /// + /// Current IPv4 address of the VPN Server + /// + public string CurrentIPv4_str; + + /// + /// Current IPv6 address of the VPN Server + /// + public string CurrentIPv6_str; + } + + /// + /// Internet connection settings + /// + public class VpnInternetSetting + { + /// + /// Type of proxy server + /// + public VpnRpcProxyType ProxyType_u32; + + /// + /// Proxy server host name + /// + public string ProxyHostName_str; + + /// + /// Proxy server port number + /// + public uint ProxyPort_u32; + + /// + /// Proxy server user name + /// + public string ProxyUsername_str; + + /// + /// Proxy server password + /// + public string ProxyPassword_str; + } + + /// + /// Administration options + /// + public class VpnAdminOption + { + /// + /// Name + /// + public string Name_str; + + /// + /// Data + /// + public uint Value_u32; + + /// + /// Descrption + /// + public string Descrption_utf; + } + + /// + /// Administration options list + /// + public class VpnRpcAdminOption + { + /// + /// Virtual HUB name + /// + public string HubName_str; + + /// + /// List data + /// + public VpnAdminOption[] AdminOptionList; + } + + /// + /// Connection state to the controller + /// + public class VpnRpcFarmConnectionStatus + { + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Port number + /// + public uint Port_u32; + + /// + /// Online state + /// + public bool Online_bool; + + /// + /// Last error code + /// + public uint LastError_u32; + + /// + /// Connection start time + /// + public DateTime StartedTime_dt; + + /// + /// First connection time + /// + public DateTime FirstConnectedTime_dt; + + /// + /// Connection time of this time + /// + public DateTime CurrentConnectedTime_dt; + + /// + /// Number of retries + /// + public uint NumTry_u32; + + /// + /// Number of connection count + /// + public uint NumConnected_u32; + + /// + /// Connection failure count + /// + public uint NumFailed_u32; + } + + /// + /// HUB item of each farm member + /// + public class VpnRpcFarmHub + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Dynamic HUB + /// + public bool DynamicHub_bool; + } + + + /// + /// Server farm member information acquisition + /// + public class VpnRpcFarmInfo + { + /// + /// ID + /// + public uint Id_u32; + + /// + /// The flag if the server is Cluster Controller (false: Cluster Member servers) + /// + public bool Controller_bool; + + /// + /// Connection Established Time + /// + public DateTime ConnectedTime_dt; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Host name + /// + public string Hostname_str; + + /// + /// Point + /// + public uint Point_u32; + + /// + /// Number of Public Ports + /// + public uint NumPort_u32; + + /// + /// Public Ports + /// + public uint[] Ports_u32; + + /// + /// Server certificate + /// + public byte[] ServerCert_bin; + + /// + /// Number of farm HUB + /// + public uint NumFarmHub_u32; + + /// + /// The hosted Virtual Hub list + /// + public VpnRpcFarmHub[] HubsList; + + /// + /// Number of hosted VPN sessions + /// + public uint NumSessions_u32; + + /// + /// Number of TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Performance Standard Ratio + /// + public uint Weight_u32; + } + + /// + /// Server farm configuration + /// + public class VpnRpcFarm + { + /// + /// Type of server + /// + public VpnRpcServerType ServerType_u32; + + /// + /// Valid only for Cluster Member servers. Number of the Ports_u32 element. + /// + public uint NumPort_u32; + + /// + /// Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers. + /// + public uint[] Ports_u32; + + /// + /// Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used. + /// + public string PublicIp_ip; + + /// + /// Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller. + /// + public string ControllerName_str; + + /// + /// Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller. + /// + public uint ControllerPort_u32; + + /// + /// Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller. + /// + public string MemberPasswordPlaintext_str; + + /// + /// This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used. + /// + public uint Weight_u32; + + /// + /// Valid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments. + /// + public bool ControllerOnly_bool; + } + + /// + /// Log switch type + /// + public enum VpnRpcLogSwitchType + { + /// + /// No switching + /// + No = 0, + + /// + /// Secondly basis + /// + Second = 1, + + /// + /// Minutely basis + /// + Minute = 2, + + /// + /// Hourly basis + /// + Hour = 3, + + /// + /// Daily basis + /// + Day = 4, + + /// + /// Monthly basis + /// + Month = 5, + } + + /// + /// Packet log settings + /// + public enum VpnRpcPacketLogSetting + { + /// + /// Not save + /// + None = 0, + + /// + /// Only header + /// + Header = 1, + + /// + /// All payloads + /// + All = 2, + } + + /// + /// Packet log settings array index + /// + public enum VpnRpcPacketLogSettingIndex + { + /// + /// TCP connection log + /// + TcpConnection = 0, + + /// + /// TCP packet log + /// + TcpAll = 1, + + /// + /// DHCP Log + /// + Dhcp = 2, + + /// + /// UDP log + /// + Udp = 3, + + /// + /// ICMP log + /// + Icmp = 4, + + /// + /// IP log + /// + Ip = 5, + + /// + /// ARP log + /// + Arp = 6, + + /// + /// Ethernet log + /// + Ethernet = 7, + } + + /// + /// HUB log settings + /// + public class VpnRpcHubLog + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The flag to enable / disable saving the security log + /// + public bool SaveSecurityLog_bool; + + /// + /// The log filename switching setting of the security log + /// + public VpnRpcLogSwitchType SecurityLogSwitchType_u32; + + /// + /// The flag to enable / disable saving the security log + /// + public bool SavePacketLog_bool; + + /// + /// The log filename switching settings of the packet logs + /// + public VpnRpcLogSwitchType PacketLogSwitchType_u32; + + /// + /// Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7. + /// + public VpnRpcPacketLogSetting[] PacketLogConfig_u32 = new VpnRpcPacketLogSetting[16]; + } + + /// + /// RADIUS server options + /// + public class VpnRpcRadius + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// RADIUS server name + /// + public string RadiusServerName_str; + + /// + /// RADIUS port number + /// + public uint RadiusPort_u32; + + /// + /// Secret key + /// + public string RadiusSecret_str; + + /// + /// Radius retry interval + /// + public uint RadiusRetryInterval_u32; + } + + /// + /// Get the state HUB + /// + public class VpnRpcHubStatus + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Online + /// + public bool Online_bool; + + /// + /// Type of HUB + /// + public VpnRpcHubType HubType_u32; + + /// + /// Number of sessions + /// + public uint NumSessions_u32; + + /// + /// Number of sessions (client mode) + /// + public uint NumSessionsClient_u32; + + /// + /// Number of sessions (bridge mode) + /// + public uint NumSessionsBridge_u32; + + /// + /// Number of Access list entries + /// + public uint NumAccessLists_u32; + + /// + /// Number of users + /// + public uint NumUsers_u32; + + /// + /// Number of groups + /// + public uint NumGroups_u32; + + /// + /// Number of MAC table entries + /// + public uint NumMacTables_u32; + + /// + /// Number of IP table entries + /// + public uint NumIpTables_u32; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + + /// + /// Whether SecureNAT is enabled + /// + public bool SecureNATEnabled_bool; + + /// + /// Last communication date and time + /// + public DateTime LastCommTime_dt; + + /// + /// Last login date and time + /// + public DateTime LastLoginTime_dt; + + /// + /// Creation date and time + /// + public DateTime CreatedTime_dt; + + /// + /// Number of logins + /// + public uint NumLogin_u32; + } + + /// + /// List of services provided by IPsec server + /// + public class VpnIPsecServices + { + /// + /// Enable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option. + /// + public bool L2TP_Raw_bool; + + /// + /// Enable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option. + /// + public bool L2TP_IPsec_bool; + + /// + /// Enable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging. + /// + public bool EtherIP_IPsec_bool; + + /// + /// Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters. + /// + public string IPsec_Secret_str; + + /// + /// Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target. + /// + public string L2TP_DefaultHub_str; + } + + /// + /// Keep alive protocol + /// + public enum VpnRpcKeepAliveProtocol + { + /// + /// TCP + /// + TCP = 0, + + /// + /// UDP + /// + UDP = 1, + } + + /// + /// Keep Alive settings + /// + public class VpnRpcKeep + { + /// + /// The flag to enable keep-alive to the Internet + /// + public bool UseKeepConnect_bool; + + /// + /// Specify the host name or IP address of the destination + /// + public string KeepConnectHost_str; + + /// + /// Specify the port number of the destination + /// + public uint KeepConnectPort_u32; + + /// + /// Protocol type + /// + public VpnRpcKeepAliveProtocol KeepConnectProtocol_u32; + + /// + /// Interval Between Packets Sends (Seconds) + /// + public uint KeepConnectInterval_u32; + } + + /// + /// State of the client session + /// + public enum VpnRpcClientSessionStatus + { + /// + /// Connecting + /// + Connecting = 0, + + /// + /// Negotiating + /// + Negotiation = 1, + + /// + /// During user authentication + /// + Auth = 2, + + /// + /// Connection complete + /// + Established = 3, + + /// + /// Wait to retry + /// + Retry = 4, + + /// + /// Idle state + /// + Idle = 5, + } + + /// + /// Get the link state + /// + public class VpnRpcLinkStatus + { + /// + /// The Virtual Hub name + /// + public string HubName_Ex_str; + + /// + /// The name of the cascade connection + /// + public string AccountName_utf; + + /// + /// The flag whether the cascade connection is enabled + /// + public bool Active_bool; + + /// + /// The flag whether the cascade connection is established + /// + public bool Connected_bool; + + /// + /// The session status + /// + public VpnRpcClientSessionStatus SessionStatus_u32; + + /// + /// The destination VPN server name + /// + public string ServerName_str; + + /// + /// The port number of the server + /// + public uint ServerPort_u32; + + /// + /// Server product name + /// + public string ServerProductName_str; + + /// + /// Server product version + /// + public uint ServerProductVer_u32; + + /// + /// Server product build number + /// + public uint ServerProductBuild_u32; + + /// + /// Server's X.509 certificate + /// + public byte[] ServerX_bin; + + /// + /// Client certificate + /// + public byte[] ClientX_bin; + + /// + /// Connection start time + /// + public DateTime StartTime_dt; + + /// + /// Connection completion time of the first connection + /// + public DateTime FirstConnectionEstablisiedTime_dt; + + /// + /// Connection completion time of this connection + /// + public DateTime CurrentConnectionEstablishTime_dt; + + /// + /// Number of connections have been established so far + /// + public uint NumConnectionsEatablished_u32; + + /// + /// Half-connection + /// + public bool HalfConnection_bool; + + /// + /// VoIP / QoS + /// + public bool QoS_bool; + + /// + /// Maximum number of the underlying TCP connections + /// + public uint MaxTcpConnections_u32; + + /// + /// Number of current underlying TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Number of underlying inbound TCP connections + /// + public uint NumTcpConnectionsUpload_u32; + + /// + /// Number of underlying outbound TCP connections + /// + public uint NumTcpConnectionsDownload_u32; + + /// + /// Use of encryption + /// + public bool UseEncrypt_bool; + + /// + /// Cipher algorithm name + /// + public string CipherName_str; + + /// + /// Use of compression + /// + public bool UseCompress_bool; + + /// + /// The flag whether this is a R-UDP session + /// + public bool IsRUDPSession_bool; + + /// + /// Underlying physical communication protocol + /// + public string UnderlayProtocol_str; + + /// + /// The UDP acceleration is enabled + /// + public bool IsUdpAccelerationEnabled_bool; + + /// + /// The UDP acceleration is being actually used + /// + public bool IsUsingUdpAcceleration_bool; + + /// + /// Session name + /// + public string SessionName_str; + + /// + /// Connection name + /// + public string ConnectionName_str; + + /// + /// Session key + /// + public byte[] SessionKey_bin; + + /// + /// Total transmitted data size + /// + public ulong TotalSendSize_u64; + + /// + /// Total received data size + /// + public ulong TotalRecvSize_u64; + + /// + /// Total transmitted data size (no compression) + /// + public ulong TotalSendSizeReal_u64; + + /// + /// Total received data size (no compression) + /// + public ulong TotalRecvSizeReal_u64; + + /// + /// The flag whether the VPN session is Bridge Mode + /// + public bool IsBridgeMode_bool; + + /// + /// The flag whether the VPN session is Monitor mode + /// + public bool IsMonitorMode_bool; + + /// + /// VLAN ID + /// + public uint VLanId_u32; + } + + /// + /// Setting of SSTP and OpenVPN + /// + public class VpnOpenVpnSstpConfig + { + /// + /// Specify true to enable the OpenVPN Clone Server Function. Specify false to disable. + /// + public bool EnableOpenVPN_bool; + + /// + /// Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports. + /// + public string OpenVPNPortList_str; + + /// + /// pecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable. + /// + public bool EnableSSTP_bool; + } + + /// + /// Virtual host option + /// + public class VpnVhOption + { + /// + /// Target Virtual HUB name + /// + public string RpcHubName_str; + + /// + /// MAC address + /// + public byte[] MacAddress_bin; + + /// + /// IP address + /// + public string Ip_ip; + + /// + /// Subnet mask + /// + public string Mask_ip; + + /// + /// Use flag of the Virtual NAT function + /// + public bool UseNat_bool; + + /// + /// MTU value (Standard: 1500) + /// + public uint Mtu_u32; + + /// + /// NAT TCP timeout in seconds + /// + public uint NatTcpTimeout_u32; + + /// + /// NAT UDP timeout in seconds + /// + public uint NatUdpTimeout_u32; + + /// + /// Using flag of DHCP function + /// + public bool UseDhcp_bool; + + /// + /// Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10) + /// + public string DhcpLeaseIPStart_ip; + + /// + /// Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200) + /// + public string DhcpLeaseIPEnd_ip; + + /// + /// Specify the subnet mask to be specified for the client. (Example: 255.255.255.0) + /// + public string DhcpSubnetMask_ip; + + /// + /// Specify the expiration date in second units for leasing an IP address to a client. + /// + public uint DhcpExpireTimeSpan_u32; + + /// + /// Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway. + /// + public string DhcpGatewayAddress_ip; + + /// + /// Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. + /// + public string DhcpDnsServerAddress_ip; + + /// + /// Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address. + /// + public string DhcpDnsServerAddress2_ip; + + /// + /// Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name. + /// + public string DhcpDomainName_str; + + /// + /// Specify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting. + /// + public bool SaveLog_bool; + + /// + /// The flag to enable the DhcpPushRoutes_str field. + /// + public bool ApplyDhcpPushRoutes_bool; + + /// + /// Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes. + /// + public string DhcpPushRoutes_str; + } + + /// + /// RPC_NAT_STATUS + /// + public class VpnRpcNatStatus + { + /// + /// Virtual Hub Name + /// + public string HubName_str; + + /// + /// Number of TCP sessions + /// + public uint NumTcpSessions_u32; + + /// + /// Ntmber of UDP sessions + /// + public uint NumUdpSessions_u32; + + /// + /// Nymber of ICMP sessions + /// + public uint NumIcmpSessions_u32; + + /// + /// Number of DNS sessions + /// + public uint NumDnsSessions_u32; + + /// + /// Number of DHCP clients + /// + public uint NumDhcpClients_u32; + + /// + /// Whether the NAT is operating in the Kernel Mode + /// + public bool IsKernelMode_bool; + + /// + /// Whether the NAT is operating in the Raw IP Mode + /// + public bool IsRawIpMode_bool; + } + + /// + /// Key pair + /// + public class VpnRpcKeyPair + { + /// + /// The body of the certificate + /// + public byte[] Cert_bin; + + /// + /// The body of the private key + /// + public byte[] Key_bin; + } + + /// + /// Single string value + /// + public class VpnRpcStr + { + /// + /// A string value + /// + public string String_str; + } + + /// + /// Type of VPN Server + /// + public enum VpnRpcServerType + { + /// + /// Stand-alone server + /// + Standalone = 0, + + /// + /// Farm controller server + /// + FarmController = 1, + + /// + /// Farm member server + /// + FarmMember = 2, + } + + /// + /// Operating system type + /// + public enum VpnRpcOsType + { + /// + /// Windows 95 + /// + WINDOWS_95 = 1100, + + /// + /// Windows 98 + /// + WINDOWS_98 = 1200, + + /// + /// Windows Me + /// + WINDOWS_ME = 1300, + + /// + /// Windows (unknown) + /// + WINDOWS_UNKNOWN = 1400, + + /// + /// Windows NT 4.0 Workstation + /// + WINDOWS_NT_4_WORKSTATION = 2100, + + /// + /// Windows NT 4.0 Server + /// + WINDOWS_NT_4_SERVER = 2110, + + /// + /// Windows NT 4.0 Server, Enterprise Edition + /// + WINDOWS_NT_4_SERVER_ENTERPRISE = 2111, + + /// + /// Windows NT 4.0 Terminal Server + /// + WINDOWS_NT_4_TERMINAL_SERVER = 2112, + + /// + /// BackOffice Server 4.5 + /// + WINDOWS_NT_4_BACKOFFICE = 2113, + + /// + /// Small Business Server 4.5 + /// + WINDOWS_NT_4_SMS = 2114, + + /// + /// Windows 2000 Professional + /// + WINDOWS_2000_PROFESSIONAL = 2200, + + /// + /// Windows 2000 Server + /// + WINDOWS_2000_SERVER = 2211, + + /// + /// Windows 2000 Advanced Server + /// + WINDOWS_2000_ADVANCED_SERVER = 2212, + + /// + /// Windows 2000 Datacenter Server + /// + WINDOWS_2000_DATACENTER_SERVER = 2213, + + /// + /// BackOffice Server 2000 + /// + WINDOWS_2000_BACKOFFICE = 2214, + + /// + /// Small Business Server 2000 + /// + WINDOWS_2000_SBS = 2215, + + /// + /// Windows XP Home Edition + /// + WINDOWS_XP_HOME = 2300, + + /// + /// Windows XP Professional + /// + WINDOWS_XP_PROFESSIONAL = 2301, + + /// + /// Windows Server 2003 Web Edition + /// + WINDOWS_2003_WEB = 2410, + + /// + /// Windows Server 2003 Standard Edition + /// + WINDOWS_2003_STANDARD = 2411, + + /// + /// Windows Server 2003 Enterprise Edition + /// + WINDOWS_2003_ENTERPRISE = 2412, + + /// + /// Windows Server 2003 DataCenter Edition + /// + WINDOWS_2003_DATACENTER = 2413, + + /// + /// BackOffice Server 2003 + /// + WINDOWS_2003_BACKOFFICE = 2414, + + /// + /// Small Business Server 2003 + /// + WINDOWS_2003_SBS = 2415, + + /// + /// Windows Vista + /// + WINDOWS_LONGHORN_PROFESSIONAL = 2500, + + /// + /// Windows Server 2008 + /// + WINDOWS_LONGHORN_SERVER = 2510, + + /// + /// Windows 7 + /// + WINDOWS_7 = 2600, + + /// + /// Windows Server 2008 R2 + /// + WINDOWS_SERVER_2008_R2 = 2610, + + /// + /// Windows 8 + /// + WINDOWS_8 = 2700, + + /// + /// Windows Server 2012 + /// + WINDOWS_SERVER_8 = 2710, + + /// + /// Windows 8.1 + /// + WINDOWS_81 = 2701, + + /// + /// Windows Server 2012 R2 + /// + WINDOWS_SERVER_81 = 2711, + + /// + /// Windows 10 + /// + WINDOWS_10 = 2702, + + /// + /// Windows Server 10 + /// + WINDOWS_SERVER_10 = 2712, + + /// + /// Windows 11 or later + /// + WINDOWS_11 = 2800, + + /// + /// Windows Server 11 or later + /// + WINDOWS_SERVER_11 = 2810, + + /// + /// Unknown UNIX + /// + UNIX_UNKNOWN = 3000, + + /// + /// Linux + /// + LINUX = 3100, + + /// + /// Solaris + /// + SOLARIS = 3200, + + /// + /// Cygwin + /// + CYGWIN = 3300, + + /// + /// BSD + /// + BSD = 3400, + + /// + /// MacOS X + /// + MACOS_X = 3500, + } + + /// + /// VPN Server Information + /// + public class VpnRpcServerInfo + { + /// + /// Server product name + /// + public string ServerProductName_str; + + /// + /// Server version string + /// + public string ServerVersionString_str; + + /// + /// Server build information string + /// + public string ServerBuildInfoString_str; + + /// + /// Server version integer value + /// + public uint ServerVerInt_u32; + + /// + /// Server build number integer value + /// + public uint ServerBuildInt_u32; + + /// + /// Server host name + /// + public string ServerHostName_str; + + /// + /// Type of server + /// + public VpnRpcServerType ServerType_u32; + + /// + /// Build date and time of the server + /// + public DateTime ServerBuildDate_dt; + + /// + /// Family name + /// + public string ServerFamilyName_str; + + /// + /// OS type + /// + public VpnRpcOsType OsType_u32; + + /// + /// Service pack number + /// + public uint OsServicePack_u32; + + /// + /// OS system name + /// + public string OsSystemName_str; + + /// + /// OS product name + /// + public string OsProductName_str; + + /// + /// OS vendor name + /// + public string OsVendorName_str; + + /// + /// OS version + /// + public string OsVersion_str; + + /// + /// Kernel name + /// + public string KernelName_str; + + /// + /// Kernel version + /// + public string KernelVersion_str; + } + + /// + /// Server status + /// + public class VpnRpcServerStatus + { + /// + /// Type of server + /// + public VpnRpcServerType ServerType_u32; + + /// + /// Total number of TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Number of Local TCP connections + /// + public uint NumTcpConnectionsLocal_u32; + + /// + /// Number of remote TCP connections + /// + public uint NumTcpConnectionsRemote_u32; + + /// + /// Total number of HUBs + /// + public uint NumHubTotal_u32; + + /// + /// Nymber of stand-alone HUB + /// + public uint NumHubStandalone_u32; + + /// + /// Number of static HUBs + /// + public uint NumHubStatic_u32; + + /// + /// Number of Dynamic HUBs + /// + public uint NumHubDynamic_u32; + + /// + /// Total number of sessions + /// + public uint NumSessionsTotal_u32; + + /// + /// Number of local VPN sessions + /// + public uint NumSessionsLocal_u32; + + /// + /// The number of remote sessions + /// + public uint NumSessionsRemote_u32; + + /// + /// Number of MAC table entries (total sum of all Virtual Hubs) + /// + public uint NumMacTables_u32; + + /// + /// Number of IP table entries (total sum of all Virtual Hubs) + /// + public uint NumIpTables_u32; + + /// + /// Number of users (total sum of all Virtual Hubs) + /// + public uint NumUsers_u32; + + /// + /// Number of groups (total sum of all Virtual Hubs) + /// + public uint NumGroups_u32; + + /// + /// Number of assigned bridge licenses (Useful to make a commercial version) + /// + public uint AssignedBridgeLicenses_u32; + + /// + /// Number of assigned client licenses (Useful to make a commercial version) + /// + public uint AssignedClientLicenses_u32; + + /// + /// Number of Assigned bridge license (cluster-wide), useful to make a commercial version + /// + public uint AssignedBridgeLicensesTotal_u32; + + /// + /// Number of assigned client licenses (cluster-wide), useful to make a commercial version + /// + public uint AssignedClientLicensesTotal_u32; + + /// + /// Number of broadcast packets (Recv) + /// + [JsonProperty("Recv.BroadcastBytes_u64")] + public ulong Recv_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Recv) + /// + [JsonProperty("Recv.BroadcastCount_u64")] + public ulong Recv_BroadcastCount_u64; + + /// + /// Unicast count (Recv) + /// + [JsonProperty("Recv.UnicastBytes_u64")] + public ulong Recv_UnicastBytes_u64; + + /// + /// Unicast bytes (Recv) + /// + [JsonProperty("Recv.UnicastCount_u64")] + public ulong Recv_UnicastCount_u64; + + /// + /// Number of broadcast packets (Send) + /// + [JsonProperty("Send.BroadcastBytes_u64")] + public ulong Send_BroadcastBytes_u64; + + /// + /// Broadcast bytes (Send) + /// + [JsonProperty("Send.BroadcastCount_u64")] + public ulong Send_BroadcastCount_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastBytes_u64")] + public ulong Send_UnicastBytes_u64; + + /// + /// Unicast bytes (Send) + /// + [JsonProperty("Send.UnicastCount_u64")] + public ulong Send_UnicastCount_u64; + + /// + /// Current time + /// + public DateTime CurrentTime_dt; + + /// + /// 64 bit High-Precision Logical System Clock + /// + public ulong CurrentTick_u64; + + /// + /// VPN Server Start-up time + /// + public DateTime StartTime_dt; + + /// + /// Memory information: Total Memory + /// + public ulong TotalMemory_u64; + + /// + /// Memory information: Used Memory + /// + public ulong UsedMemory_u64; + + /// + /// Memory information: Free Memory + /// + public ulong FreeMemory_u64; + + /// + /// Memory information: Total Phys + /// + public ulong TotalPhys_u64; + + /// + /// Memory information: Used Phys + /// + public ulong UsedPhys_u64; + + /// + /// Memory information: Free Phys + /// + public ulong FreePhys_u64; + } + + /// + /// VPN Session status + /// + public class VpnRpcSessionStatus + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// VPN session name + /// + public string Name_str; + + /// + /// User name + /// + public string Username_str; + + /// + /// Real user name which was used for the authentication + /// + public string RealUsername_str; + + /// + /// Group name + /// + public string GroupName_str; + + /// + /// Is Cascade Session + /// + public bool LinkMode_bool; + + /// + /// Client IP address + /// + public string Client_Ip_Address_ip; + + /// + /// Client host name + /// + [JsonProperty("SessionStatus_ClientHostName_str")] + public string ClientHostName_str; + + /// + /// Operation flag + /// + public bool Active_bool; + + /// + /// Connected flag + /// + public bool Connected_bool; + + /// + /// State of the client session + /// + public VpnRpcClientSessionStatus SessionStatus_u32; + + /// + /// Server name + /// + public string ServerName_str; + + /// + /// Port number of the server + /// + public uint ServerPort_u32; + + /// + /// Server product name + /// + public string ServerProductName_str; + + /// + /// Server product version + /// + public uint ServerProductVer_u32; + + /// + /// Server product build number + /// + public uint ServerProductBuild_u32; + + /// + /// Connection start time + /// + public DateTime StartTime_dt; + + /// + /// Connection completion time of the first connection + /// + public DateTime FirstConnectionEstablisiedTime_dt; + + /// + /// Connection completion time of this connection + /// + public DateTime CurrentConnectionEstablishTime_dt; + + /// + /// Number of connections have been established so far + /// + public uint NumConnectionsEatablished_u32; + + /// + /// Half-connection + /// + public bool HalfConnection_bool; + + /// + /// VoIP / QoS + /// + public bool QoS_bool; + + /// + /// Maximum number of the underlying TCP connections + /// + public uint MaxTcpConnections_u32; + + /// + /// Number of current underlying TCP connections + /// + public uint NumTcpConnections_u32; + + /// + /// Number of inbound underlying connections + /// + public uint NumTcpConnectionsUpload_u32; + + /// + /// Number of outbound underlying connections + /// + public uint NumTcpConnectionsDownload_u32; + + /// + /// Use of encryption + /// + public bool UseEncrypt_bool; + + /// + /// Cipher algorithm name + /// + public string CipherName_str; + + /// + /// Use of compression + /// + public bool UseCompress_bool; + + /// + /// Is R-UDP session + /// + public bool IsRUDPSession_bool; + + /// + /// Physical underlying communication protocol + /// + public string UnderlayProtocol_str; + + /// + /// The UDP acceleration is enabled + /// + public bool IsUdpAccelerationEnabled_bool; + + /// + /// Using the UDP acceleration function + /// + public bool IsUsingUdpAcceleration_bool; + + /// + /// VPN session name + /// + public string SessionName_str; + + /// + /// Connection name + /// + public string ConnectionName_str; + + /// + /// Session key + /// + public byte[] SessionKey_bin; + + /// + /// Total transmitted data size + /// + public ulong TotalSendSize_u64; + + /// + /// Total received data size + /// + public ulong TotalRecvSize_u64; + + /// + /// Total transmitted data size (no compression) + /// + public ulong TotalSendSizeReal_u64; + + /// + /// Total received data size (no compression) + /// + public ulong TotalRecvSizeReal_u64; + + /// + /// Is Bridge Mode + /// + public bool IsBridgeMode_bool; + + /// + /// Is Monitor mode + /// + public bool IsMonitorMode_bool; + + /// + /// VLAN ID + /// + public uint VLanId_u32; + + /// + /// Client product name + /// + public string ClientProductName_str; + + /// + /// Client version + /// + public uint ClientProductVer_u32; + + /// + /// Client build number + /// + public uint ClientProductBuild_u32; + + /// + /// Client OS name + /// + public string ClientOsName_str; + + /// + /// Client OS version + /// + public string ClientOsVer_str; + + /// + /// Client OS Product ID + /// + public string ClientOsProductId_str; + + /// + /// Client host name + /// + public string ClientHostname_str; + + /// + /// Unique ID + /// + public byte[] UniqueId_bin; + } + + /// + /// Set the special listener + /// + public class VpnRpcSpecialListener + { + /// + /// The flag to activate the VPN over ICMP server function + /// + public bool VpnOverIcmpListener_bool; + + /// + /// The flag to activate the VPN over DNS function + /// + public bool VpnOverDnsListener_bool; + } + + /// + /// Syslog configuration + /// + public enum VpnSyslogSaveType + { + /// + /// Do not use syslog + /// + None = 0, + + /// + /// Only server log + /// + ServerLog = 1, + + /// + /// Server and Virtual HUB security log + /// + ServerAndHubSecurityLog = 2, + + /// + /// Server, Virtual HUB security, and packet log + /// + ServerAndHubAllLog = 3, + } + + /// + /// Syslog configuration + /// + public class VpnSyslogSetting + { + /// + /// The behavior of the syslog function + /// + public VpnSyslogSaveType SaveType_u32; + + /// + /// Specify the host name or IP address of the syslog server + /// + public string Hostname_str; + + /// + /// Specify the port number of the syslog server + /// + public uint Port_u32; + } + + /// + /// VPN Gate Server Config + /// + public class VpnVgsConfig + { + /// + /// Active flag + /// + public bool IsEnabled_bool; + + /// + /// Message + /// + public string Message_utf; + + /// + /// Owner name + /// + public string Owner_utf; + + /// + /// Abuse email + /// + public string Abuse_utf; + + /// + /// Log save flag + /// + public bool NoLog_bool; + + /// + /// Save log permanently + /// + public bool LogPermanent_bool; + + /// + /// Enable the L2TP VPN function + /// + public bool EnableL2TP_bool; + } + + /// + /// Read a Log file + /// + public class VpnRpcReadLogFile + { + /// + /// Server name + /// + public string ServerName_str; + + /// + /// File Path + /// + public string FilePath_str; + + /// + /// Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field. + /// + public uint Offset_u32; + + /// + /// Received buffer + /// + public byte[] Buffer_bin; + } + + /// + /// Rename link + /// + public class VpnRpcRenameLink + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// The old name of the cascade connection + /// + public string OldAccountName_utf; + + /// + /// The new name of the cascade connection + /// + public string NewAccountName_utf; + } + + /// + /// Online or offline the HUB + /// + public class VpnRpcSetHubOnline + { + /// + /// The Virtual Hub name + /// + public string HubName_str; + + /// + /// Online / offline flag + /// + public bool Online_bool; + } + + /// + /// Set Password + /// + public class VpnRpcSetPassword + { + /// + /// The plaintext password + /// + public string PlainTextPassword_str; + } + +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpcTest/VpnServerRpcTest.cs softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpcTest/VpnServerRpcTest.cs --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpcTest/VpnServerRpcTest.cs 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/developer_tools/vpnserver-jsonrpc-codegen/VpnServerRpcTest/VpnServerRpcTest.cs 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1,3736 @@ +// SoftEther VPN Server JSON-RPC Stub code for C# +// +// VpnServerRpcTest.cs - Test sample code for SoftEther VPN Server JSON-RPC Stub +// +// This sample code shows how to call all available RPC functions. +// You can copy and paste test code to write your own C# codes. +// +// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen +// +// Licensed under the Apache License 2.0 +// Copyright (c) 2014-__YEAR__ SoftEther VPN Project + +using System; +using SoftEther.VPNServerRpc; + +class VPNRPCTest +{ + VpnServerRpc api; + + Random rand = new Random(); + + string hub_name = "TEST"; + + public VPNRPCTest() + { + api = new VpnServerRpc("127.0.0.1", 443, "PASSWORD_HERE", ""); // Speficy your VPN Server's password here. + } + + /// + /// Tests all VPN APIs + /// + public void Test_All() + { + hub_name = "TEST"; + + Test_Test(); + + Test_GetServerInfo(); + Test_GetServerStatus(); + + uint new_listener_port = Test_CreateListener(); + Test_EnableListener(new_listener_port, false); + Test_EnumListener(); + Test_EnableListener(new_listener_port, true); + Test_EnumListener(); + Test_DeleteListener(new_listener_port); + + Test_SetServerPassword(); + + Test_GetFarmSetting(); + + if (false) + { + + Test_SetFarmSetting(); + + VpnRpcEnumFarm farm_members = Test_EnumFarmMember(); + + foreach (VpnRpcEnumFarmItem farm_member in farm_members.FarmMemberList) + { + Test_GetFarmInfo(farm_member.Id_u32); + } + + Test_GetFarmConnectionStatus(); + } + else if (false) + { + Console.WriteLine("abc"); + } + else + { + Console.WriteLine("def"); + } + + Test_GetServerCert(); + + Test_SetServerCert(); + + Test_GetServerCipher(); + + Test_SetServerCipher(); + + VpnRpcEnumConnection enum_connection = Test_EnumConnection(); + + foreach (VpnRpcEnumConnectionItem connecton in enum_connection.ConnectionList) + { + Test_GetConnectionInfo(connecton.Name_str); + //Test_DisconnectConnection(connecton.Name_str); + } + + hub_name = Test_CreateHub(); + + Test_SetHub(); + Test_GetHub(); + Test_EnumHub(); + Test_SetHubRadius(); + Test_GetHubRadius(); + + Test_SetHubOnline(); + Test_GetHubStatus(); + + VpnRpcHubLog hub_log_settings = Test_GetHubLog(); + Test_SetHubLog(hub_log_settings); + + Test_AddCa(); + VpnRpcHubEnumCA enum_ca = Test_EnumCa(); + foreach (VpnRpcHubEnumCAItem ca in enum_ca.CAList) + { + Test_GetCa(ca.Key_u32); + Test_DeleteCa(ca.Key_u32); + } + + Test_CreateLink(); + Test_GetLink(); + Test_SetLink(); + Test_SetLinkOffline(); + Test_SetLinkOnline(); + VpnRpcEnumLink enum_link = Test_EnumLink(); + foreach (var link in enum_link.LinkList) + { + Test_GetLinkStatus(link.AccountName_utf); + } + System.Threading.Thread.Sleep(3000); + Test_RenameLink(); + Test_DeleteLink(); + + Test_AddAccess(); + Test_EnumAccess(); + Test_DeleteAccess(); + Test_SetAccessList(); + + Test_CreateGroup(); + Test_SetGroup(); + Test_GetGroup(); + + Test_CreateUser(); + Test_SetUser(); + Test_GetUser(); + Test_EnumUser(); + Test_EnumGroup(); + + Test_DeleteUser(); + Test_DeleteGroup(); + + VpnRpcEnumSession enum_session = Test_EnumSession(); + + foreach (VpnRpcEnumSessionItem session in enum_session.SessionList) + { + Test_GetSessionStatus(session.Name_str); + + Test_DeleteSession(session.Name_str); + } + + VpnRpcEnumMacTable enum_mac = Test_EnumMacTable(); + + foreach (VpnRpcEnumMacTableItem mac in enum_mac.MacTable) + { + Test_DeleteMacTable(mac.Key_u32); + } + + VpnRpcEnumIpTable enum_ip = Test_EnumIpTable(); + + foreach (VpnRpcEnumIpTableItem ip in enum_ip.IpTable) + { + Test_DeleteIpTable(ip.Key_u32); + } + + Test_SetKeep(); + Test_GetKeep(); + + Test_EnableSecureNAT(); + Test_GetSecureNATOption(); + Test_SetSecureNATOption(); + Test_EnumNAT(); + Test_EnumDHCP(); + Test_GetSecureNATStatus(); + Test_DisableSecureNAT(); + + Test_EnumEthernet(); + //Test_AddLocalBridge(); + Test_EnumLocalBridge(); + //Test_DeleteLocalBridge(); + Test_GetBridgeSupport(); + + Test_GetCaps(); + Test_GetConfig(); + //Test_SetConfig(); + + Test_GetDefaultHubAdminOptions(); + Test_GetHubAdminOptions(); + Test_SetHubAdminOptions(); + Test_GetHubExtOptions(); + Test_SetHubExtOptions(); + + Test_AddL3Switch(); + Test_AddL3If(); + Test_EnumL3Switch(); + Test_EnumL3If(); + Test_AddL3Table(); + Test_EnumL3Table(); + Test_DelL3Table(); + Test_StartL3Switch(); + Test_StopL3Switch(); + Test_DelL3If(); + Test_DelL3Switch(); + + Test_AddCrl(); + VpnRpcEnumCrl enum_crl = Test_EnumCrl(); + foreach (VpnRpcEnumCrlItem crl in enum_crl.CRLList) + { + VpnRpcCrl got_crl = Test_GetCrl(crl.Key_u32); + + got_crl.CommonName_utf = got_crl.CommonName_utf + "_a"; + Test_SetCrl(got_crl); + } + + enum_crl = Test_EnumCrl(); + foreach (VpnRpcEnumCrlItem crl in enum_crl.CRLList) + { + Test_DelCrl(crl.Key_u32); + } + + Test_SetAcList(); + Test_GetAcList(); + + VpnRpcEnumLogFile enum_log_file = Test_EnumLogFile(); + foreach (VpnRpcEnumLogFileItem log in enum_log_file.LogFiles) + { + Test_ReadLogFile(log.FilePath_str); + + break; + } + + Test_SetSysLog(true); + Test_GetSysLog(); + Test_SetSysLog(false); + + Test_SetHubMsg(); + Test_GetHubMsg(); + Test_GetAdminMsg(); + Test_Flush(); + + Test_SetIPsecServices(); + Test_GetIPsecServices(); + + Test_AddEtherIpId(); + VpnRpcEnumEtherIpId enum_etherip_id = Test_EnumEtherIpId(); + foreach (VpnEtherIpId etherip_id in enum_etherip_id.Settings) + { + Test_GetEtherIpId(etherip_id.Id_str); + Test_DeleteEtherIpId(etherip_id.Id_str); + } + + Test_SetOpenVpnSstpConfig(); + Test_GetOpenVpnSstpConfig(); + + Test_GetDDnsClientStatus(); + Test_SetDDnsInternetSettng(); + Test_GetDDnsInternetSettng(); + + Test_ChangeDDnsClientHostname(); + Test_RegenerateServerCert(); + Test_MakeOpenVpnConfigFile(); + Test_SetSpecialListener(); + Test_GetSpecialListener(); + + Test_GetAzureStatus(); + Test_SetAzureStatus(); + Test_SetVgsConfig(); + Test_GetVgsConfig(); + + Test_DeleteHub(); + //Test_RebootServer(); + + return; + } + + + /// + /// API test for 'Test', test RPC function + /// + public void Test_Test() + { + Console.WriteLine("Begin: Test_Test"); + + VpnRpcTest a = new VpnRpcTest() { IntValue_u32 = 12345 }; + + VpnRpcTest b = api.Test(a); + + print_object(b); + + Console.WriteLine("End: Test_Test"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetServerInfo', Get server information + /// + public void Test_GetServerInfo() + { + Console.WriteLine("Begin: Test_GetServerInfo"); + + VpnRpcServerInfo info = api.GetServerInfo(); + + print_object(info); + + Console.WriteLine("End: Test_GetServerInfo"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetServerStatus', Get server status + /// + public void Test_GetServerStatus() + { + Console.WriteLine("Begin: Test_GetServerStatus"); + + VpnRpcServerStatus out_rpc_server_status = api.GetServerStatus(); + + print_object(out_rpc_server_status); + + Console.WriteLine("End: Test_GetServerStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateListener', Create a listener + /// + public uint Test_CreateListener() + { + Console.WriteLine("Begin: Test_CreateListener"); + + uint port = (uint)rand.Next(1025, 65534); + + Console.WriteLine("Creating a new listener port: Port " + port); + VpnRpcListener in_rpc_listener = new VpnRpcListener() { Enable_bool = true, Port_u32 = port, }; + VpnRpcListener out_rpc_listener = api.CreateListener(in_rpc_listener); + + Console.WriteLine("Done."); + Console.WriteLine("End: Test_CreateListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return port; + } + + /// + /// API test for 'EnumListener', Enumerating listeners + /// + public void Test_EnumListener() + { + Console.WriteLine("Begin: Test_EnumListener"); + + VpnRpcListenerList out_rpc_listener_list = api.EnumListener(); + + print_object(out_rpc_listener_list); + + Console.WriteLine("End: Test_EnumListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteListener', Delete a listener + /// + public void Test_DeleteListener(uint port) + { + Console.WriteLine("Begin: Test_DeleteListener"); + + Console.WriteLine("Deleting a new listener port: Port" + port); + VpnRpcListener in_rpc_listener = new VpnRpcListener() { Port_u32 = port }; + VpnRpcListener out_rpc_listener = api.DeleteListener(in_rpc_listener); + + Console.WriteLine("Done."); + Console.WriteLine("End: Test_DeleteListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnableListener', Enable / Disable listener + /// + public void Test_EnableListener(uint port, bool enabled) + { + Console.WriteLine("Begin: Test_EnableListener"); + + if (enabled) + { + Console.WriteLine("Enabling listener port = " + port); + } + else + { + Console.WriteLine("Disabling listener port = " + port); + } + + VpnRpcListener in_rpc_listener = new VpnRpcListener() { Port_u32 = port, Enable_bool = enabled }; + VpnRpcListener out_rpc_listener = api.EnableListener(in_rpc_listener); + + Console.WriteLine("Done."); + + Console.WriteLine("End: Test_EnableListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetServerPassword', Set server password + /// + public void Test_SetServerPassword() + { + string password = "microsoft"; + + Console.WriteLine("Begin: Test_SetServerPassword"); + + Console.WriteLine("Set the server administrator password to '" + password + "'."); + + VpnRpcSetPassword in_rpc_set_password = new VpnRpcSetPassword() { PlainTextPassword_str = password }; + VpnRpcSetPassword out_rpc_set_password = api.SetServerPassword(in_rpc_set_password); + + Console.WriteLine("Done."); + + Console.WriteLine("End: Test_SetServerPassword"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetFarmSetting', Set clustering configuration + /// + public void Test_SetFarmSetting() + { + Console.WriteLine("Begin: Test_SetFarmSetting"); + + VpnRpcFarm in_rpc_farm = new VpnRpcFarm() + { + ServerType_u32 = VpnRpcServerType.FarmController, + NumPort_u32 = 2, + Ports_u32 = new uint[] { 443, 444, 445 }, + PublicIp_ip = "1.2.3.4", + ControllerName_str = "controller", + MemberPasswordPlaintext_str = "microsoft", + ControllerPort_u32 = 443, + Weight_u32 = 100, + ControllerOnly_bool = false, + }; + + VpnRpcFarm out_rpc_farm = api.SetFarmSetting(in_rpc_farm); + + Console.WriteLine("End: Test_SetFarmSetting"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetFarmSetting', Get clustering configuration + /// + public void Test_GetFarmSetting() + { + Console.WriteLine("Begin: Test_GetFarmSetting"); + + // VpnRpcFarm in_rpc_farm = new VpnRpcFarm(); + VpnRpcFarm out_rpc_farm = api.GetFarmSetting(); + + print_object(out_rpc_farm); + + Console.WriteLine("End: Test_GetFarmSetting"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetFarmInfo', Get cluster member information + /// + public void Test_GetFarmInfo(uint id) + { + Console.WriteLine("Begin: Test_GetFarmInfo"); + + VpnRpcFarmInfo in_rpc_farm_info = new VpnRpcFarmInfo() { Id_u32 = id }; + VpnRpcFarmInfo out_rpc_farm_info = api.GetFarmInfo(in_rpc_farm_info); + + print_object(out_rpc_farm_info); + + Console.WriteLine("End: Test_GetFarmInfo"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumFarmMember', Enumerate cluster members + /// + public VpnRpcEnumFarm Test_EnumFarmMember() + { + Console.WriteLine("Begin: Test_EnumFarmMember"); + + VpnRpcEnumFarm out_rpc_enum_farm = api.EnumFarmMember(); + + print_object(out_rpc_enum_farm); + + Console.WriteLine("End: Test_EnumFarmMember"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_farm; + } + + /// + /// API test for 'GetFarmConnectionStatus', Get status of connection to cluster controller + /// + public void Test_GetFarmConnectionStatus() + { + Console.WriteLine("Begin: Test_GetFarmConnectionStatus"); + + VpnRpcFarmConnectionStatus out_rpc_farm_connection_status = api.GetFarmConnectionStatus(); + + print_object(out_rpc_farm_connection_status); + + Console.WriteLine("End: Test_GetFarmConnectionStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetServerCert', Set the server certification + /// + public void Test_SetServerCert() + { + Console.WriteLine("Begin: Test_SetServerCert"); + + VpnRpcKeyPair in_rpc_key_pair = new VpnRpcKeyPair() + { + Cert_bin = new byte[] + { +0x2d,0x2d,0x2d,0x2d,0x2d,0x42,0x45,0x47,0x49,0x4e,0x20,0x43,0x45,0x52,0x54,0x49, +0x46,0x49,0x43,0x41,0x54,0x45,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x4d,0x49,0x49,0x44, +0x72,0x6a,0x43,0x43,0x41,0x70,0x61,0x67,0x41,0x77,0x49,0x42,0x41,0x67,0x49,0x42, +0x41,0x44,0x41,0x4e,0x42,0x67,0x6b,0x71,0x68,0x6b,0x69,0x47,0x39,0x77,0x30,0x42, +0x41,0x51,0x73,0x46,0x41,0x44,0x42,0x57,0x4d,0x51,0x77,0x77,0x43,0x67,0x59,0x44, +0x56,0x51,0x51,0x44,0x44,0x41,0x4e,0x68,0x59,0x57,0x45,0x78,0x0a,0x46,0x54,0x41, +0x54,0x42,0x67,0x4e,0x56,0x42,0x41,0x6f,0x4d,0x44,0x4f,0x4f,0x42,0x72,0x2b,0x4f, +0x42,0x71,0x75,0x4f,0x42,0x6a,0x2b,0x4f,0x42,0x6e,0x54,0x45,0x4c,0x4d,0x41,0x6b, +0x47,0x41,0x31,0x55,0x45,0x42,0x68,0x4d,0x43,0x53,0x6c,0x41,0x78,0x45,0x44,0x41, +0x4f,0x42,0x67,0x4e,0x56,0x42,0x41,0x67,0x4d,0x42,0x30,0x6c,0x69,0x0a,0x59,0x58, +0x4a,0x68,0x61,0x32,0x6b,0x78,0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56,0x42,0x41, +0x63,0x4d,0x42,0x31,0x52,0x7a,0x64,0x57,0x74,0x31,0x59,0x6d,0x45,0x77,0x48,0x68, +0x63,0x4e,0x4d,0x54,0x67,0x78,0x4d,0x44,0x45,0x78,0x4d,0x6a,0x4d,0x7a,0x4e,0x54, +0x41,0x78,0x57,0x68,0x63,0x4e,0x4e,0x44,0x49,0x78,0x4d,0x44,0x41,0x31,0x0a,0x4d, +0x6a,0x4d,0x7a,0x4e,0x54,0x41,0x78,0x57,0x6a,0x42,0x57,0x4d,0x51,0x77,0x77,0x43, +0x67,0x59,0x44,0x56,0x51,0x51,0x44,0x44,0x41,0x4e,0x68,0x59,0x57,0x45,0x78,0x46, +0x54,0x41,0x54,0x42,0x67,0x4e,0x56,0x42,0x41,0x6f,0x4d,0x44,0x4f,0x4f,0x42,0x72, +0x2b,0x4f,0x42,0x71,0x75,0x4f,0x42,0x6a,0x2b,0x4f,0x42,0x6e,0x54,0x45,0x4c,0x0a, +0x4d,0x41,0x6b,0x47,0x41,0x31,0x55,0x45,0x42,0x68,0x4d,0x43,0x53,0x6c,0x41,0x78, +0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56,0x42,0x41,0x67,0x4d,0x42,0x30,0x6c,0x69, +0x59,0x58,0x4a,0x68,0x61,0x32,0x6b,0x78,0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56, +0x42,0x41,0x63,0x4d,0x42,0x31,0x52,0x7a,0x64,0x57,0x74,0x31,0x59,0x6d,0x45,0x77, +0x0a,0x67,0x67,0x45,0x69,0x4d,0x41,0x30,0x47,0x43,0x53,0x71,0x47,0x53,0x49,0x62, +0x33,0x44,0x51,0x45,0x42,0x41,0x51,0x55,0x41,0x41,0x34,0x49,0x42,0x44,0x77,0x41, +0x77,0x67,0x67,0x45,0x4b,0x41,0x6f,0x49,0x42,0x41,0x51,0x44,0x58,0x45,0x63,0x76, +0x72,0x59,0x37,0x56,0x2b,0x7a,0x64,0x42,0x79,0x72,0x64,0x4e,0x78,0x4a,0x59,0x45, +0x6d,0x0a,0x61,0x41,0x4e,0x59,0x55,0x4f,0x37,0x76,0x57,0x34,0x68,0x64,0x41,0x35, +0x49,0x42,0x49,0x46,0x6d,0x4d,0x70,0x6e,0x62,0x79,0x69,0x4e,0x6e,0x5a,0x77,0x36, +0x57,0x39,0x6f,0x61,0x67,0x78,0x33,0x5a,0x49,0x65,0x65,0x48,0x56,0x59,0x62,0x52, +0x69,0x4b,0x36,0x41,0x66,0x46,0x74,0x53,0x31,0x32,0x2b,0x45,0x31,0x4d,0x59,0x31, +0x64,0x32,0x0a,0x61,0x71,0x51,0x31,0x53,0x72,0x49,0x43,0x39,0x51,0x35,0x55,0x6e, +0x5a,0x61,0x42,0x72,0x62,0x57,0x32,0x32,0x6d,0x4e,0x75,0x6c,0x4d,0x34,0x2f,0x6c, +0x49,0x4a,0x72,0x48,0x70,0x51,0x55,0x68,0x50,0x78,0x6f,0x62,0x79,0x34,0x2f,0x36, +0x4e,0x41,0x37,0x71,0x4b,0x67,0x55,0x48,0x69,0x79,0x4f,0x64,0x33,0x4a,0x42,0x70, +0x4f,0x66,0x77,0x0a,0x38,0x54,0x76,0x53,0x74,0x51,0x78,0x34,0x4c,0x38,0x59,0x64, +0x4b,0x51,0x35,0x68,0x74,0x7a,0x6b,0x32,0x68,0x70,0x52,0x4a,0x4c,0x30,0x6c,0x4b, +0x67,0x47,0x31,0x57,0x34,0x75,0x4b,0x32,0x39,0x39,0x42,0x74,0x7a,0x64,0x41,0x67, +0x66,0x42,0x76,0x43,0x54,0x33,0x41,0x31,0x61,0x53,0x70,0x6a,0x49,0x47,0x74,0x6e, +0x69,0x72,0x49,0x31,0x0a,0x46,0x4c,0x52,0x58,0x47,0x79,0x38,0x31,0x31,0x57,0x4a, +0x39,0x4a,0x68,0x68,0x34,0x41,0x4b,0x4c,0x66,0x79,0x56,0x70,0x42,0x4a,0x67,0x65, +0x34,0x73,0x56,0x72,0x36,0x4e,0x75,0x75,0x49,0x66,0x32,0x71,0x47,0x31,0x6f,0x79, +0x31,0x30,0x70,0x61,0x51,0x4e,0x65,0x71,0x32,0x33,0x55,0x47,0x61,0x59,0x74,0x2f, +0x7a,0x55,0x56,0x4a,0x77,0x0a,0x55,0x74,0x30,0x57,0x45,0x6b,0x58,0x38,0x48,0x4f, +0x63,0x62,0x33,0x75,0x49,0x6f,0x54,0x6d,0x61,0x4f,0x34,0x72,0x48,0x42,0x55,0x4a, +0x71,0x45,0x79,0x39,0x51,0x58,0x7a,0x53,0x57,0x77,0x43,0x35,0x78,0x45,0x43,0x64, +0x37,0x43,0x4a,0x53,0x53,0x68,0x31,0x30,0x4f,0x75,0x6e,0x6c,0x75,0x4c,0x32,0x4d, +0x47,0x65,0x5a,0x47,0x6e,0x76,0x0a,0x41,0x67,0x4d,0x42,0x41,0x41,0x47,0x6a,0x67, +0x59,0x59,0x77,0x67,0x59,0x4d,0x77,0x44,0x77,0x59,0x44,0x56,0x52,0x30,0x54,0x41, +0x51,0x48,0x2f,0x42,0x41,0x55,0x77,0x41,0x77,0x45,0x42,0x2f,0x7a,0x41,0x4c,0x42, +0x67,0x4e,0x56,0x48,0x51,0x38,0x45,0x42,0x41,0x4d,0x43,0x41,0x66,0x59,0x77,0x59, +0x77,0x59,0x44,0x56,0x52,0x30,0x6c,0x0a,0x42,0x46,0x77,0x77,0x57,0x67,0x59,0x49, +0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48,0x41,0x77,0x45,0x47,0x43,0x43,0x73,0x47, +0x41,0x51,0x55,0x46,0x42,0x77,0x4d,0x43,0x42,0x67,0x67,0x72,0x42,0x67,0x45,0x46, +0x42,0x51,0x63,0x44,0x41,0x77,0x59,0x49,0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48, +0x41,0x77,0x51,0x47,0x43,0x43,0x73,0x47,0x0a,0x41,0x51,0x55,0x46,0x42,0x77,0x4d, +0x46,0x42,0x67,0x67,0x72,0x42,0x67,0x45,0x46,0x42,0x51,0x63,0x44,0x42,0x67,0x59, +0x49,0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48,0x41,0x77,0x63,0x47,0x43,0x43,0x73, +0x47,0x41,0x51,0x55,0x46,0x42,0x77,0x4d,0x49,0x42,0x67,0x67,0x72,0x42,0x67,0x45, +0x46,0x42,0x51,0x63,0x44,0x43,0x54,0x41,0x4e,0x0a,0x42,0x67,0x6b,0x71,0x68,0x6b, +0x69,0x47,0x39,0x77,0x30,0x42,0x41,0x51,0x73,0x46,0x41,0x41,0x4f,0x43,0x41,0x51, +0x45,0x41,0x46,0x6d,0x34,0x37,0x47,0x55,0x70,0x50,0x57,0x35,0x2b,0x37,0x69,0x46, +0x74,0x69,0x6c,0x6f,0x6b,0x35,0x32,0x49,0x6f,0x54,0x57,0x72,0x74,0x46,0x67,0x32, +0x79,0x69,0x36,0x6b,0x49,0x32,0x69,0x52,0x4e,0x51,0x0a,0x4b,0x75,0x67,0x48,0x55, +0x49,0x4f,0x34,0x4b,0x53,0x71,0x4a,0x56,0x42,0x50,0x38,0x61,0x4b,0x4f,0x61,0x54, +0x5a,0x47,0x45,0x31,0x4b,0x4d,0x68,0x2f,0x59,0x6a,0x68,0x36,0x71,0x2f,0x67,0x50, +0x61,0x6c,0x67,0x64,0x2f,0x38,0x44,0x6d,0x72,0x78,0x53,0x4a,0x6d,0x55,0x78,0x33, +0x62,0x4e,0x62,0x38,0x52,0x59,0x36,0x70,0x4b,0x7a,0x74,0x0a,0x5a,0x64,0x75,0x53, +0x61,0x53,0x2b,0x57,0x55,0x30,0x59,0x74,0x2b,0x6c,0x47,0x35,0x76,0x56,0x67,0x61, +0x70,0x48,0x45,0x71,0x36,0x79,0x71,0x4c,0x62,0x65,0x56,0x78,0x51,0x4c,0x75,0x62, +0x54,0x69,0x6e,0x4f,0x66,0x56,0x56,0x5a,0x58,0x79,0x45,0x43,0x59,0x47,0x4d,0x73, +0x59,0x71,0x65,0x6e,0x4a,0x6a,0x4e,0x63,0x62,0x49,0x5a,0x4e,0x0a,0x79,0x4d,0x75, +0x72,0x46,0x63,0x67,0x30,0x34,0x36,0x4f,0x34,0x59,0x79,0x68,0x56,0x79,0x71,0x53, +0x69,0x74,0x43,0x59,0x37,0x68,0x2f,0x65,0x71,0x67,0x6b,0x50,0x4a,0x51,0x30,0x68, +0x6b,0x70,0x39,0x45,0x64,0x51,0x77,0x62,0x6e,0x38,0x56,0x6c,0x66,0x78,0x64,0x42, +0x58,0x77,0x51,0x34,0x4e,0x48,0x4b,0x30,0x4a,0x56,0x46,0x2f,0x33,0x0a,0x71,0x48, +0x61,0x68,0x4e,0x48,0x4f,0x35,0x64,0x62,0x4a,0x5a,0x57,0x59,0x41,0x62,0x42,0x44, +0x70,0x32,0x51,0x45,0x53,0x70,0x76,0x6f,0x2b,0x38,0x33,0x6c,0x68,0x34,0x64,0x6e, +0x58,0x6a,0x46,0x58,0x4d,0x43,0x48,0x76,0x52,0x68,0x35,0x31,0x79,0x2f,0x54,0x71, +0x79,0x42,0x34,0x56,0x76,0x72,0x52,0x4b,0x49,0x4b,0x74,0x54,0x6f,0x7a,0x0a,0x5a, +0x6a,0x48,0x59,0x49,0x63,0x62,0x6a,0x76,0x53,0x58,0x4d,0x7a,0x61,0x44,0x50,0x6a, +0x50,0x63,0x5a,0x47,0x6a,0x42,0x4a,0x6c,0x47,0x36,0x43,0x76,0x44,0x34,0x4c,0x6d, +0x59,0x7a,0x72,0x6b,0x48,0x34,0x31,0x63,0x7a,0x72,0x34,0x57,0x41,0x3d,0x3d,0x0a, +0x2d,0x2d,0x2d,0x2d,0x2d,0x45,0x4e,0x44,0x20,0x43,0x45,0x52,0x54,0x49,0x46,0x49, +0x43,0x41,0x54,0x45,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a + }, + Key_bin = new byte[] + { +0x2d,0x2d,0x2d,0x2d,0x2d,0x42,0x45,0x47,0x49,0x4e,0x20,0x50,0x52,0x49,0x56,0x41, +0x54,0x45,0x20,0x4b,0x45,0x59,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x4d,0x49,0x49,0x45, +0x76,0x67,0x49,0x42,0x41,0x44,0x41,0x4e,0x42,0x67,0x6b,0x71,0x68,0x6b,0x69,0x47, +0x39,0x77,0x30,0x42,0x41,0x51,0x45,0x46,0x41,0x41,0x53,0x43,0x42,0x4b,0x67,0x77, +0x67,0x67,0x53,0x6b,0x41,0x67,0x45,0x41,0x41,0x6f,0x49,0x42,0x41,0x51,0x44,0x58, +0x45,0x63,0x76,0x72,0x59,0x37,0x56,0x2b,0x7a,0x64,0x42,0x79,0x0a,0x72,0x64,0x4e, +0x78,0x4a,0x59,0x45,0x6d,0x61,0x41,0x4e,0x59,0x55,0x4f,0x37,0x76,0x57,0x34,0x68, +0x64,0x41,0x35,0x49,0x42,0x49,0x46,0x6d,0x4d,0x70,0x6e,0x62,0x79,0x69,0x4e,0x6e, +0x5a,0x77,0x36,0x57,0x39,0x6f,0x61,0x67,0x78,0x33,0x5a,0x49,0x65,0x65,0x48,0x56, +0x59,0x62,0x52,0x69,0x4b,0x36,0x41,0x66,0x46,0x74,0x53,0x31,0x32,0x0a,0x2b,0x45, +0x31,0x4d,0x59,0x31,0x64,0x32,0x61,0x71,0x51,0x31,0x53,0x72,0x49,0x43,0x39,0x51, +0x35,0x55,0x6e,0x5a,0x61,0x42,0x72,0x62,0x57,0x32,0x32,0x6d,0x4e,0x75,0x6c,0x4d, +0x34,0x2f,0x6c,0x49,0x4a,0x72,0x48,0x70,0x51,0x55,0x68,0x50,0x78,0x6f,0x62,0x79, +0x34,0x2f,0x36,0x4e,0x41,0x37,0x71,0x4b,0x67,0x55,0x48,0x69,0x79,0x4f,0x0a,0x64, +0x33,0x4a,0x42,0x70,0x4f,0x66,0x77,0x38,0x54,0x76,0x53,0x74,0x51,0x78,0x34,0x4c, +0x38,0x59,0x64,0x4b,0x51,0x35,0x68,0x74,0x7a,0x6b,0x32,0x68,0x70,0x52,0x4a,0x4c, +0x30,0x6c,0x4b,0x67,0x47,0x31,0x57,0x34,0x75,0x4b,0x32,0x39,0x39,0x42,0x74,0x7a, +0x64,0x41,0x67,0x66,0x42,0x76,0x43,0x54,0x33,0x41,0x31,0x61,0x53,0x70,0x6a,0x0a, +0x49,0x47,0x74,0x6e,0x69,0x72,0x49,0x31,0x46,0x4c,0x52,0x58,0x47,0x79,0x38,0x31, +0x31,0x57,0x4a,0x39,0x4a,0x68,0x68,0x34,0x41,0x4b,0x4c,0x66,0x79,0x56,0x70,0x42, +0x4a,0x67,0x65,0x34,0x73,0x56,0x72,0x36,0x4e,0x75,0x75,0x49,0x66,0x32,0x71,0x47, +0x31,0x6f,0x79,0x31,0x30,0x70,0x61,0x51,0x4e,0x65,0x71,0x32,0x33,0x55,0x47,0x61, +0x0a,0x59,0x74,0x2f,0x7a,0x55,0x56,0x4a,0x77,0x55,0x74,0x30,0x57,0x45,0x6b,0x58, +0x38,0x48,0x4f,0x63,0x62,0x33,0x75,0x49,0x6f,0x54,0x6d,0x61,0x4f,0x34,0x72,0x48, +0x42,0x55,0x4a,0x71,0x45,0x79,0x39,0x51,0x58,0x7a,0x53,0x57,0x77,0x43,0x35,0x78, +0x45,0x43,0x64,0x37,0x43,0x4a,0x53,0x53,0x68,0x31,0x30,0x4f,0x75,0x6e,0x6c,0x75, +0x4c,0x0a,0x32,0x4d,0x47,0x65,0x5a,0x47,0x6e,0x76,0x41,0x67,0x4d,0x42,0x41,0x41, +0x45,0x43,0x67,0x67,0x45,0x41,0x54,0x77,0x34,0x52,0x6f,0x52,0x4c,0x6a,0x73,0x68, +0x72,0x42,0x56,0x6f,0x59,0x69,0x78,0x4f,0x4a,0x2b,0x57,0x4c,0x6d,0x2f,0x45,0x51, +0x57,0x65,0x37,0x6f,0x6a,0x38,0x31,0x51,0x50,0x73,0x39,0x56,0x45,0x49,0x32,0x62, +0x53,0x4f,0x0a,0x34,0x4a,0x51,0x42,0x55,0x42,0x53,0x6b,0x70,0x64,0x48,0x34,0x57, +0x32,0x77,0x51,0x75,0x2f,0x61,0x58,0x57,0x38,0x75,0x75,0x53,0x39,0x45,0x43,0x6d, +0x6d,0x41,0x41,0x75,0x45,0x79,0x4a,0x54,0x56,0x7a,0x75,0x31,0x32,0x35,0x58,0x73, +0x65,0x63,0x6c,0x44,0x41,0x55,0x38,0x49,0x55,0x70,0x54,0x2b,0x70,0x4c,0x35,0x79, +0x70,0x37,0x34,0x0a,0x45,0x62,0x76,0x4e,0x48,0x48,0x33,0x67,0x65,0x72,0x4f,0x67, +0x78,0x76,0x49,0x6a,0x50,0x64,0x67,0x77,0x62,0x66,0x6d,0x4d,0x49,0x59,0x48,0x62, +0x56,0x70,0x6e,0x49,0x30,0x77,0x32,0x42,0x43,0x44,0x51,0x76,0x74,0x64,0x64,0x57, +0x6f,0x42,0x74,0x41,0x33,0x43,0x54,0x6a,0x63,0x2f,0x43,0x56,0x67,0x73,0x47,0x77, +0x33,0x43,0x4e,0x72,0x0a,0x46,0x78,0x41,0x46,0x35,0x73,0x4a,0x34,0x63,0x5a,0x4c, +0x6e,0x5a,0x31,0x45,0x36,0x69,0x74,0x4c,0x54,0x50,0x69,0x6f,0x6a,0x74,0x76,0x48, +0x48,0x34,0x61,0x64,0x6d,0x68,0x68,0x43,0x61,0x42,0x49,0x78,0x76,0x47,0x2f,0x53, +0x6e,0x59,0x77,0x4e,0x35,0x38,0x37,0x55,0x5a,0x6d,0x37,0x4c,0x57,0x50,0x61,0x67, +0x4c,0x41,0x33,0x67,0x69,0x0a,0x48,0x4b,0x4f,0x2b,0x4b,0x79,0x42,0x51,0x39,0x33, +0x31,0x4e,0x4d,0x61,0x65,0x6a,0x36,0x6d,0x75,0x75,0x46,0x32,0x30,0x32,0x76,0x34, +0x37,0x6c,0x57,0x6b,0x64,0x50,0x4f,0x6e,0x52,0x43,0x69,0x6f,0x4d,0x58,0x30,0x63, +0x31,0x6a,0x36,0x76,0x32,0x61,0x59,0x34,0x34,0x77,0x55,0x4b,0x71,0x39,0x4d,0x52, +0x67,0x6f,0x52,0x76,0x4a,0x37,0x0a,0x41,0x39,0x77,0x65,0x72,0x4c,0x6b,0x68,0x35, +0x78,0x78,0x35,0x35,0x32,0x4f,0x74,0x71,0x50,0x36,0x73,0x61,0x6d,0x75,0x47,0x44, +0x52,0x78,0x31,0x42,0x70,0x36,0x53,0x4f,0x70,0x68,0x43,0x45,0x50,0x48,0x59,0x67, +0x51,0x4b,0x42,0x67,0x51,0x44,0x36,0x33,0x65,0x2b,0x52,0x75,0x6c,0x36,0x46,0x78, +0x47,0x43,0x76,0x67,0x70,0x6b,0x33,0x0a,0x57,0x67,0x2f,0x54,0x31,0x77,0x2f,0x59, +0x4b,0x6b,0x79,0x4f,0x49,0x46,0x4c,0x63,0x46,0x4c,0x57,0x71,0x42,0x44,0x71,0x6c, +0x6e,0x58,0x65,0x63,0x6c,0x6b,0x50,0x4b,0x6a,0x57,0x4e,0x2f,0x32,0x70,0x4a,0x6d, +0x4f,0x31,0x63,0x46,0x63,0x44,0x4a,0x46,0x59,0x64,0x32,0x45,0x49,0x45,0x72,0x76, +0x42,0x57,0x54,0x34,0x51,0x39,0x4d,0x42,0x0a,0x4e,0x35,0x6c,0x44,0x6b,0x47,0x75, +0x6a,0x34,0x2f,0x6b,0x68,0x56,0x6c,0x79,0x6e,0x77,0x62,0x64,0x42,0x6e,0x47,0x43, +0x34,0x61,0x34,0x48,0x4a,0x49,0x4a,0x76,0x61,0x35,0x63,0x70,0x49,0x63,0x57,0x65, +0x4a,0x72,0x35,0x61,0x57,0x33,0x69,0x44,0x36,0x68,0x53,0x73,0x61,0x6c,0x79,0x55, +0x76,0x4a,0x4d,0x6d,0x64,0x4d,0x42,0x6e,0x47,0x0a,0x37,0x2b,0x50,0x65,0x53,0x2b, +0x4e,0x73,0x4b,0x30,0x61,0x63,0x31,0x67,0x33,0x4d,0x6c,0x56,0x35,0x42,0x41,0x32, +0x70,0x55,0x54,0x77,0x4b,0x42,0x67,0x51,0x44,0x62,0x65,0x46,0x6d,0x2b,0x46,0x46, +0x35,0x62,0x76,0x6f,0x4b,0x7a,0x49,0x4c,0x6c,0x31,0x62,0x79,0x6b,0x6c,0x52,0x6b, +0x69,0x76,0x7a,0x6b,0x62,0x7a,0x49,0x6b,0x41,0x78,0x0a,0x35,0x56,0x6b,0x74,0x67, +0x36,0x4a,0x35,0x63,0x76,0x38,0x44,0x35,0x2b,0x72,0x71,0x50,0x75,0x6a,0x4f,0x66, +0x39,0x67,0x42,0x6a,0x4e,0x37,0x70,0x64,0x78,0x39,0x39,0x35,0x6b,0x47,0x49,0x78, +0x5a,0x39,0x6d,0x31,0x68,0x57,0x69,0x78,0x55,0x55,0x31,0x55,0x6f,0x38,0x72,0x70, +0x39,0x4a,0x69,0x47,0x4f,0x36,0x72,0x65,0x31,0x77,0x69,0x0a,0x6a,0x56,0x2f,0x4c, +0x31,0x64,0x37,0x55,0x66,0x39,0x48,0x6a,0x65,0x61,0x70,0x4f,0x46,0x62,0x34,0x6b, +0x72,0x71,0x52,0x58,0x54,0x65,0x75,0x4d,0x6e,0x35,0x35,0x44,0x33,0x64,0x70,0x79, +0x6a,0x51,0x4e,0x43,0x30,0x5a,0x50,0x72,0x61,0x6d,0x58,0x64,0x38,0x31,0x57,0x6f, +0x6f,0x56,0x77,0x58,0x59,0x41,0x66,0x69,0x46,0x76,0x4c,0x49,0x0a,0x6f,0x66,0x31, +0x37,0x51,0x67,0x67,0x49,0x59,0x51,0x4b,0x42,0x67,0x51,0x44,0x59,0x55,0x67,0x67, +0x43,0x34,0x58,0x49,0x67,0x5a,0x76,0x58,0x34,0x59,0x65,0x55,0x38,0x6c,0x61,0x79, +0x51,0x50,0x79,0x4b,0x71,0x67,0x38,0x37,0x2f,0x76,0x31,0x2b,0x7a,0x35,0x79,0x65, +0x2f,0x4d,0x32,0x5a,0x65,0x36,0x53,0x6e,0x37,0x48,0x4a,0x66,0x59,0x0a,0x55,0x5a, +0x4d,0x36,0x37,0x48,0x37,0x52,0x4b,0x4e,0x6f,0x68,0x46,0x6c,0x35,0x43,0x39,0x65, +0x44,0x4e,0x7a,0x67,0x72,0x50,0x6b,0x52,0x63,0x2f,0x2f,0x54,0x77,0x32,0x45,0x48, +0x74,0x59,0x68,0x33,0x42,0x4b,0x49,0x6f,0x72,0x77,0x39,0x45,0x64,0x78,0x59,0x4e, +0x6c,0x6b,0x2b,0x6a,0x4e,0x73,0x30,0x30,0x64,0x57,0x35,0x34,0x64,0x39,0x0a,0x65, +0x69,0x69,0x7a,0x7a,0x78,0x59,0x34,0x34,0x2f,0x41,0x32,0x70,0x39,0x52,0x49,0x4d, +0x67,0x79,0x35,0x49,0x52,0x77,0x76,0x53,0x73,0x6d,0x50,0x67,0x61,0x71,0x34,0x6f, +0x4b,0x4d,0x64,0x54,0x4e,0x4d,0x4f,0x73,0x30,0x4a,0x77,0x65,0x79,0x50,0x72,0x42, +0x65,0x49,0x41,0x72,0x62,0x46,0x43,0x67,0x51,0x4b,0x42,0x67,0x51,0x43,0x71,0x0a, +0x57,0x30,0x34,0x56,0x33,0x49,0x75,0x74,0x33,0x55,0x42,0x6f,0x75,0x50,0x4d,0x63, +0x63,0x38,0x2f,0x56,0x62,0x69,0x77,0x48,0x77,0x79,0x2b,0x52,0x6c,0x4c,0x6d,0x4e, +0x77,0x59,0x41,0x71,0x63,0x79,0x35,0x50,0x35,0x58,0x4b,0x4c,0x33,0x70,0x36,0x62, +0x65,0x33,0x2b,0x4d,0x6f,0x76,0x48,0x52,0x71,0x6a,0x35,0x78,0x72,0x4a,0x54,0x57, +0x0a,0x54,0x6a,0x2f,0x36,0x59,0x61,0x51,0x73,0x31,0x2b,0x72,0x74,0x63,0x51,0x45, +0x61,0x74,0x64,0x34,0x4b,0x50,0x66,0x64,0x78,0x53,0x2f,0x63,0x66,0x52,0x74,0x38, +0x71,0x74,0x75,0x42,0x77,0x51,0x61,0x2f,0x34,0x39,0x4d,0x72,0x41,0x4c,0x76,0x57, +0x43,0x4c,0x53,0x42,0x75,0x4b,0x74,0x33,0x49,0x49,0x75,0x53,0x2f,0x51,0x44,0x74, +0x43,0x0a,0x5a,0x4e,0x67,0x6d,0x36,0x4d,0x78,0x71,0x4e,0x6e,0x49,0x43,0x58,0x35, +0x46,0x34,0x36,0x6d,0x52,0x49,0x52,0x42,0x42,0x4f,0x32,0x4b,0x7a,0x6c,0x30,0x33, +0x68,0x62,0x51,0x6c,0x71,0x58,0x4c,0x5a,0x63,0x38,0x6f,0x51,0x4b,0x42,0x67,0x43, +0x53,0x77,0x66,0x46,0x7a,0x68,0x48,0x76,0x78,0x36,0x68,0x69,0x64,0x57,0x67,0x48, +0x4a,0x63,0x0a,0x77,0x79,0x76,0x64,0x6e,0x70,0x58,0x78,0x36,0x5a,0x4c,0x6e,0x6f, +0x61,0x7a,0x61,0x6f,0x48,0x47,0x74,0x4d,0x47,0x43,0x45,0x5a,0x49,0x50,0x66,0x6a, +0x4c,0x42,0x63,0x30,0x4d,0x74,0x79,0x45,0x64,0x53,0x4c,0x78,0x54,0x6c,0x35,0x59, +0x70,0x78,0x6f,0x6d,0x43,0x46,0x55,0x4d,0x33,0x55,0x63,0x59,0x4e,0x2f,0x50,0x5a, +0x66,0x58,0x41,0x0a,0x6d,0x36,0x31,0x45,0x6d,0x71,0x53,0x53,0x4d,0x56,0x63,0x47, +0x50,0x67,0x65,0x2f,0x43,0x34,0x44,0x42,0x5a,0x59,0x6a,0x53,0x45,0x71,0x62,0x67, +0x37,0x6d,0x73,0x52,0x30,0x33,0x37,0x42,0x58,0x54,0x48,0x6b,0x78,0x44,0x62,0x33, +0x71,0x48,0x46,0x54,0x6f,0x30,0x6b,0x48,0x57,0x4a,0x66,0x34,0x39,0x59,0x77,0x32, +0x73,0x77,0x6a,0x54,0x0a,0x72,0x4f,0x38,0x46,0x46,0x44,0x52,0x56,0x50,0x44,0x4c, +0x5a,0x61,0x37,0x36,0x47,0x67,0x79,0x41,0x55,0x4a,0x38,0x55,0x63,0x0a,0x2d,0x2d, +0x2d,0x2d,0x2d,0x45,0x4e,0x44,0x20,0x50,0x52,0x49,0x56,0x41,0x54,0x45,0x20,0x4b, +0x45,0x59,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a + }, + }; + + VpnRpcKeyPair out_rpc_key_pair = api.SetServerCert(in_rpc_key_pair); + + print_object(out_rpc_key_pair); + + Console.WriteLine("End: Test_SetServerCert"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetServerCert', Get the server certification + /// + public void Test_GetServerCert() + { + Console.WriteLine("Begin: Test_GetServerCert"); + + VpnRpcKeyPair out_rpc_key_pair = api.GetServerCert(); + + print_object(out_rpc_key_pair); + + Console.WriteLine("End: Test_GetServerCert"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetServerCipher', Get cipher for SSL + /// + public void Test_GetServerCipher() + { + Console.WriteLine("Begin: Test_GetServerCipher"); + + VpnRpcStr out_rpc_str = api.GetServerCipher(); + + print_object(out_rpc_str); + + Console.WriteLine("End: Test_GetServerCipher"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetServerCipher', Set cipher for SSL to the server + /// + public void Test_SetServerCipher() + { + Console.WriteLine("Begin: Test_SetServerCipher"); + + VpnRpcStr in_rpc_str = new VpnRpcStr() { String_str = "RC4-MD5" }; + VpnRpcStr out_rpc_str = api.SetServerCipher(in_rpc_str); + + print_object(out_rpc_str); + + Console.WriteLine("End: Test_SetServerCipher"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateHub', Create a hub + /// + public string Test_CreateHub() + { + string hub_name = "Test_" + rand.Next(100000, 999999); + Console.WriteLine("Begin: Test_CreateHub"); + + VpnRpcCreateHub in_rpc_create_hub = new VpnRpcCreateHub() + { + HubName_str = hub_name, + HubType_u32 = VpnRpcHubType.Standalone, + Online_bool = true, + AdminPasswordPlainText_str = "microsoft", + MaxSession_u32 = 123, + NoEnum_bool = false, + }; + + VpnRpcCreateHub out_rpc_create_hub = api.CreateHub(in_rpc_create_hub); + + print_object(out_rpc_create_hub); + + Console.WriteLine("End: Test_CreateHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return hub_name; + } + + /// + /// API test for 'SetHub', Set hub configuration + /// + public void Test_SetHub() + { + Console.WriteLine("Begin: Test_SetHub"); + + VpnRpcCreateHub in_rpc_create_hub = new VpnRpcCreateHub() + { + HubName_str = hub_name, + AdminPasswordPlainText_str = "aho", + HubType_u32 = VpnRpcHubType.Standalone, + NoEnum_bool = false, + MaxSession_u32 = 128, + Online_bool = true, + }; + + VpnRpcCreateHub out_rpc_create_hub = api.SetHub(in_rpc_create_hub); + + print_object(out_rpc_create_hub); + + Console.WriteLine("End: Test_SetHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHub', Get hub configuration + /// + public void Test_GetHub() + { + Console.WriteLine("Begin: Test_GetHub"); + + VpnRpcCreateHub in_rpc_create_hub = new VpnRpcCreateHub() + { + HubName_str = hub_name, + }; + + VpnRpcCreateHub out_rpc_create_hub = api.GetHub(in_rpc_create_hub); + + print_object(out_rpc_create_hub); + + Console.WriteLine("End: Test_GetHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumHub', Enumerate hubs + /// + public void Test_EnumHub() + { + Console.WriteLine("Begin: Test_EnumHub"); + + VpnRpcEnumHub out_rpc_enum_hub = api.EnumHub(); + + print_object(out_rpc_enum_hub); + + Console.WriteLine("End: Test_EnumHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteHub', Delete a hub + /// + public void Test_DeleteHub() + { + Console.WriteLine("Begin: Test_DeleteHub"); + + VpnRpcDeleteHub in_rpc_delete_hub = new VpnRpcDeleteHub() + { + HubName_str = hub_name, + }; + VpnRpcDeleteHub out_rpc_delete_hub = api.DeleteHub(in_rpc_delete_hub); + + print_object(out_rpc_delete_hub); + + Console.WriteLine("End: Test_DeleteHub"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubRadius', Get Radius options of the hub + /// + public void Test_GetHubRadius() + { + Console.WriteLine("Begin: Test_GetHubRadius"); + + VpnRpcRadius in_rpc_radius = new VpnRpcRadius() + { + HubName_str = hub_name, + }; + VpnRpcRadius out_rpc_radius = api.GetHubRadius(in_rpc_radius); + + print_object(out_rpc_radius); + + Console.WriteLine("End: Test_GetHubRadius"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubRadius', Set Radius options of the hub + /// + public void Test_SetHubRadius() + { + Console.WriteLine("Begin: Test_SetHubRadius"); + + VpnRpcRadius in_rpc_radius = new VpnRpcRadius() + { + HubName_str = hub_name, + RadiusServerName_str = "1.2.3.4", + RadiusPort_u32 = 1234, + RadiusSecret_str = "microsoft", + RadiusRetryInterval_u32 = 1000, + }; + VpnRpcRadius out_rpc_radius = api.SetHubRadius(in_rpc_radius); + + print_object(out_rpc_radius); + + Console.WriteLine("End: Test_SetHubRadius"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumConnection', Enumerate connections + /// + public VpnRpcEnumConnection Test_EnumConnection() + { + Console.WriteLine("Begin: Test_EnumConnection"); + + VpnRpcEnumConnection out_rpc_enum_connection = api.EnumConnection(); + + print_object(out_rpc_enum_connection); + + Console.WriteLine("End: Test_EnumConnection"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_connection; + } + + /// + /// API test for 'DisconnectConnection', Disconnect a connection + /// + public void Test_DisconnectConnection(string connection_id) + { + Console.WriteLine("Begin: Test_DisconnectConnection"); + + VpnRpcDisconnectConnection in_rpc_disconnect_connection = new VpnRpcDisconnectConnection() + { + Name_str = connection_id, + }; + VpnRpcDisconnectConnection out_rpc_disconnect_connection = api.DisconnectConnection(in_rpc_disconnect_connection); + + print_object(out_rpc_disconnect_connection); + + Console.WriteLine("End: Test_DisconnectConnection"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetConnectionInfo', Get connection information + /// + public void Test_GetConnectionInfo(string name) + { + Console.WriteLine("Begin: Test_GetConnectionInfo"); + + VpnRpcConnectionInfo in_rpc_connection_info = new VpnRpcConnectionInfo() + { + Name_str = name, + }; + VpnRpcConnectionInfo out_rpc_connection_info = api.GetConnectionInfo(in_rpc_connection_info); + + print_object(out_rpc_connection_info); + + Console.WriteLine("End: Test_GetConnectionInfo"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubOnline', Make a hub on-line or off-line + /// + public void Test_SetHubOnline() + { + Console.WriteLine("Begin: Test_SetHubOnline"); + + VpnRpcSetHubOnline in_rpc_set_hub_online = new VpnRpcSetHubOnline() + { + HubName_str = hub_name, + Online_bool = true, + }; + VpnRpcSetHubOnline out_rpc_set_hub_online = api.SetHubOnline(in_rpc_set_hub_online); + + print_object(out_rpc_set_hub_online); + + Console.WriteLine("End: Test_SetHubOnline"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubStatus', Get hub status + /// + public void Test_GetHubStatus() + { + Console.WriteLine("Begin: Test_GetHubStatus"); + + VpnRpcHubStatus in_rpc_hub_status = new VpnRpcHubStatus() + { + HubName_str = hub_name, + }; + VpnRpcHubStatus out_rpc_hub_status = api.GetHubStatus(in_rpc_hub_status); + + print_object(out_rpc_hub_status); + + Console.WriteLine("End: Test_GetHubStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubLog', Set logging configuration into the hub + /// + public void Test_SetHubLog(VpnRpcHubLog in_rpc_hub_log) + { + Console.WriteLine("Begin: Test_SetHubLog"); + + VpnRpcHubLog out_rpc_hub_log = api.SetHubLog(in_rpc_hub_log); + + print_object(out_rpc_hub_log); + + Console.WriteLine("End: Test_SetHubLog"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubLog', Get logging configuration of the hub + /// + public VpnRpcHubLog Test_GetHubLog() + { + Console.WriteLine("Begin: Test_GetHubLog"); + + VpnRpcHubLog in_rpc_hub_log = new VpnRpcHubLog() + { + HubName_str = hub_name, + }; + VpnRpcHubLog out_rpc_hub_log = api.GetHubLog(in_rpc_hub_log); + + print_object(out_rpc_hub_log); + + Console.WriteLine("End: Test_GetHubLog"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_hub_log; + } + + /// + /// API test for 'AddCa', Add CA(Certificate Authority) into the hub + /// + public void Test_AddCa() + { + Console.WriteLine("Begin: Test_AddCa"); + + VpnRpcHubAddCA in_rpc_hub_add_ca = new VpnRpcHubAddCA() + { + HubName_str = hub_name, + Cert_bin = new byte[] + { +0x2d,0x2d,0x2d,0x2d,0x2d,0x42,0x45,0x47,0x49,0x4e,0x20,0x43,0x45,0x52,0x54,0x49, +0x46,0x49,0x43,0x41,0x54,0x45,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x4d,0x49,0x49,0x44, +0x72,0x6a,0x43,0x43,0x41,0x70,0x61,0x67,0x41,0x77,0x49,0x42,0x41,0x67,0x49,0x42, +0x41,0x44,0x41,0x4e,0x42,0x67,0x6b,0x71,0x68,0x6b,0x69,0x47,0x39,0x77,0x30,0x42, +0x41,0x51,0x73,0x46,0x41,0x44,0x42,0x57,0x4d,0x51,0x77,0x77,0x43,0x67,0x59,0x44, +0x56,0x51,0x51,0x44,0x44,0x41,0x4e,0x68,0x59,0x57,0x45,0x78,0x0a,0x46,0x54,0x41, +0x54,0x42,0x67,0x4e,0x56,0x42,0x41,0x6f,0x4d,0x44,0x4f,0x4f,0x42,0x72,0x2b,0x4f, +0x42,0x71,0x75,0x4f,0x42,0x6a,0x2b,0x4f,0x42,0x6e,0x54,0x45,0x4c,0x4d,0x41,0x6b, +0x47,0x41,0x31,0x55,0x45,0x42,0x68,0x4d,0x43,0x53,0x6c,0x41,0x78,0x45,0x44,0x41, +0x4f,0x42,0x67,0x4e,0x56,0x42,0x41,0x67,0x4d,0x42,0x30,0x6c,0x69,0x0a,0x59,0x58, +0x4a,0x68,0x61,0x32,0x6b,0x78,0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56,0x42,0x41, +0x63,0x4d,0x42,0x31,0x52,0x7a,0x64,0x57,0x74,0x31,0x59,0x6d,0x45,0x77,0x48,0x68, +0x63,0x4e,0x4d,0x54,0x67,0x78,0x4d,0x44,0x45,0x78,0x4d,0x6a,0x4d,0x7a,0x4e,0x54, +0x41,0x78,0x57,0x68,0x63,0x4e,0x4e,0x44,0x49,0x78,0x4d,0x44,0x41,0x31,0x0a,0x4d, +0x6a,0x4d,0x7a,0x4e,0x54,0x41,0x78,0x57,0x6a,0x42,0x57,0x4d,0x51,0x77,0x77,0x43, +0x67,0x59,0x44,0x56,0x51,0x51,0x44,0x44,0x41,0x4e,0x68,0x59,0x57,0x45,0x78,0x46, +0x54,0x41,0x54,0x42,0x67,0x4e,0x56,0x42,0x41,0x6f,0x4d,0x44,0x4f,0x4f,0x42,0x72, +0x2b,0x4f,0x42,0x71,0x75,0x4f,0x42,0x6a,0x2b,0x4f,0x42,0x6e,0x54,0x45,0x4c,0x0a, +0x4d,0x41,0x6b,0x47,0x41,0x31,0x55,0x45,0x42,0x68,0x4d,0x43,0x53,0x6c,0x41,0x78, +0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56,0x42,0x41,0x67,0x4d,0x42,0x30,0x6c,0x69, +0x59,0x58,0x4a,0x68,0x61,0x32,0x6b,0x78,0x45,0x44,0x41,0x4f,0x42,0x67,0x4e,0x56, +0x42,0x41,0x63,0x4d,0x42,0x31,0x52,0x7a,0x64,0x57,0x74,0x31,0x59,0x6d,0x45,0x77, +0x0a,0x67,0x67,0x45,0x69,0x4d,0x41,0x30,0x47,0x43,0x53,0x71,0x47,0x53,0x49,0x62, +0x33,0x44,0x51,0x45,0x42,0x41,0x51,0x55,0x41,0x41,0x34,0x49,0x42,0x44,0x77,0x41, +0x77,0x67,0x67,0x45,0x4b,0x41,0x6f,0x49,0x42,0x41,0x51,0x44,0x58,0x45,0x63,0x76, +0x72,0x59,0x37,0x56,0x2b,0x7a,0x64,0x42,0x79,0x72,0x64,0x4e,0x78,0x4a,0x59,0x45, +0x6d,0x0a,0x61,0x41,0x4e,0x59,0x55,0x4f,0x37,0x76,0x57,0x34,0x68,0x64,0x41,0x35, +0x49,0x42,0x49,0x46,0x6d,0x4d,0x70,0x6e,0x62,0x79,0x69,0x4e,0x6e,0x5a,0x77,0x36, +0x57,0x39,0x6f,0x61,0x67,0x78,0x33,0x5a,0x49,0x65,0x65,0x48,0x56,0x59,0x62,0x52, +0x69,0x4b,0x36,0x41,0x66,0x46,0x74,0x53,0x31,0x32,0x2b,0x45,0x31,0x4d,0x59,0x31, +0x64,0x32,0x0a,0x61,0x71,0x51,0x31,0x53,0x72,0x49,0x43,0x39,0x51,0x35,0x55,0x6e, +0x5a,0x61,0x42,0x72,0x62,0x57,0x32,0x32,0x6d,0x4e,0x75,0x6c,0x4d,0x34,0x2f,0x6c, +0x49,0x4a,0x72,0x48,0x70,0x51,0x55,0x68,0x50,0x78,0x6f,0x62,0x79,0x34,0x2f,0x36, +0x4e,0x41,0x37,0x71,0x4b,0x67,0x55,0x48,0x69,0x79,0x4f,0x64,0x33,0x4a,0x42,0x70, +0x4f,0x66,0x77,0x0a,0x38,0x54,0x76,0x53,0x74,0x51,0x78,0x34,0x4c,0x38,0x59,0x64, +0x4b,0x51,0x35,0x68,0x74,0x7a,0x6b,0x32,0x68,0x70,0x52,0x4a,0x4c,0x30,0x6c,0x4b, +0x67,0x47,0x31,0x57,0x34,0x75,0x4b,0x32,0x39,0x39,0x42,0x74,0x7a,0x64,0x41,0x67, +0x66,0x42,0x76,0x43,0x54,0x33,0x41,0x31,0x61,0x53,0x70,0x6a,0x49,0x47,0x74,0x6e, +0x69,0x72,0x49,0x31,0x0a,0x46,0x4c,0x52,0x58,0x47,0x79,0x38,0x31,0x31,0x57,0x4a, +0x39,0x4a,0x68,0x68,0x34,0x41,0x4b,0x4c,0x66,0x79,0x56,0x70,0x42,0x4a,0x67,0x65, +0x34,0x73,0x56,0x72,0x36,0x4e,0x75,0x75,0x49,0x66,0x32,0x71,0x47,0x31,0x6f,0x79, +0x31,0x30,0x70,0x61,0x51,0x4e,0x65,0x71,0x32,0x33,0x55,0x47,0x61,0x59,0x74,0x2f, +0x7a,0x55,0x56,0x4a,0x77,0x0a,0x55,0x74,0x30,0x57,0x45,0x6b,0x58,0x38,0x48,0x4f, +0x63,0x62,0x33,0x75,0x49,0x6f,0x54,0x6d,0x61,0x4f,0x34,0x72,0x48,0x42,0x55,0x4a, +0x71,0x45,0x79,0x39,0x51,0x58,0x7a,0x53,0x57,0x77,0x43,0x35,0x78,0x45,0x43,0x64, +0x37,0x43,0x4a,0x53,0x53,0x68,0x31,0x30,0x4f,0x75,0x6e,0x6c,0x75,0x4c,0x32,0x4d, +0x47,0x65,0x5a,0x47,0x6e,0x76,0x0a,0x41,0x67,0x4d,0x42,0x41,0x41,0x47,0x6a,0x67, +0x59,0x59,0x77,0x67,0x59,0x4d,0x77,0x44,0x77,0x59,0x44,0x56,0x52,0x30,0x54,0x41, +0x51,0x48,0x2f,0x42,0x41,0x55,0x77,0x41,0x77,0x45,0x42,0x2f,0x7a,0x41,0x4c,0x42, +0x67,0x4e,0x56,0x48,0x51,0x38,0x45,0x42,0x41,0x4d,0x43,0x41,0x66,0x59,0x77,0x59, +0x77,0x59,0x44,0x56,0x52,0x30,0x6c,0x0a,0x42,0x46,0x77,0x77,0x57,0x67,0x59,0x49, +0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48,0x41,0x77,0x45,0x47,0x43,0x43,0x73,0x47, +0x41,0x51,0x55,0x46,0x42,0x77,0x4d,0x43,0x42,0x67,0x67,0x72,0x42,0x67,0x45,0x46, +0x42,0x51,0x63,0x44,0x41,0x77,0x59,0x49,0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48, +0x41,0x77,0x51,0x47,0x43,0x43,0x73,0x47,0x0a,0x41,0x51,0x55,0x46,0x42,0x77,0x4d, +0x46,0x42,0x67,0x67,0x72,0x42,0x67,0x45,0x46,0x42,0x51,0x63,0x44,0x42,0x67,0x59, +0x49,0x4b,0x77,0x59,0x42,0x42,0x51,0x55,0x48,0x41,0x77,0x63,0x47,0x43,0x43,0x73, +0x47,0x41,0x51,0x55,0x46,0x42,0x77,0x4d,0x49,0x42,0x67,0x67,0x72,0x42,0x67,0x45, +0x46,0x42,0x51,0x63,0x44,0x43,0x54,0x41,0x4e,0x0a,0x42,0x67,0x6b,0x71,0x68,0x6b, +0x69,0x47,0x39,0x77,0x30,0x42,0x41,0x51,0x73,0x46,0x41,0x41,0x4f,0x43,0x41,0x51, +0x45,0x41,0x46,0x6d,0x34,0x37,0x47,0x55,0x70,0x50,0x57,0x35,0x2b,0x37,0x69,0x46, +0x74,0x69,0x6c,0x6f,0x6b,0x35,0x32,0x49,0x6f,0x54,0x57,0x72,0x74,0x46,0x67,0x32, +0x79,0x69,0x36,0x6b,0x49,0x32,0x69,0x52,0x4e,0x51,0x0a,0x4b,0x75,0x67,0x48,0x55, +0x49,0x4f,0x34,0x4b,0x53,0x71,0x4a,0x56,0x42,0x50,0x38,0x61,0x4b,0x4f,0x61,0x54, +0x5a,0x47,0x45,0x31,0x4b,0x4d,0x68,0x2f,0x59,0x6a,0x68,0x36,0x71,0x2f,0x67,0x50, +0x61,0x6c,0x67,0x64,0x2f,0x38,0x44,0x6d,0x72,0x78,0x53,0x4a,0x6d,0x55,0x78,0x33, +0x62,0x4e,0x62,0x38,0x52,0x59,0x36,0x70,0x4b,0x7a,0x74,0x0a,0x5a,0x64,0x75,0x53, +0x61,0x53,0x2b,0x57,0x55,0x30,0x59,0x74,0x2b,0x6c,0x47,0x35,0x76,0x56,0x67,0x61, +0x70,0x48,0x45,0x71,0x36,0x79,0x71,0x4c,0x62,0x65,0x56,0x78,0x51,0x4c,0x75,0x62, +0x54,0x69,0x6e,0x4f,0x66,0x56,0x56,0x5a,0x58,0x79,0x45,0x43,0x59,0x47,0x4d,0x73, +0x59,0x71,0x65,0x6e,0x4a,0x6a,0x4e,0x63,0x62,0x49,0x5a,0x4e,0x0a,0x79,0x4d,0x75, +0x72,0x46,0x63,0x67,0x30,0x34,0x36,0x4f,0x34,0x59,0x79,0x68,0x56,0x79,0x71,0x53, +0x69,0x74,0x43,0x59,0x37,0x68,0x2f,0x65,0x71,0x67,0x6b,0x50,0x4a,0x51,0x30,0x68, +0x6b,0x70,0x39,0x45,0x64,0x51,0x77,0x62,0x6e,0x38,0x56,0x6c,0x66,0x78,0x64,0x42, +0x58,0x77,0x51,0x34,0x4e,0x48,0x4b,0x30,0x4a,0x56,0x46,0x2f,0x33,0x0a,0x71,0x48, +0x61,0x68,0x4e,0x48,0x4f,0x35,0x64,0x62,0x4a,0x5a,0x57,0x59,0x41,0x62,0x42,0x44, +0x70,0x32,0x51,0x45,0x53,0x70,0x76,0x6f,0x2b,0x38,0x33,0x6c,0x68,0x34,0x64,0x6e, +0x58,0x6a,0x46,0x58,0x4d,0x43,0x48,0x76,0x52,0x68,0x35,0x31,0x79,0x2f,0x54,0x71, +0x79,0x42,0x34,0x56,0x76,0x72,0x52,0x4b,0x49,0x4b,0x74,0x54,0x6f,0x7a,0x0a,0x5a, +0x6a,0x48,0x59,0x49,0x63,0x62,0x6a,0x76,0x53,0x58,0x4d,0x7a,0x61,0x44,0x50,0x6a, +0x50,0x63,0x5a,0x47,0x6a,0x42,0x4a,0x6c,0x47,0x36,0x43,0x76,0x44,0x34,0x4c,0x6d, +0x59,0x7a,0x72,0x6b,0x48,0x34,0x31,0x63,0x7a,0x72,0x34,0x57,0x41,0x3d,0x3d,0x0a, +0x2d,0x2d,0x2d,0x2d,0x2d,0x45,0x4e,0x44,0x20,0x43,0x45,0x52,0x54,0x49,0x46,0x49, +0x43,0x41,0x54,0x45,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a + }, + }; + VpnRpcHubAddCA out_rpc_hub_add_ca = api.AddCa(in_rpc_hub_add_ca); + + print_object(out_rpc_hub_add_ca); + + Console.WriteLine("End: Test_AddCa"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumCa', Enumerate CA(Certificate Authority) in the hub + /// + public VpnRpcHubEnumCA Test_EnumCa() + { + Console.WriteLine("Begin: Test_EnumCa"); + + VpnRpcHubEnumCA in_rpc_hub_enum_ca = new VpnRpcHubEnumCA() + { + HubName_str = hub_name, + }; + VpnRpcHubEnumCA out_rpc_hub_enum_ca = api.EnumCa(in_rpc_hub_enum_ca); + + print_object(out_rpc_hub_enum_ca); + + Console.WriteLine("End: Test_EnumCa"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_hub_enum_ca; + } + + /// + /// API test for 'GetCa', Get CA(Certificate Authority) setting from the hub + /// + public void Test_GetCa(uint key) + { + Console.WriteLine("Begin: Test_GetCa"); + + VpnRpcHubGetCA in_rpc_hub_get_ca = new VpnRpcHubGetCA() + { + HubName_str = hub_name, + Key_u32 = key, + }; + VpnRpcHubGetCA out_rpc_hub_get_ca = api.GetCa(in_rpc_hub_get_ca); + + print_object(out_rpc_hub_get_ca); + + Console.WriteLine("End: Test_GetCa"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteCa', Delete a CA(Certificate Authority) setting from the hub + /// + public void Test_DeleteCa(uint key) + { + Console.WriteLine("Begin: Test_DeleteCa"); + + VpnRpcHubDeleteCA in_rpc_hub_delete_ca = new VpnRpcHubDeleteCA() + { + HubName_str = hub_name, + Key_u32 = key, + }; + VpnRpcHubDeleteCA out_rpc_hub_delete_ca = api.DeleteCa(in_rpc_hub_delete_ca); + + print_object(out_rpc_hub_delete_ca); + + Console.WriteLine("End: Test_DeleteCa"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetLinkOnline', Make a link into on-line + /// + public void Test_SetLinkOnline() + { + Console.WriteLine("Begin: Test_SetLinkOnline"); + + VpnRpcLink in_rpc_link = new VpnRpcLink() + { + HubName_str = hub_name, + AccountName_utf = "linktest", + }; + VpnRpcLink out_rpc_link = api.SetLinkOnline(in_rpc_link); + + print_object(out_rpc_link); + + Console.WriteLine("End: Test_SetLinkOnline"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetLinkOffline', Make a link into off-line + /// + public void Test_SetLinkOffline() + { + Console.WriteLine("Begin: Test_SetLinkOffline"); + + VpnRpcLink in_rpc_link = new VpnRpcLink() + { + HubName_str = hub_name, + AccountName_utf = "linktest", + }; + VpnRpcLink out_rpc_link = api.SetLinkOffline(in_rpc_link); + + print_object(out_rpc_link); + + Console.WriteLine("End: Test_SetLinkOffline"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteLink', Delete a link + /// + public void Test_DeleteLink() + { + Console.WriteLine("Begin: Test_DeleteLink"); + + VpnRpcLink in_rpc_link = new VpnRpcLink() + { + HubName_str = hub_name, + AccountName_utf = "linktest2", + }; + VpnRpcLink out_rpc_link = api.DeleteLink(in_rpc_link); + + print_object(out_rpc_link); + + Console.WriteLine("End: Test_DeleteLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'RenameLink', Rename link (cascade connection) + /// + public void Test_RenameLink() + { + Console.WriteLine("Begin: Test_RenameLink"); + + VpnRpcRenameLink in_rpc_rename_link = new VpnRpcRenameLink() + { + HubName_str = hub_name, + OldAccountName_utf = "linktest", + NewAccountName_utf = "linktest2", + }; + VpnRpcRenameLink out_rpc_rename_link = api.RenameLink(in_rpc_rename_link); + + print_object(out_rpc_rename_link); + + Console.WriteLine("End: Test_RenameLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateLink', Create a new link(cascade) + /// + public void Test_CreateLink() + { + Console.WriteLine("Begin: Test_CreateLink"); + + VpnRpcCreateLink in_rpc_create_link = new VpnRpcCreateLink() + { + HubName_Ex_str = hub_name, + CheckServerCert_bool = false, + + ClientOption_AccountName_utf = "linktest", + ClientOption_Hostname_str = "1.2.3.4", + ClientOption_Port_u32 = 443, + ClientOption_ProxyType_u32 = 0, + ClientOption_HubName_str = "ABC", + ClientOption_MaxConnection_u32 = 16, + ClientOption_UseEncrypt_bool = true, + ClientOption_UseCompress_bool = false, + ClientOption_HalfConnection_bool = true, + ClientOption_AdditionalConnectionInterval_u32 = 2, + ClientOption_ConnectionDisconnectSpan_u32 = 24, + + ClientAuth_AuthType_u32 = VpnRpcClientAuthType.PlainPassword, + ClientAuth_Username_str = "181012", + ClientAuth_PlainPassword_str = "microsoft", + ClientAuth_HashedPassword_bin = new byte[0] { }, + ClientAuth_ClientX_bin = new byte[0] { }, + ClientAuth_ClientK_bin = new byte[0] { }, + + SecPol_DHCPFilter_bool = true, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = true, + SecPol_CheckMac_bool = true, + SecPol_CheckIP_bool = true, + SecPol_ArpDhcpOnly_bool = true, + SecPol_PrivacyFilter_bool = true, + SecPol_NoServer_bool = true, + SecPol_NoBroadcastLimiter_bool = true, + SecPol_MaxMac_u32 = 32, + SecPol_MaxIP_u32 = 64, + SecPol_MaxUpload_u32 = 960000, + SecPol_MaxDownload_u32 = 1280000, + SecPol_RSandRAFilter_bool = true, + SecPol_RAFilter_bool = true, + SecPol_DHCPv6Filter_bool = true, + SecPol_DHCPv6NoServer_bool = true, + SecPol_CheckIPv6_bool = true, + SecPol_NoServerV6_bool = true, + SecPol_MaxIPv6_u32 = 127, + SecPol_FilterIPv4_bool = true, + SecPol_FilterIPv6_bool = true, + SecPol_FilterNonIP_bool = true, + SecPol_NoIPv6DefaultRouterInRA_bool = true, + SecPol_VLanId_u32 = 123, + SecPol_Ver3_bool = true, + }; + VpnRpcCreateLink out_rpc_create_link = api.CreateLink(in_rpc_create_link); + + print_object(out_rpc_create_link); + + Console.WriteLine("End: Test_CreateLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetLink', Get link configuration + /// + public void Test_GetLink() + { + Console.WriteLine("Begin: Test_GetLink"); + + VpnRpcCreateLink in_rpc_create_link = new VpnRpcCreateLink() + { + HubName_Ex_str = hub_name, + ClientOption_AccountName_utf = "linktest", + }; + VpnRpcCreateLink out_rpc_create_link = api.GetLink(in_rpc_create_link); + + print_object(out_rpc_create_link); + + Console.WriteLine("End: Test_GetLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetLink', Set link configuration + /// + public void Test_SetLink() + { + Console.WriteLine("Begin: Test_SetLink"); + + VpnRpcCreateLink in_rpc_create_link = new VpnRpcCreateLink() + { + HubName_Ex_str = hub_name, + CheckServerCert_bool = false, + + ClientOption_AccountName_utf = "linktest", + ClientOption_Hostname_str = "1.2.3.4", + ClientOption_Port_u32 = 443, + ClientOption_ProxyType_u32 = 0, + ClientOption_HubName_str = "ABC", + ClientOption_MaxConnection_u32 = 16, + ClientOption_UseEncrypt_bool = true, + ClientOption_UseCompress_bool = false, + ClientOption_HalfConnection_bool = true, + ClientOption_AdditionalConnectionInterval_u32 = 2, + ClientOption_ConnectionDisconnectSpan_u32 = 24, + + ClientAuth_AuthType_u32 = VpnRpcClientAuthType.PlainPassword, + ClientAuth_Username_str = "181012", + ClientAuth_PlainPassword_str = "microsoft", + ClientAuth_HashedPassword_bin = new byte[0] { }, + ClientAuth_ClientX_bin = new byte[0] { }, + ClientAuth_ClientK_bin = new byte[0] { }, + + SecPol_DHCPFilter_bool = true, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = true, + SecPol_CheckMac_bool = true, + SecPol_CheckIP_bool = true, + SecPol_ArpDhcpOnly_bool = true, + SecPol_PrivacyFilter_bool = true, + SecPol_NoServer_bool = true, + SecPol_NoBroadcastLimiter_bool = true, + SecPol_MaxMac_u32 = 32, + SecPol_MaxIP_u32 = 64, + SecPol_MaxUpload_u32 = 960000, + SecPol_MaxDownload_u32 = 1280000, + SecPol_RSandRAFilter_bool = true, + SecPol_RAFilter_bool = true, + SecPol_DHCPv6Filter_bool = true, + SecPol_DHCPv6NoServer_bool = true, + SecPol_CheckIPv6_bool = true, + SecPol_NoServerV6_bool = true, + SecPol_MaxIPv6_u32 = 127, + SecPol_FilterIPv4_bool = true, + SecPol_FilterIPv6_bool = true, + SecPol_FilterNonIP_bool = true, + SecPol_NoIPv6DefaultRouterInRA_bool = true, + SecPol_VLanId_u32 = 123, + SecPol_Ver3_bool = true, + }; + VpnRpcCreateLink out_rpc_create_link = api.SetLink(in_rpc_create_link); + + print_object(out_rpc_create_link); + + Console.WriteLine("End: Test_SetLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumLink', Enumerate links + /// + public VpnRpcEnumLink Test_EnumLink() + { + Console.WriteLine("Begin: Test_EnumLink"); + + VpnRpcEnumLink in_rpc_enum_link = new VpnRpcEnumLink() + { + HubName_str = hub_name, + }; + VpnRpcEnumLink out_rpc_enum_link = api.EnumLink(in_rpc_enum_link); + + print_object(out_rpc_enum_link); + + Console.WriteLine("End: Test_EnumLink"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_link; + } + + /// + /// API test for 'GetLinkStatus', Get link status + /// + public void Test_GetLinkStatus(string name) + { + Console.WriteLine("Begin: Test_GetLinkStatus"); + + VpnRpcLinkStatus in_rpc_link_status = new VpnRpcLinkStatus() + { + HubName_Ex_str = hub_name, + AccountName_utf = name, + }; + VpnRpcLinkStatus out_rpc_link_status = api.GetLinkStatus(in_rpc_link_status); + + print_object(out_rpc_link_status); + + Console.WriteLine("End: Test_GetLinkStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddAccess', Add access list entry + /// + public void Test_AddAccess() + { + Console.WriteLine("Begin: Test_AddAccess"); + + VpnRpcAddAccess in_rpc_add_access_ipv4 = new VpnRpcAddAccess() + { + HubName_str = hub_name, + + AccessListSingle = new VpnAccess[1] + { + new VpnAccess() + { + Note_utf = "IPv4 Test", + Active_bool = true, + Priority_u32 = 100, + Discard_bool = true, + IsIPv6_bool = false, + SrcIpAddress_ip = "192.168.0.0", + SrcSubnetMask_ip = "255.255.255.0", + DestIpAddress_ip = "10.0.0.0", + DestSubnetMask_ip = "255.255.0.0", + Protocol_u32 = VpnIpProtocolNumber.TCP, + SrcPortStart_u32 = 123, + SrcPortEnd_u32 = 456, + DestPortStart_u32 = 555, + DestPortEnd_u32 = 666, + SrcUsername_str = "dnobori", + DestUsername_str = "nekosan", + CheckSrcMac_bool = true, + SrcMacAddress_bin = new byte[] { 1, 2, 3, 0, 0, 0 }, + SrcMacMask_bin = new byte[] { 255, 255, 255, 0, 0, 0 }, + CheckTcpState_bool = true, + Established_bool = true, + Delay_u32 = 10, + Jitter_u32 = 20, + Loss_u32 = 30, + RedirectUrl_str = "aho", + }, + }, + }; + VpnRpcAddAccess out_rpc_add_access_ipv4 = api.AddAccess(in_rpc_add_access_ipv4); + + VpnRpcAddAccess in_rpc_add_access_ipv6 = new VpnRpcAddAccess() + { + HubName_str = hub_name, + + AccessListSingle = new VpnAccess[1] + { + new VpnAccess() + { + Note_utf = "IPv6 Test", + Active_bool = true, + Priority_u32 = 100, + Discard_bool = true, + IsIPv6_bool = true, + SrcIpAddress6_bin = new byte[] { 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + SrcSubnetMask6_bin = new byte[] { 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + Protocol_u32 = VpnIpProtocolNumber.UDP, + SrcPortStart_u32 = 123, + SrcPortEnd_u32 = 456, + DestPortStart_u32 = 555, + DestPortEnd_u32 = 666, + SrcUsername_str = "dnobori", + DestUsername_str = "nekosan", + CheckSrcMac_bool = true, + SrcMacAddress_bin = new byte[] { 1, 2, 3, 0, 0, 0 }, + SrcMacMask_bin = new byte[] { 255, 255, 255, 0, 0, 0 }, + CheckTcpState_bool = true, + Established_bool = true, + Delay_u32 = 10, + Jitter_u32 = 20, + Loss_u32 = 30, + RedirectUrl_str = "aho", + }, + }, + }; + VpnRpcAddAccess out_rpc_add_access_ipv6 = api.AddAccess(in_rpc_add_access_ipv6); + + Console.WriteLine("End: Test_AddAccess"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteAccess', Delete access list entry + /// + public void Test_DeleteAccess() + { + Console.WriteLine("Begin: Test_DeleteAccess"); + + VpnRpcDeleteAccess in_rpc_delete_access = new VpnRpcDeleteAccess() + { + HubName_str = hub_name, + Id_u32 = 1, + }; + VpnRpcDeleteAccess out_rpc_delete_access = api.DeleteAccess(in_rpc_delete_access); + + print_object(out_rpc_delete_access); + + Console.WriteLine("End: Test_DeleteAccess"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumAccess', Get access list + /// + public void Test_EnumAccess() + { + Console.WriteLine("Begin: Test_EnumAccess"); + + VpnRpcEnumAccessList in_rpc_enum_access_list = new VpnRpcEnumAccessList() + { + HubName_str = hub_name, + }; + VpnRpcEnumAccessList out_rpc_enum_access_list = api.EnumAccess(in_rpc_enum_access_list); + + print_object(out_rpc_enum_access_list); + + Console.WriteLine("End: Test_EnumAccess"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetAccessList', Set access list + /// + public void Test_SetAccessList() + { + Console.WriteLine("Begin: Test_SetAccessList"); + + VpnRpcEnumAccessList in_rpc_enum_access_list = new VpnRpcEnumAccessList() + { + HubName_str = hub_name, + AccessList = new VpnAccess[] + { + new VpnAccess() + { + Note_utf = "IPv4 Test 2", + Active_bool = true, + Priority_u32 = 100, + Discard_bool = true, + IsIPv6_bool = false, + SrcIpAddress_ip = "192.168.0.0", + SrcSubnetMask_ip = "255.255.255.0", + DestIpAddress_ip = "10.0.0.0", + DestSubnetMask_ip = "255.255.0.0", + Protocol_u32 = VpnIpProtocolNumber.TCP, + SrcPortStart_u32 = 123, + SrcPortEnd_u32 = 456, + DestPortStart_u32 = 555, + DestPortEnd_u32 = 666, + SrcUsername_str = "dnobori", + DestUsername_str = "nekosan", + CheckSrcMac_bool = true, + SrcMacAddress_bin = new byte[] { 1, 2, 3, 0, 0, 0 }, + SrcMacMask_bin = new byte[] { 255, 255, 255, 0, 0, 0 }, + CheckTcpState_bool = true, + Established_bool = true, + Delay_u32 = 10, + Jitter_u32 = 20, + Loss_u32 = 30, + RedirectUrl_str = "aho", + }, + new VpnAccess() + { + Note_utf = "IPv6 Test 2", + Active_bool = true, + Priority_u32 = 100, + Discard_bool = true, + IsIPv6_bool = true, + SrcIpAddress6_bin = new byte[] { 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + SrcSubnetMask6_bin = new byte[] { 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, + Protocol_u32 = VpnIpProtocolNumber.UDP, + SrcPortStart_u32 = 123, + SrcPortEnd_u32 = 456, + DestPortStart_u32 = 555, + DestPortEnd_u32 = 666, + SrcUsername_str = "dnobori", + DestUsername_str = "nekosan", + CheckSrcMac_bool = true, + SrcMacAddress_bin = new byte[] { 1, 2, 3, 0, 0, 0 }, + SrcMacMask_bin = new byte[] { 255, 255, 255, 0, 0, 0 }, + CheckTcpState_bool = true, + Established_bool = true, + Delay_u32 = 10, + Jitter_u32 = 20, + Loss_u32 = 30, + RedirectUrl_str = "aho", + }, + } + }; + VpnRpcEnumAccessList out_rpc_enum_access_list = api.SetAccessList(in_rpc_enum_access_list); + + print_object(out_rpc_enum_access_list); + + Console.WriteLine("End: Test_SetAccessList"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateUser', Create a user + /// + public void Test_CreateUser() + { + Console.WriteLine("Begin: Test_CreateUser"); + + VpnRpcSetUser in_rpc_set_user = new VpnRpcSetUser() + { + HubName_str = hub_name, + Name_str = "test1", + Realname_utf = "Cat man", + Note_utf = "Hey!!!", + AuthType_u32 = VpnRpcUserAuthType.Password, + Auth_Password_str = "microsoft", + Auth_UserCert_CertData = new byte[0] { }, + Auth_RootCert_Serial = new byte[0] { }, + Auth_RootCert_CommonName = "", + Auth_Radius_RadiusUsername = "", + Auth_NT_NTUsername = "", + ExpireTime_dt = new DateTime(2019, 1, 1), + UsePolicy_bool = true, + SecPol_Access_bool = true, + SecPol_DHCPFilter_bool = false, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = false, + SecPol_NoBridge_bool = false, + SecPol_NoRouting_bool = false, + SecPol_CheckMac_bool = false, + SecPol_CheckIP_bool = false, + SecPol_ArpDhcpOnly_bool = false, + SecPol_PrivacyFilter_bool = false, + SecPol_NoServer_bool = false, + SecPol_NoBroadcastLimiter_bool = false, + SecPol_MonitorPort_bool = false, + SecPol_MaxConnection_u32 = 32, + SecPol_TimeOut_u32 = 15, + SecPol_MaxMac_u32 = 1000, + SecPol_MaxIP_u32 = 1000, + SecPol_MaxUpload_u32 = 1000000000, + SecPol_MaxDownload_u32 = 1000000000, + SecPol_FixPassword_bool = false, + SecPol_MultiLogins_u32 = 1000, + SecPol_NoQoS_bool = false, + SecPol_RSandRAFilter_bool = false, + SecPol_RAFilter_bool = false, + SecPol_DHCPv6Filter_bool = false, + SecPol_DHCPv6NoServer_bool = false, + SecPol_NoRoutingV6_bool = false, + SecPol_CheckIPv6_bool = false, + SecPol_NoServerV6_bool = false, + SecPol_MaxIPv6_u32 = 1234, + SecPol_NoSavePassword_bool = false, + SecPol_AutoDisconnect_u32 = 0, + SecPol_FilterIPv4_bool = false, + SecPol_FilterIPv6_bool = false, + SecPol_FilterNonIP_bool = false, + SecPol_NoIPv6DefaultRouterInRA_bool = false, + SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool = false, + SecPol_VLanId_u32 = 0, + SecPol_Ver3_bool = true, + }; + VpnRpcSetUser out_rpc_set_user = api.CreateUser(in_rpc_set_user); + + Console.WriteLine("End: Test_CreateUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetUser', Set user setting + /// + public void Test_SetUser() + { + Console.WriteLine("Begin: Test_SetUser"); + + VpnRpcSetUser in_rpc_set_user = new VpnRpcSetUser() + { + HubName_str = hub_name, + Name_str = "test1", + Realname_utf = "Cat man", + Note_utf = "Hey!!!", + GroupName_str = "group1", + AuthType_u32 = VpnRpcUserAuthType.Anonymous, + Auth_Password_str = "", + Auth_UserCert_CertData = new byte[0] { }, + Auth_RootCert_Serial = new byte[0] { }, + Auth_RootCert_CommonName = "", + Auth_Radius_RadiusUsername = "", + Auth_NT_NTUsername = "", + ExpireTime_dt = new DateTime(2019, 1, 1), + UsePolicy_bool = true, + SecPol_Access_bool = true, + SecPol_DHCPFilter_bool = false, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = false, + SecPol_NoBridge_bool = false, + SecPol_NoRouting_bool = false, + SecPol_CheckMac_bool = false, + SecPol_CheckIP_bool = false, + SecPol_ArpDhcpOnly_bool = false, + SecPol_PrivacyFilter_bool = false, + SecPol_NoServer_bool = false, + SecPol_NoBroadcastLimiter_bool = false, + SecPol_MonitorPort_bool = false, + SecPol_MaxConnection_u32 = 32, + SecPol_TimeOut_u32 = 15, + SecPol_MaxMac_u32 = 1000, + SecPol_MaxIP_u32 = 1000, + SecPol_MaxUpload_u32 = 1000000000, + SecPol_MaxDownload_u32 = 1000000000, + SecPol_FixPassword_bool = false, + SecPol_MultiLogins_u32 = 1000, + SecPol_NoQoS_bool = false, + SecPol_RSandRAFilter_bool = false, + SecPol_RAFilter_bool = false, + SecPol_DHCPv6Filter_bool = false, + SecPol_DHCPv6NoServer_bool = false, + SecPol_NoRoutingV6_bool = false, + SecPol_CheckIPv6_bool = false, + SecPol_NoServerV6_bool = false, + SecPol_MaxIPv6_u32 = 1234, + SecPol_NoSavePassword_bool = false, + SecPol_AutoDisconnect_u32 = 0, + SecPol_FilterIPv4_bool = false, + SecPol_FilterIPv6_bool = false, + SecPol_FilterNonIP_bool = false, + SecPol_NoIPv6DefaultRouterInRA_bool = false, + SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool = false, + SecPol_VLanId_u32 = 0, + SecPol_Ver3_bool = true, + }; + VpnRpcSetUser out_rpc_set_user = api.SetUser(in_rpc_set_user); + + Console.WriteLine("End: Test_SetUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetUser', Get user setting + /// + public void Test_GetUser() + { + Console.WriteLine("Begin: Test_GetUser"); + + VpnRpcSetUser in_rpc_set_user = new VpnRpcSetUser() + { + HubName_str = hub_name, + Name_str = "test1", + }; + VpnRpcSetUser out_rpc_set_user = api.GetUser(in_rpc_set_user); + + print_object(out_rpc_set_user); + + Console.WriteLine("End: Test_GetUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteUser', Delete a user + /// + public void Test_DeleteUser() + { + Console.WriteLine("Begin: Test_DeleteUser"); + + VpnRpcDeleteUser in_rpc_delete_user = new VpnRpcDeleteUser() + { + HubName_str = hub_name, + Name_str = "test1", + }; + VpnRpcDeleteUser out_rpc_delete_user = api.DeleteUser(in_rpc_delete_user); + + Console.WriteLine("End: Test_DeleteUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumUser', Enumerate users + /// + public void Test_EnumUser() + { + Console.WriteLine("Begin: Test_EnumUser"); + + VpnRpcEnumUser in_rpc_enum_user = new VpnRpcEnumUser() + { + HubName_str = hub_name, + }; + VpnRpcEnumUser out_rpc_enum_user = api.EnumUser(in_rpc_enum_user); + + print_object(out_rpc_enum_user); + + Console.WriteLine("End: Test_EnumUser"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'CreateGroup', Create a group + /// + public void Test_CreateGroup() + { + Console.WriteLine("Begin: Test_CreateGroup"); + + VpnRpcSetGroup in_rpc_set_group = new VpnRpcSetGroup() + { + HubName_str = hub_name, + Name_str = "group1", + Realname_utf = "Cat group", + Note_utf = "This is it! This is it!!", + UsePolicy_bool = true, + SecPol_Access_bool = true, + SecPol_DHCPFilter_bool = false, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = false, + SecPol_NoBridge_bool = false, + SecPol_NoRouting_bool = false, + SecPol_CheckMac_bool = false, + SecPol_CheckIP_bool = false, + SecPol_ArpDhcpOnly_bool = false, + SecPol_PrivacyFilter_bool = false, + SecPol_NoServer_bool = false, + SecPol_NoBroadcastLimiter_bool = false, + SecPol_MonitorPort_bool = false, + SecPol_MaxConnection_u32 = 32, + SecPol_TimeOut_u32 = 15, + SecPol_MaxMac_u32 = 1000, + SecPol_MaxIP_u32 = 1000, + SecPol_MaxUpload_u32 = 1000000000, + SecPol_MaxDownload_u32 = 1000000000, + SecPol_FixPassword_bool = false, + SecPol_MultiLogins_u32 = 1000, + SecPol_NoQoS_bool = false, + SecPol_RSandRAFilter_bool = false, + SecPol_RAFilter_bool = false, + SecPol_DHCPv6Filter_bool = false, + SecPol_DHCPv6NoServer_bool = false, + SecPol_NoRoutingV6_bool = false, + SecPol_CheckIPv6_bool = false, + SecPol_NoServerV6_bool = false, + SecPol_MaxIPv6_u32 = 1234, + SecPol_NoSavePassword_bool = false, + SecPol_AutoDisconnect_u32 = 0, + SecPol_FilterIPv4_bool = false, + SecPol_FilterIPv6_bool = false, + SecPol_FilterNonIP_bool = false, + SecPol_NoIPv6DefaultRouterInRA_bool = false, + SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool = false, + SecPol_VLanId_u32 = 0, + SecPol_Ver3_bool = true, + }; + VpnRpcSetGroup out_rpc_set_group = api.CreateGroup(in_rpc_set_group); + + print_object(out_rpc_set_group); + + Console.WriteLine("End: Test_CreateGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetGroup', Set group setting + /// + public void Test_SetGroup() + { + Console.WriteLine("Begin: Test_SetGroup"); + + VpnRpcSetGroup in_rpc_set_group = new VpnRpcSetGroup() + { + HubName_str = hub_name, + Name_str = "group1", + Realname_utf = "Cat group 2", + Note_utf = "This is it! This is it!! 2", + UsePolicy_bool = true, + SecPol_Access_bool = true, + SecPol_DHCPFilter_bool = false, + SecPol_DHCPNoServer_bool = true, + SecPol_DHCPForce_bool = false, + SecPol_NoBridge_bool = false, + SecPol_NoRouting_bool = false, + SecPol_CheckMac_bool = false, + SecPol_CheckIP_bool = false, + SecPol_ArpDhcpOnly_bool = false, + SecPol_PrivacyFilter_bool = false, + SecPol_NoServer_bool = false, + SecPol_NoBroadcastLimiter_bool = false, + SecPol_MonitorPort_bool = false, + SecPol_MaxConnection_u32 = 32, + SecPol_TimeOut_u32 = 15, + SecPol_MaxMac_u32 = 1000, + SecPol_MaxIP_u32 = 1000, + SecPol_MaxUpload_u32 = 1000000000, + SecPol_MaxDownload_u32 = 1000000000, + SecPol_FixPassword_bool = false, + SecPol_MultiLogins_u32 = 1000, + SecPol_NoQoS_bool = false, + SecPol_RSandRAFilter_bool = false, + SecPol_RAFilter_bool = false, + SecPol_DHCPv6Filter_bool = false, + SecPol_DHCPv6NoServer_bool = false, + SecPol_NoRoutingV6_bool = false, + SecPol_CheckIPv6_bool = false, + SecPol_NoServerV6_bool = false, + SecPol_MaxIPv6_u32 = 1234, + SecPol_NoSavePassword_bool = false, + SecPol_AutoDisconnect_u32 = 0, + SecPol_FilterIPv4_bool = false, + SecPol_FilterIPv6_bool = false, + SecPol_FilterNonIP_bool = false, + SecPol_NoIPv6DefaultRouterInRA_bool = false, + SecPol_NoIPv6DefaultRouterInRAWhenIPv6_bool = false, + SecPol_VLanId_u32 = 0, + SecPol_Ver3_bool = true, + }; + VpnRpcSetGroup out_rpc_set_group = api.SetGroup(in_rpc_set_group); + + print_object(out_rpc_set_group); + + Console.WriteLine("End: Test_SetGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetGroup', Get group information + /// + public void Test_GetGroup() + { + Console.WriteLine("Begin: Test_GetGroup"); + + VpnRpcSetGroup in_rpc_set_group = new VpnRpcSetGroup() + { + HubName_str = hub_name, + Name_str = "group1", + }; + VpnRpcSetGroup out_rpc_set_group = api.GetGroup(in_rpc_set_group); + + print_object(out_rpc_set_group); + + Console.WriteLine("End: Test_GetGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteGroup', Delete a group + /// + public void Test_DeleteGroup() + { + Console.WriteLine("Begin: Test_DeleteGroup"); + + VpnRpcDeleteUser in_rpc_delete_user = new VpnRpcDeleteUser() + { + HubName_str = hub_name, + Name_str = "group1", + }; + VpnRpcDeleteUser out_rpc_delete_user = api.DeleteGroup(in_rpc_delete_user); + + print_object(out_rpc_delete_user); + + Console.WriteLine("End: Test_DeleteGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumGroup', Enumerate groups + /// + public void Test_EnumGroup() + { + Console.WriteLine("Begin: Test_EnumGroup"); + + VpnRpcEnumGroup in_rpc_enum_group = new VpnRpcEnumGroup() + { + HubName_str = hub_name, + }; + VpnRpcEnumGroup out_rpc_enum_group = api.EnumGroup(in_rpc_enum_group); + + print_object(out_rpc_enum_group); + + Console.WriteLine("End: Test_EnumGroup"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumSession', Enumerate sessions + /// + public VpnRpcEnumSession Test_EnumSession() + { + Console.WriteLine("Begin: Test_EnumSession"); + + VpnRpcEnumSession in_rpc_enum_session = new VpnRpcEnumSession() + { + HubName_str = hub_name, + }; + VpnRpcEnumSession out_rpc_enum_session = api.EnumSession(in_rpc_enum_session); + + print_object(out_rpc_enum_session); + + Console.WriteLine("End: Test_EnumSession"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_session; + } + + /// + /// API test for 'GetSessionStatus', Get session status + /// + public void Test_GetSessionStatus(string session_name) + { + Console.WriteLine("Begin: Test_GetSessionStatus"); + + VpnRpcSessionStatus in_rpc_session_status = new VpnRpcSessionStatus() + { + HubName_str = hub_name, + Name_str = session_name, + }; + VpnRpcSessionStatus out_rpc_session_status = api.GetSessionStatus(in_rpc_session_status); + + print_object(out_rpc_session_status); + + Console.WriteLine("End: Test_GetSessionStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteSession', Delete a session + /// + public void Test_DeleteSession(string session_id) + { + Console.WriteLine("Begin: Test_DeleteSession"); + + VpnRpcDeleteSession in_rpc_delete_session = new VpnRpcDeleteSession() + { + HubName_str = hub_name, + Name_str = session_id, + }; + VpnRpcDeleteSession out_rpc_delete_session = api.DeleteSession(in_rpc_delete_session); + + print_object(out_rpc_delete_session); + + Console.WriteLine("End: Test_DeleteSession"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumMacTable', Get MAC address table + /// + public VpnRpcEnumMacTable Test_EnumMacTable() + { + Console.WriteLine("Begin: Test_EnumMacTable"); + + VpnRpcEnumMacTable in_rpc_enum_mac_table = new VpnRpcEnumMacTable() + { + HubName_str = hub_name, + }; + VpnRpcEnumMacTable out_rpc_enum_mac_table = api.EnumMacTable(in_rpc_enum_mac_table); + + print_object(out_rpc_enum_mac_table); + + Console.WriteLine("End: Test_EnumMacTable"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_mac_table; + } + + /// + /// API test for 'DeleteMacTable', Delete MAC address table entry + /// + public void Test_DeleteMacTable(uint key32) + { + Console.WriteLine("Begin: Test_DeleteMacTable"); + + VpnRpcDeleteTable in_rpc_delete_table = new VpnRpcDeleteTable() + { + HubName_str = hub_name, + Key_u32 = key32, + }; + VpnRpcDeleteTable out_rpc_delete_table = api.DeleteMacTable(in_rpc_delete_table); + + Console.WriteLine("End: Test_DeleteMacTable"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumIpTable', Get IP address table + /// + public VpnRpcEnumIpTable Test_EnumIpTable() + { + Console.WriteLine("Begin: Test_EnumIpTable"); + + VpnRpcEnumIpTable in_rpc_enum_ip_table = new VpnRpcEnumIpTable() + { + HubName_str = hub_name, + }; + VpnRpcEnumIpTable out_rpc_enum_ip_table = api.EnumIpTable(in_rpc_enum_ip_table); + + print_object(out_rpc_enum_ip_table); + + Console.WriteLine("End: Test_EnumIpTable"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_ip_table; + } + + /// + /// API test for 'DeleteIpTable', Delete IP address table entry + /// + public void Test_DeleteIpTable(uint key32) + { + Console.WriteLine("Begin: Test_DeleteIpTable"); + + VpnRpcDeleteTable in_rpc_delete_table = new VpnRpcDeleteTable() + { + HubName_str = hub_name, + Key_u32 = key32, + }; + VpnRpcDeleteTable out_rpc_delete_table = api.DeleteIpTable(in_rpc_delete_table); + + print_object(out_rpc_delete_table); + + Console.WriteLine("End: Test_DeleteIpTable"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetKeep', Set keep-alive function setting + /// + public void Test_SetKeep() + { + Console.WriteLine("Begin: Test_SetKeep"); + + VpnRpcKeep in_rpc_keep = new VpnRpcKeep() + { + UseKeepConnect_bool = true, + KeepConnectHost_str = "www.softether.org", + KeepConnectPort_u32 = 123, + KeepConnectProtocol_u32 = VpnRpcKeepAliveProtocol.UDP, + KeepConnectInterval_u32 = 1, + }; + VpnRpcKeep out_rpc_keep = api.SetKeep(in_rpc_keep); + + print_object(out_rpc_keep); + + Console.WriteLine("End: Test_SetKeep"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetKeep', Get keep-alive function setting + /// + public void Test_GetKeep() + { + Console.WriteLine("Begin: Test_GetKeep"); + + VpnRpcKeep in_rpc_keep = new VpnRpcKeep() + { + }; + VpnRpcKeep out_rpc_keep = api.GetKeep(in_rpc_keep); + + print_object(out_rpc_keep); + + Console.WriteLine("End: Test_GetKeep"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnableSecureNAT', Enable SecureNAT function of the hub + /// + public void Test_EnableSecureNAT() + { + Console.WriteLine("Begin: Test_EnableSecureNAT"); + + VpnRpcHub in_rpc_hub = new VpnRpcHub() + { + HubName_str = hub_name, + }; + VpnRpcHub out_rpc_hub = api.EnableSecureNAT(in_rpc_hub); + + print_object(out_rpc_hub); + + Console.WriteLine("End: Test_EnableSecureNAT"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DisableSecureNAT', Disable the SecureNAT function of the hub + /// + public void Test_DisableSecureNAT() + { + Console.WriteLine("Begin: Test_DisableSecureNAT"); + + VpnRpcHub in_rpc_hub = new VpnRpcHub() + { + HubName_str = hub_name, + }; + VpnRpcHub out_rpc_hub = api.DisableSecureNAT(in_rpc_hub); + + print_object(out_rpc_hub); + + Console.WriteLine("End: Test_DisableSecureNAT"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetSecureNATOption', Set SecureNAT options + /// + public void Test_SetSecureNATOption() + { + Console.WriteLine("Begin: Test_SetSecureNATOption"); + + VpnVhOption in_vh_option = new VpnVhOption() + { + RpcHubName_str = hub_name, + MacAddress_bin = new byte[] { 0x00, 0xAC, 0x00, 0x11, 0x22, 0x33 }, + Ip_ip = "10.0.0.254", + Mask_ip = "255.255.255.0", + UseNat_bool = true, + Mtu_u32 = 1200, + NatTcpTimeout_u32 = 100, + NatUdpTimeout_u32 = 50, + UseDhcp_bool = true, + DhcpLeaseIPStart_ip = "10.0.0.101", + DhcpLeaseIPEnd_ip = "10.0.0.199", + DhcpSubnetMask_ip = "255.255.255.0", + DhcpExpireTimeSpan_u32 = 3600, + DhcpGatewayAddress_ip = "10.0.0.254", + DhcpDnsServerAddress_ip = "10.0.0.254", + DhcpDnsServerAddress2_ip = "8.8.8.8", + DhcpDomainName_str = "lab.coe.ad.jp", + SaveLog_bool = true, + ApplyDhcpPushRoutes_bool = false, + DhcpPushRoutes_str = "", + }; + VpnVhOption out_vh_option = api.SetSecureNATOption(in_vh_option); + + print_object(out_vh_option); + + Console.WriteLine("End: Test_SetSecureNATOption"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetSecureNATOption', Get SecureNAT options + /// + public void Test_GetSecureNATOption() + { + Console.WriteLine("Begin: Test_GetSecureNATOption"); + + VpnVhOption in_vh_option = new VpnVhOption() + { + RpcHubName_str = hub_name, + }; + VpnVhOption out_vh_option = api.GetSecureNATOption(in_vh_option); + + print_object(out_vh_option); + + Console.WriteLine("End: Test_GetSecureNATOption"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumNAT', Enumerate NAT entries of the SecureNAT + /// + public void Test_EnumNAT() + { + Console.WriteLine("Begin: Test_EnumNAT"); + + VpnRpcEnumNat in_rpc_enum_nat = new VpnRpcEnumNat() + { + HubName_str = hub_name, + }; + VpnRpcEnumNat out_rpc_enum_nat = api.EnumNAT(in_rpc_enum_nat); + + print_object(out_rpc_enum_nat); + + Console.WriteLine("End: Test_EnumNAT"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumDHCP', Enumerate DHCP entries + /// + public void Test_EnumDHCP() + { + Console.WriteLine("Begin: Test_EnumDHCP"); + + VpnRpcEnumDhcp in_rpc_enum_dhcp = new VpnRpcEnumDhcp() + { + HubName_str = hub_name, + }; + VpnRpcEnumDhcp out_rpc_enum_dhcp = api.EnumDHCP(in_rpc_enum_dhcp); + + print_object(out_rpc_enum_dhcp); + + Console.WriteLine("End: Test_EnumDHCP"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetSecureNATStatus', Get status of the SecureNAT + /// + public void Test_GetSecureNATStatus() + { + Console.WriteLine("Begin: Test_GetSecureNATStatus"); + + VpnRpcNatStatus in_rpc_nat_status = new VpnRpcNatStatus() + { + HubName_str = hub_name, + }; + VpnRpcNatStatus out_rpc_nat_status = api.GetSecureNATStatus(in_rpc_nat_status); + + print_object(out_rpc_nat_status); + + Console.WriteLine("End: Test_GetSecureNATStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumEthernet', Enumerate Ethernet devices + /// + public void Test_EnumEthernet() + { + Console.WriteLine("Begin: Test_EnumEthernet"); + + VpnRpcEnumEth out_rpc_enum_eth = api.EnumEthernet(); + + print_object(out_rpc_enum_eth); + + Console.WriteLine("End: Test_EnumEthernet"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddLocalBridge', Add a new local bridge + /// + public void Test_AddLocalBridge() + { + Console.WriteLine("Begin: Test_AddLocalBridge"); + + VpnRpcLocalBridge in_rpc_localbridge = new VpnRpcLocalBridge() + { + DeviceName_str = "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str = hub_name, + }; + VpnRpcLocalBridge out_rpc_localbridge = api.AddLocalBridge(in_rpc_localbridge); + + print_object(out_rpc_localbridge); + + Console.WriteLine("End: Test_AddLocalBridge"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteLocalBridge', Delete a local bridge + /// + public void Test_DeleteLocalBridge() + { + Console.WriteLine("Begin: Test_DeleteLocalBridge"); + + VpnRpcLocalBridge in_rpc_localbridge = new VpnRpcLocalBridge() + { + DeviceName_str = "Intel(R) Ethernet Connection (2) I219-V (ID=3632031273)", + HubNameLB_str = hub_name, + }; + VpnRpcLocalBridge out_rpc_localbridge = api.DeleteLocalBridge(in_rpc_localbridge); + + print_object(out_rpc_localbridge); + + Console.WriteLine("End: Test_DeleteLocalBridge"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumLocalBridge', Enumerate local bridges + /// + public void Test_EnumLocalBridge() + { + Console.WriteLine("Begin: Test_EnumLocalBridge"); + + VpnRpcEnumLocalBridge out_rpc_enum_localbridge = api.EnumLocalBridge(); + + print_object(out_rpc_enum_localbridge); + + Console.WriteLine("End: Test_EnumLocalBridge"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetBridgeSupport', Get availability to localbridge function + /// + public void Test_GetBridgeSupport() + { + Console.WriteLine("Begin: Test_GetBridgeSupport"); + + VpnRpcBridgeSupport out_rpc_bridge_support = api.GetBridgeSupport(); + + print_object(out_rpc_bridge_support); + + Console.WriteLine("End: Test_GetBridgeSupport"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'RebootServer', Reboot server itself + /// + public void Test_RebootServer() + { + Console.WriteLine("Begin: Test_RebootServer"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + }; + VpnRpcTest out_rpc_test = api.RebootServer(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_RebootServer"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetCaps', Get capabilities + /// + public void Test_GetCaps() + { + Console.WriteLine("Begin: Test_GetCaps"); + + VpnCapslist out_capslist = api.GetCaps(); + + print_object(out_capslist); + + Console.WriteLine("End: Test_GetCaps"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetConfig', Get configuration file stream + /// + public void Test_GetConfig() + { + Console.WriteLine("Begin: Test_GetConfig"); + + VpnRpcConfig out_rpc_config = api.GetConfig(); + + print_object(out_rpc_config); + + Console.WriteLine("End: Test_GetConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetConfig', Overwrite configuration file by specified data + /// + public void Test_SetConfig() + { + Console.WriteLine("Begin: Test_SetConfig"); + + VpnRpcConfig in_rpc_config = new VpnRpcConfig() + { + FileData_bin = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, }, + }; + VpnRpcConfig out_rpc_config = api.SetConfig(in_rpc_config); + + Console.WriteLine("End: Test_SetConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetDefaultHubAdminOptions', Get default hub administration options + /// + public void Test_GetDefaultHubAdminOptions() + { + Console.WriteLine("Begin: Test_GetDefaultHubAdminOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + }; + VpnRpcAdminOption out_rpc_admin_option = api.GetDefaultHubAdminOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_GetDefaultHubAdminOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubAdminOptions', Get hub administration options + /// + public void Test_GetHubAdminOptions() + { + Console.WriteLine("Begin: Test_GetHubAdminOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + }; + VpnRpcAdminOption out_rpc_admin_option = api.GetHubAdminOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_GetHubAdminOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubAdminOptions', Set hub administration options + /// + public void Test_SetHubAdminOptions() + { + Console.WriteLine("Begin: Test_SetHubAdminOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + AdminOptionList = new VpnAdminOption[] + { + new VpnAdminOption() + { + Name_str = "no_securenat_enablenat", + Value_u32 = 1, + } + } + }; + VpnRpcAdminOption out_rpc_admin_option = api.SetHubAdminOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_SetHubAdminOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubExtOptions', Get hub extended options + /// + public void Test_GetHubExtOptions() + { + Console.WriteLine("Begin: Test_GetHubExtOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + }; + VpnRpcAdminOption out_rpc_admin_option = api.GetHubExtOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_GetHubExtOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubExtOptions', Set hub extended options + /// + public void Test_SetHubExtOptions() + { + Console.WriteLine("Begin: Test_SetHubExtOptions"); + + VpnRpcAdminOption in_rpc_admin_option = new VpnRpcAdminOption() + { + HubName_str = hub_name, + AdminOptionList = new VpnAdminOption[] + { + new VpnAdminOption() + { + Name_str = "SecureNAT_RandomizeAssignIp", + Value_u32 = 1, + } + } + }; + VpnRpcAdminOption out_rpc_admin_option = api.SetHubExtOptions(in_rpc_admin_option); + + print_object(out_rpc_admin_option); + + Console.WriteLine("End: Test_SetHubExtOptions"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddL3Switch', Add a new virtual layer-3 switch + /// + public void Test_AddL3Switch() + { + Console.WriteLine("Begin: Test_AddL3Switch"); + + VpnRpcL3Sw in_rpc_l3sw = new VpnRpcL3Sw() + { + Name_str = "L3SW1", + }; + VpnRpcL3Sw out_rpc_l3sw = api.AddL3Switch(in_rpc_l3sw); + + print_object(out_rpc_l3sw); + + Console.WriteLine("End: Test_AddL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DelL3Switch', Delete a virtual layer-3 switch + /// + public void Test_DelL3Switch() + { + Console.WriteLine("Begin: Test_DelL3Switch"); + + VpnRpcL3Sw in_rpc_l3sw = new VpnRpcL3Sw() + { + Name_str = "L3SW1", + }; + VpnRpcL3Sw out_rpc_l3sw = api.DelL3Switch(in_rpc_l3sw); + + print_object(out_rpc_l3sw); + + Console.WriteLine("End: Test_DelL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumL3Switch', Enumerate virtual layer-3 switches + /// + public void Test_EnumL3Switch() + { + Console.WriteLine("Begin: Test_EnumL3Switch"); + + VpnRpcEnumL3Sw out_rpc_enum_l3sw = api.EnumL3Switch(); + + print_object(out_rpc_enum_l3sw); + + Console.WriteLine("End: Test_EnumL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'StartL3Switch', Start a virtual layer-3 switch + /// + public void Test_StartL3Switch() + { + Console.WriteLine("Begin: Test_StartL3Switch"); + + VpnRpcL3Sw in_rpc_l3sw = new VpnRpcL3Sw() + { + Name_str = "L3SW1", + }; + VpnRpcL3Sw out_rpc_l3sw = api.StartL3Switch(in_rpc_l3sw); + + print_object(out_rpc_l3sw); + + Console.WriteLine("End: Test_StartL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'StopL3Switch', Stop a virtual layer-3 switch + /// + public void Test_StopL3Switch() + { + Console.WriteLine("Begin: Test_StopL3Switch"); + + VpnRpcL3Sw in_rpc_l3sw = new VpnRpcL3Sw() + { + Name_str = "L3SW1", + }; + VpnRpcL3Sw out_rpc_l3sw = api.StopL3Switch(in_rpc_l3sw); + + print_object(out_rpc_l3sw); + + Console.WriteLine("End: Test_StopL3Switch"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddL3If', Add new virtual interface on virtual L3 switch + /// + public void Test_AddL3If() + { + Console.WriteLine("Begin: Test_AddL3If"); + + VpnRpcL3If in_rpc_l3if = new VpnRpcL3If() + { + Name_str = "L3SW1", + HubName_str = hub_name, + IpAddress_ip = "192.168.0.1", + SubnetMask_ip = "255.255.255.0", + }; + VpnRpcL3If out_rpc_l3if = api.AddL3If(in_rpc_l3if); + + print_object(out_rpc_l3if); + + Console.WriteLine("End: Test_AddL3If"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DelL3If', Delete a virtual interface on virtual L3 switch + /// + public void Test_DelL3If() + { + Console.WriteLine("Begin: Test_DelL3If"); + + VpnRpcL3If in_rpc_l3if = new VpnRpcL3If() + { + Name_str = "L3SW1", + HubName_str = hub_name, + }; + VpnRpcL3If out_rpc_l3if = api.DelL3If(in_rpc_l3if); + + print_object(out_rpc_l3if); + + Console.WriteLine("End: Test_DelL3If"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumL3If', Enumerate virtual interfaces on virtual L3 switch + /// + public void Test_EnumL3If() + { + Console.WriteLine("Begin: Test_EnumL3If"); + + VpnRpcEnumL3If in_rpc_enum_l3if = new VpnRpcEnumL3If() + { + Name_str = "L3SW1", + }; + VpnRpcEnumL3If out_rpc_enum_l3if = api.EnumL3If(in_rpc_enum_l3if); + + print_object(out_rpc_enum_l3if); + + Console.WriteLine("End: Test_EnumL3If"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddL3Table', Add new routing table entry on virtual L3 switch + /// + public void Test_AddL3Table() + { + Console.WriteLine("Begin: Test_AddL3Table"); + + VpnRpcL3Table in_rpc_l3table = new VpnRpcL3Table() + { + Name_str = "L3SW1", + NetworkAddress_ip = "10.0.0.0", + SubnetMask_ip = "255.0.0.0", + GatewayAddress_ip = "192.168.7.1", + Metric_u32 = 10, + }; + VpnRpcL3Table out_rpc_l3table = api.AddL3Table(in_rpc_l3table); + + print_object(out_rpc_l3table); + + Console.WriteLine("End: Test_AddL3Table"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DelL3Table', Delete routing table entry on virtual L3 switch + /// + public void Test_DelL3Table() + { + Console.WriteLine("Begin: Test_DelL3Table"); + + VpnRpcL3Table in_rpc_l3table = new VpnRpcL3Table() + { + Name_str = "L3SW1", + NetworkAddress_ip = "10.0.0.0", + SubnetMask_ip = "255.0.0.0", + GatewayAddress_ip = "192.168.7.1", + Metric_u32 = 10, + }; + VpnRpcL3Table out_rpc_l3table = api.DelL3Table(in_rpc_l3table); + + print_object(out_rpc_l3table); + + Console.WriteLine("End: Test_DelL3Table"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumL3Table', Get routing table on virtual L3 switch + /// + public void Test_EnumL3Table() + { + Console.WriteLine("Begin: Test_EnumL3Table"); + + VpnRpcEnumL3Table in_rpc_enum_l3table = new VpnRpcEnumL3Table() + { + Name_str = "L3SW1", + }; + VpnRpcEnumL3Table out_rpc_enum_l3table = api.EnumL3Table(in_rpc_enum_l3table); + + print_object(out_rpc_enum_l3table); + + Console.WriteLine("End: Test_EnumL3Table"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumCrl', Get CRL (Certificate Revocation List) index + /// + public VpnRpcEnumCrl Test_EnumCrl() + { + Console.WriteLine("Begin: Test_EnumCrl"); + + VpnRpcEnumCrl in_rpc_enum_crl = new VpnRpcEnumCrl() + { + HubName_str = hub_name, + }; + VpnRpcEnumCrl out_rpc_enum_crl = api.EnumCrl(in_rpc_enum_crl); + + print_object(out_rpc_enum_crl); + + Console.WriteLine("End: Test_EnumCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_crl; + } + + /// + /// API test for 'AddCrl', Add new CRL (Certificate Revocation List) entry + /// + public void Test_AddCrl() + { + Console.WriteLine("Begin: Test_AddCrl"); + + VpnRpcCrl in_rpc_crl = new VpnRpcCrl() + { + HubName_str = hub_name, + CommonName_utf = "CN", + Organization_utf = "Org", + Unit_utf = "ICSCOE", + Country_utf = "JP", + State_utf = "Ibaraki", + Local_utf = "Tsukuba", + Serial_bin = new byte[] { 1, 2, 3, 4, 5 }, + DigestMD5_bin = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, + DigestSHA1_bin = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }, + }; + VpnRpcCrl out_rpc_crl = api.AddCrl(in_rpc_crl); + + print_object(out_rpc_crl); + + Console.WriteLine("End: Test_AddCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DelCrl', Delete CRL (Certificate Revocation List) entry + /// + public void Test_DelCrl(uint key) + { + Console.WriteLine("Begin: Test_DelCrl"); + + VpnRpcCrl in_rpc_crl = new VpnRpcCrl() + { + HubName_str = hub_name, + Key_u32 = key, + }; + VpnRpcCrl out_rpc_crl = api.DelCrl(in_rpc_crl); + + print_object(out_rpc_crl); + + Console.WriteLine("End: Test_DelCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetCrl', Get CRL (Certificate Revocation List) entry + /// + public VpnRpcCrl Test_GetCrl(uint key) + { + Console.WriteLine("Begin: Test_GetCrl"); + + VpnRpcCrl in_rpc_crl = new VpnRpcCrl() + { + HubName_str = hub_name, + Key_u32 = key, + }; + VpnRpcCrl out_rpc_crl = api.GetCrl(in_rpc_crl); + + print_object(out_rpc_crl); + + Console.WriteLine("End: Test_GetCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_crl; + } + + /// + /// API test for 'SetCrl', Set CRL (Certificate Revocation List) entry + /// + public void Test_SetCrl(VpnRpcCrl crl) + { + Console.WriteLine("Begin: Test_SetCrl"); + + VpnRpcCrl out_rpc_crl = api.SetCrl(crl); + + print_object(out_rpc_crl); + + Console.WriteLine("End: Test_SetCrl"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetAcList', Set access control list + /// + public void Test_SetAcList() + { + Console.WriteLine("Begin: Test_SetAcList"); + + VpnRpcAcList in_rpc_ac_list = new VpnRpcAcList() + { + HubName_str = hub_name, + + ACList = new VpnAc[] + { + new VpnAc() + { + Deny_bool = true, + IpAddress_ip = "192.168.0.0", + SubnetMask_ip = "255.255.0.0", + Masked_bool = true, + Priority_u32 = 123, + }, + new VpnAc() + { + Deny_bool = false, + IpAddress_ip = "fe80::", + SubnetMask_ip = "8", + Masked_bool = true, + Priority_u32 = 123, + }, + } + }; + VpnRpcAcList out_rpc_ac_list = api.SetAcList(in_rpc_ac_list); + + print_object(out_rpc_ac_list); + + Console.WriteLine("End: Test_SetAcList"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetAcList', Get access control list + /// + public void Test_GetAcList() + { + Console.WriteLine("Begin: Test_GetAcList"); + + VpnRpcAcList in_rpc_ac_list = new VpnRpcAcList() + { + HubName_str = hub_name, + }; + VpnRpcAcList out_rpc_ac_list = api.GetAcList(in_rpc_ac_list); + + print_object(out_rpc_ac_list); + + Console.WriteLine("End: Test_GetAcList"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumLogFile', Enumerate log files + /// + public VpnRpcEnumLogFile Test_EnumLogFile() + { + Console.WriteLine("Begin: Test_EnumLogFile"); + + VpnRpcEnumLogFile out_rpc_enum_log_file = api.EnumLogFile(); + + print_object(out_rpc_enum_log_file); + + Console.WriteLine("End: Test_EnumLogFile"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_log_file; + } + + /// + /// API test for 'ReadLogFile', Read a log file + /// + public void Test_ReadLogFile(string filename) + { + Console.WriteLine("Begin: Test_ReadLogFile"); + + VpnRpcReadLogFile in_rpc_read_log_file = new VpnRpcReadLogFile() + { + FilePath_str = filename, + }; + VpnRpcReadLogFile out_rpc_read_log_file = api.ReadLogFile(in_rpc_read_log_file); + + print_object(out_rpc_read_log_file); + + Console.WriteLine("End: Test_ReadLogFile"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetSysLog', Set syslog function setting + /// + public void Test_SetSysLog(bool flag) + { + Console.WriteLine("Begin: Test_SetSysLog"); + + VpnSyslogSetting in_syslog_setting = new VpnSyslogSetting() + { + SaveType_u32 = flag ? VpnSyslogSaveType.ServerAndHubAllLog : VpnSyslogSaveType.None, + Hostname_str = "1.2.3.4", + Port_u32 = 123, + }; + VpnSyslogSetting out_syslog_setting = api.SetSysLog(in_syslog_setting); + + print_object(out_syslog_setting); + + Console.WriteLine("End: Test_SetSysLog"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetSysLog', Get syslog function setting + /// + public void Test_GetSysLog() + { + Console.WriteLine("Begin: Test_GetSysLog"); + + VpnSyslogSetting in_syslog_setting = new VpnSyslogSetting() + { + }; + VpnSyslogSetting out_syslog_setting = api.GetSysLog(in_syslog_setting); + + print_object(out_syslog_setting); + + Console.WriteLine("End: Test_GetSysLog"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetHubMsg', Set message of today on hub + /// + public void Test_SetHubMsg() + { + Console.WriteLine("Begin: Test_SetHubMsg"); + + VpnRpcMsg in_rpc_msg = new VpnRpcMsg() + { + HubName_str = hub_name, + Msg_bin = new byte[] + { +0x57,0x6f,0x72,0x6b,0x69,0x6e,0x67,0x20,0x4d,0x65,0x6e,0x20,0x6f,0x66,0x20,0x41, +0x6c,0x6c,0x20,0x43,0x6f,0x75,0x6e,0x74,0x72,0x69,0x65,0x73,0x2c,0x20,0x55,0x6e, +0x69,0x74,0x65,0x21,0x20,0xe4,0xb8,0x87,0xe5,0x9b,0xbd,0xe3,0x81,0xae,0xe5,0x8a, +0xb4,0xe5,0x83,0x8d,0xe8,0x80,0x85,0xe3,0x82,0x88,0xe3,0x80,0x81,0xe5,0x9b,0xa3, +0xe7,0xb5,0x90,0xe3,0x81,0x9b,0xe3,0x82,0x88,0x21,0x20,0xd7,0x92,0xd7,0x91,0xd7, +0xa8,0xd7,0x99,0xd7,0x9d,0x20,0xd7,0xa2,0xd7,0x95,0xd7,0x91,0xd7,0x93,0xd7,0x99, +0xd7,0x9d,0x20,0xd7,0xa9,0xd7,0x9c,0x20,0xd7,0x9b,0xd7,0x9c,0x20,0xd7,0x94,0xd7, +0x9e,0xd7,0x93,0xd7,0x99,0xd7,0xa0,0xd7,0x95,0xd7,0xaa,0x2c,0x20,0xd7,0x94,0xd7, +0xaa,0xd7,0x90,0xd7,0x97,0xd7,0x93,0xd7,0x95,0x21 + }, + }; + VpnRpcMsg out_rpc_msg = api.SetHubMsg(in_rpc_msg); + + print_object(out_rpc_msg); + + Console.WriteLine("End: Test_SetHubMsg"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetHubMsg', Get message of today on hub + /// + public void Test_GetHubMsg() + { + Console.WriteLine("Begin: Test_GetHubMsg"); + + VpnRpcMsg in_rpc_msg = new VpnRpcMsg() + { + HubName_str = hub_name, + }; + VpnRpcMsg out_rpc_msg = api.GetHubMsg(in_rpc_msg); + + print_object(out_rpc_msg); + + Console.WriteLine("End: Test_GetHubMsg"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'Crash', Do Crash + /// + public void Test_Crash() + { + Console.WriteLine("Begin: Test_Crash"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + }; + VpnRpcTest out_rpc_test = api.Crash(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_Crash"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetAdminMsg', Get message for administrators + /// + public void Test_GetAdminMsg() + { + Console.WriteLine("Begin: Test_GetAdminMsg"); + + VpnRpcMsg out_rpc_msg = api.GetAdminMsg(); + + print_object(out_rpc_msg); + + Console.WriteLine("End: Test_GetAdminMsg"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'Flush', Flush configuration file + /// + public void Test_Flush() + { + Console.WriteLine("Begin: Test_Flush"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + }; + VpnRpcTest out_rpc_test = api.Flush(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_Flush"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetIPsecServices', Set IPsec service configuration + /// + public void Test_SetIPsecServices() + { + Console.WriteLine("Begin: Test_SetIPsecServices"); + + VpnIPsecServices in_ipsec_services = new VpnIPsecServices() + { + L2TP_Raw_bool = false, + L2TP_IPsec_bool = false, + EtherIP_IPsec_bool = false, + IPsec_Secret_str = "vpn", + L2TP_DefaultHub_str = "HUB_ABC", + }; + VpnIPsecServices out_ipsec_services = api.SetIPsecServices(in_ipsec_services); + + print_object(out_ipsec_services); + + Console.WriteLine("End: Test_SetIPsecServices"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetIPsecServices', Get IPsec service configuration + /// + public void Test_GetIPsecServices() + { + Console.WriteLine("Begin: Test_GetIPsecServices"); + + VpnIPsecServices out_ipsec_services = api.GetIPsecServices(); + + print_object(out_ipsec_services); + + Console.WriteLine("End: Test_GetIPsecServices"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'AddEtherIpId', Add EtherIP ID setting + /// + public void Test_AddEtherIpId() + { + Console.WriteLine("Begin: Test_AddEtherIpId"); + + VpnEtherIpId in_etherip_id = new VpnEtherIpId() + { + Id_str = "testid", + HubName_str = hub_name, + UserName_str = "nekosan", + Password_str = "torisan", + }; + VpnEtherIpId out_etherip_id = api.AddEtherIpId(in_etherip_id); + + print_object(out_etherip_id); + + Console.WriteLine("End: Test_AddEtherIpId"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetEtherIpId', Get EtherIP ID setting + /// + public void Test_GetEtherIpId(string id) + { + Console.WriteLine("Begin: Test_GetEtherIpId"); + + VpnEtherIpId in_etherip_id = new VpnEtherIpId() + { + Id_str = id, + }; + VpnEtherIpId out_etherip_id = api.GetEtherIpId(in_etherip_id); + + print_object(out_etherip_id); + + Console.WriteLine("End: Test_GetEtherIpId"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'DeleteEtherIpId', Delete EtherIP ID setting + /// + public void Test_DeleteEtherIpId(string id) + { + Console.WriteLine("Begin: Test_DeleteEtherIpId"); + + VpnEtherIpId in_etherip_id = new VpnEtherIpId() + { + Id_str = id, + }; + VpnEtherIpId out_etherip_id = api.DeleteEtherIpId(in_etherip_id); + + print_object(out_etherip_id); + + Console.WriteLine("End: Test_DeleteEtherIpId"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'EnumEtherIpId', Enumerate EtherIP ID settings + /// + public VpnRpcEnumEtherIpId Test_EnumEtherIpId() + { + Console.WriteLine("Begin: Test_EnumEtherIpId"); + + VpnRpcEnumEtherIpId out_rpc_enum_etherip_id = api.EnumEtherIpId(); + + print_object(out_rpc_enum_etherip_id); + + Console.WriteLine("End: Test_EnumEtherIpId"); + Console.WriteLine("-----"); + Console.WriteLine(); + + return out_rpc_enum_etherip_id; + } + + /// + /// API test for 'SetOpenVpnSstpConfig', Set configurations for OpenVPN and SSTP + /// + public void Test_SetOpenVpnSstpConfig() + { + Console.WriteLine("Begin: Test_SetOpenVpnSstpConfig"); + + VpnOpenVpnSstpConfig in_openvpn_sstp_config = new VpnOpenVpnSstpConfig() + { + EnableOpenVPN_bool = true, + OpenVPNPortList_str = "1 2 3 4 5", + EnableSSTP_bool = true, + }; + VpnOpenVpnSstpConfig out_openvpn_sstp_config = api.SetOpenVpnSstpConfig(in_openvpn_sstp_config); + + print_object(out_openvpn_sstp_config); + + Console.WriteLine("End: Test_SetOpenVpnSstpConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetOpenVpnSstpConfig', Get configurations for OpenVPN and SSTP + /// + public void Test_GetOpenVpnSstpConfig() + { + Console.WriteLine("Begin: Test_GetOpenVpnSstpConfig"); + + VpnOpenVpnSstpConfig out_openvpn_sstp_config = api.GetOpenVpnSstpConfig(); + + print_object(out_openvpn_sstp_config); + + Console.WriteLine("End: Test_GetOpenVpnSstpConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetDDnsClientStatus', Get status of DDNS client + /// + public void Test_GetDDnsClientStatus() + { + Console.WriteLine("Begin: Test_GetDDnsClientStatus"); + + VpnDDnsClientStatus out_ddns_client_status = api.GetDDnsClientStatus(); + + print_object(out_ddns_client_status); + + Console.WriteLine("End: Test_GetDDnsClientStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'ChangeDDnsClientHostname', Change host-name for DDNS client + /// + public void Test_ChangeDDnsClientHostname() + { + Console.WriteLine("Begin: Test_ChangeDDnsClientHostname"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + StrValue_str = "nekotest" + rand.Next(1000000000, 2100000000), + }; + VpnRpcTest out_rpc_test = api.ChangeDDnsClientHostname(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_ChangeDDnsClientHostname"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'RegenerateServerCert', Regenerate server certification + /// + public void Test_RegenerateServerCert() + { + Console.WriteLine("Begin: Test_RegenerateServerCert"); + + VpnRpcTest in_rpc_test = new VpnRpcTest() + { + StrValue_str = "abc.example.org", + }; + + VpnRpcTest out_rpc_test = api.RegenerateServerCert(in_rpc_test); + + print_object(out_rpc_test); + + Console.WriteLine("End: Test_RegenerateServerCert"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'MakeOpenVpnConfigFile', Generate OpenVPN configuration files + /// + public void Test_MakeOpenVpnConfigFile() + { + Console.WriteLine("Begin: Test_MakeOpenVpnConfigFile"); + + VpnRpcReadLogFile out_rpc_read_log_file = api.MakeOpenVpnConfigFile(); + + print_object(out_rpc_read_log_file); + + Console.WriteLine("End: Test_MakeOpenVpnConfigFile"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetSpecialListener', Set special listener status + /// + public void Test_SetSpecialListener() + { + Console.WriteLine("Begin: Test_SetSpecialListener"); + + VpnRpcSpecialListener in_rpc_special_listener = new VpnRpcSpecialListener() + { + VpnOverDnsListener_bool = true, + VpnOverIcmpListener_bool = true, + }; + VpnRpcSpecialListener out_rpc_special_listener = api.SetSpecialListener(in_rpc_special_listener); + + print_object(out_rpc_special_listener); + + Console.WriteLine("End: Test_SetSpecialListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetSpecialListener', Get special listener status + /// + public void Test_GetSpecialListener() + { + Console.WriteLine("Begin: Test_GetSpecialListener"); + + VpnRpcSpecialListener out_rpc_special_listener = api.GetSpecialListener(); + + print_object(out_rpc_special_listener); + + Console.WriteLine("End: Test_GetSpecialListener"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetAzureStatus', Get Azure status + /// + public void Test_GetAzureStatus() + { + Console.WriteLine("Begin: Test_GetAzureStatus"); + + VpnRpcAzureStatus out_rpc_azure_status = api.GetAzureStatus(); + + print_object(out_rpc_azure_status); + + Console.WriteLine("End: Test_GetAzureStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetAzureStatus', Set Azure status + /// + public void Test_SetAzureStatus() + { + Console.WriteLine("Begin: Test_SetAzureStatus"); + + VpnRpcAzureStatus in_rpc_azure_status = new VpnRpcAzureStatus() + { + IsEnabled_bool = true, + }; + VpnRpcAzureStatus out_rpc_azure_status = api.SetAzureStatus(in_rpc_azure_status); + + print_object(out_rpc_azure_status); + + Console.WriteLine("End: Test_SetAzureStatus"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetDDnsInternetSettng', Get DDNS proxy configuration + /// + public void Test_GetDDnsInternetSettng() + { + Console.WriteLine("Begin: Test_GetDDnsInternetSettng"); + + VpnInternetSetting out_internet_setting = api.GetDDnsInternetSettng(); + + print_object(out_internet_setting); + + Console.WriteLine("End: Test_GetDDnsInternetSettng"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetDDnsInternetSettng', Set DDNS proxy configuration + /// + public void Test_SetDDnsInternetSettng() + { + Console.WriteLine("Begin: Test_SetDDnsInternetSettng"); + + VpnInternetSetting in_internet_setting = new VpnInternetSetting() + { + ProxyType_u32 = VpnRpcProxyType.Direct, + ProxyHostName_str = "1.2.3.4", + ProxyPort_u32 = 1234, + ProxyUsername_str = "neko", + ProxyPassword_str = "dog", + }; + VpnInternetSetting out_internet_setting = api.SetDDnsInternetSettng(in_internet_setting); + + print_object(out_internet_setting); + + Console.WriteLine("End: Test_SetDDnsInternetSettng"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'SetVgsConfig', Setting VPN Gate Server Configuration + /// + public void Test_SetVgsConfig() + { + Console.WriteLine("Begin: Test_SetVgsConfig"); + + VpnVgsConfig in_vgs_config = new VpnVgsConfig() + { + IsEnabled_bool = false, + Message_utf = "Neko san!!!", + Owner_utf = "Go go go!!!", + Abuse_utf = "da.test@softether.co.jp", + NoLog_bool = false, + LogPermanent_bool = true, + EnableL2TP_bool = true, + }; + VpnVgsConfig out_vgs_config = api.SetVgsConfig(in_vgs_config); + + print_object(out_vgs_config); + + Console.WriteLine("End: Test_SetVgsConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + /// + /// API test for 'GetVgsConfig', Get VPN Gate configuration + /// + public void Test_GetVgsConfig() + { + Console.WriteLine("Begin: Test_GetVgsConfig"); + + VpnVgsConfig out_vgs_config = api.GetVgsConfig(); + + print_object(out_vgs_config); + + Console.WriteLine("End: Test_GetVgsConfig"); + Console.WriteLine("-----"); + Console.WriteLine(); + } + + + void print_object(object obj) + { + var setting = new Newtonsoft.Json.JsonSerializerSettings() + { + NullValueHandling = Newtonsoft.Json.NullValueHandling.Include, + ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Error, + }; + string str = Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented, setting); + Console.WriteLine(str); + } +} diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/FUNDING.yml softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/FUNDING.yml --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/FUNDING.yml 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/FUNDING.yml 2019-07-23 21:37:11.000000000 +0000 @@ -0,0 +1 @@ +custom: https://salt.bountysource.com/teams/softether-vpn diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/.gitlab-ci.yml softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/.gitlab-ci.yml --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/.gitlab-ci.yml 2019-04-21 08:03:28.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/.gitlab-ci.yml 2019-07-23 21:37:11.000000000 +0000 @@ -27,6 +27,16 @@ <<: *ubuntu_def image: ubuntu:precise +# illumos gitlab-runner maintained by @hww3 +build_illumos: + only: + - master@SoftEther/SoftEtherVPN + tags: + - illumos + script: + - git submodule init && git submodule update + - CMAKE_FLAGS="-DCMAKE_PREFIX_PATH=/opt/local -DCMAKE_CXX_FLAGS=-m64 -DCMAKE_C_FLAGS=-m64" ./configure + - gmake -C tmp # # flawfinder diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/README.md softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/README.md --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/README.md 2019-04-21 08:03:28.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/README.md 2019-07-23 21:37:11.000000000 +0000 @@ -9,6 +9,9 @@ * [For Ubuntu](#for-ubuntu) * [From binary installers:](#from-binary-installers) * [Build from Source code](#build-from-source-code) +- [About HTML5-based Modern Admin Console and JSON-RPC API Suite](#about-html5-based-modern-admin-console-and-json-rpc-api-suite) + * [Built-in SoftEther VPN Server HTML5 Ajax-based Web Administration Console](#built-in-softether-vpn-server-html5-ajax-based-web-administration-console) + * [Built-in SoftEther Server VPN JSON-RPC API Suite](#built-in-softether-server-vpn-json-rpc-api-suite) - [TO CIRCUMVENT YOUR GOVERNMENT'S FIREWALL RESTRICTION](#to-circumvent-your-governments-firewall-restriction) - [SOURCE CODE CONTRIBUTION](#source-code-contribution) - [DEAR SECURITY EXPERTS](#dear-security-experts) @@ -154,6 +157,39 @@ 1. Unstable. Found under https://github.com/SoftEtherVPN/SoftEtherVPN 2. Stable. Found under https://github.com/SoftEtherVPN/SoftEtherVPN_Stable + +# About HTML5-based Modern Admin Console and JSON-RPC API Suite + +## Built-in SoftEther VPN Server HTML5 Ajax-based Web Administration Console +We are developing the HTML5 Ajax-based Web Administration Console (currently very limited, under construction) in the embedded HTTPS server on the SoftEther VPN Server. + +Access to the following URL from your favorite web browser. + +``` +https://:/admin/ +``` + +For example if your VPN Server is running as the port 5555 on the host at 192.168.0.1, you can access to the web console by: + +``` +https://192.168.0.1:5555/admin/ +``` + +Note: Your HTML5 development contribution is very appreciated. The current HTML5 pages are written by Daiyuu Nobori (the core developer of SoftEther VPN). He is obviously lack of HTML5 development ability. Please kindly consider to contribute for SoftEther VPN's development on GitHub. Your code will help every people running SoftEther VPN Server. + + +## Built-in SoftEther Server VPN JSON-RPC API Suite +The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions). + +You can access to the [latest SoftEther VPN Server JSON-RPC Document on GitHub.](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/) + +- Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API. +You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.) +- If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server. +- No need to use any specific API client library since all APIs are provided on the JSON-RPC 2.0 Specification. You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment. +- Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. The Node.js Client Library for VPN Server RPC (vpnrpc) package is also available. + + # TO CIRCUMVENT YOUR GOVERNMENT'S FIREWALL RESTRICTION Because SoftEther VPN is overly strong tool to build a VPN tunnel, Binary files /tmp/tmpXff31u/o0NpDuQkSr/softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/DriverPackages/See/x64/See_x64.sys and /tmp/tmpXff31u/hjvl7ipFIh/softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/DriverPackages/See/x64/See_x64.sys differ Binary files /tmp/tmpXff31u/o0NpDuQkSr/softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/DriverPackages/See/x86/See_x86.sys and /tmp/tmpXff31u/hjvl7ipFIh/softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/DriverPackages/See/x86/See_x86.sys differ diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_cn.stb softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_cn.stb --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_cn.stb 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_cn.stb 2019-07-23 21:37:12.000000000 +0000 @@ -157,11 +157,11 @@ ERR_92 具有指定名称的虚拟 3 层交换机已存在。指定一个不同的名称。 ERR_93 找不到指定的虚拟 3 层交换机。 ERR_94 指定的名称无效。检查名称是否有不能使用的字符 -ERR_95 无法添加虚拟 3 层接口。 -ERR_96 无法删除虚拟 3 层接口。 +ERR_95 无法添加虚拟 3 层接口。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. +ERR_96 无法删除虚拟 3 层接口。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. ERR_97 与指定虚拟 3 层交换接口的目标虚拟 HUB 连接的虚拟 3 层接口已在虚拟 3 层交换机中存在。不能在同一个虚拟 3 层交换机中定义超过一个连接到同一个虚拟 HUB 的虚拟 3 层接口。 -ERR_98 无法添加路由表项。 -ERR_99 无法删除路由表项。 +ERR_98 无法添加路由表项。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. +ERR_99 无法删除路由表项。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. ERR_100 指定的路由表项已存在。 ERR_101 客户端和服务器的时钟彼此不同步。检查时间设置。 ERR_102 无法启动此虚拟 3 层交换机。 要启动虚拟 3 层交换机,必须在虚拟 3 层交换机定义至少一个虚拟接口。 @@ -1805,6 +1805,9 @@ LS_LICENSE_NOT_VPNCLUSTER 连接 "%S": 许可证错误。此 VPN Server 上注册的许可证是禁止使用当前群集功能的类型,且一个 VPN Client 已尝试在群集模式下连接。您必须重启 VPN Server。 LS_LICENSE_VIOLATION 连接 "%S": VPN Server 发生违反许可证错误,不接受连接。 LS_LICENSE_VIOLATION_DETECTED 发现许可证违反错误,一个不同的 VPN Server 与此服务端具有相同的服务端ID "%I64u"。可能是在群集中有两个或以上 VPN Server 正在使用相同的许可证。请检查每一个 VPN Server 的许可证信息。 +LS_API_AUTH_OK HTTPS API client "%r:%u" (%S): Administration mode: "%S": The embedded HTTPS web server accepted the successful login. Username: "%S", Method: "%S", Path: "%S" +LS_API_AUTH_ERROR HTTPS API client "%r:%u" (%S): The embedded HTTPS web server refused a login attempt. Username: "%S", Method: "%S", Path: "%S" +LS_API_RPC_CALL HTTPS API client "%r:%u" (%S): The client called a JSON-API. Method: "%S", Returned error code: %u (0 = success), Returned error message: "%s" # (OpenVPN Logs) @@ -7160,6 +7163,8 @@ SW_UNINSTALLINFO_URL http://selinks.org/ SW_UNINSTALLINFO_PUBLISHER SoftEther VPN Project +SW_KB3033929_REQUIRED In Windows 7 and Windows Server 2008 R2, some SoftEther VPN functions require the Microsoft's Windows Update module KB3033929 installed.\r\n\r\nIf KB3033929 is not installed in your Windows, please install it from Windows Update or Microsoft website before installing SoftEther VPN. + SW_COMPONENTS_ABOUT_TAG 关于 %s SW_COMPONENTS_REQUIRE_ADMIN 安装需要管理员权限 diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_en.stb softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_en.stb --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_en.stb 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_en.stb 2019-07-23 21:37:12.000000000 +0000 @@ -158,11 +158,11 @@ ERR_92 A Virtual Layer 3 Switch with the specified name already exists. Specify a different name. ERR_93 Specified Virtual Layer 3 Switch not found. ERR_94 The specified name is invalid. Check if the name contains characters that cannot be used. -ERR_95 Failed to add the Virtual Layer 3 interface. -ERR_96 Failed to delete the Virtual Layer 3 interface. +ERR_95 Failed to add the Virtual Layer 3 interface. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. +ERR_96 Failed to delete the Virtual Layer 3 interface. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. ERR_97 The Virtual Layer 3 interface that is connecting to the destination Virtual Hub of the specified Virtual Layer 3 interface already exists in the Virtual Layer 3 Switch. No more than one Virtual Layer 3 interface that connects to the same Virtual Hub can be defined in a Virtual Layer 3 Switch. -ERR_98 Failed to add routing table entry. -ERR_99 Failed to delete routing table entry. +ERR_98 Failed to add routing table entry. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. +ERR_99 Failed to delete routing table entry. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. ERR_100 The specified routing table entry already exists. ERR_101 The client clock and the server clock are not synchronized with each other. Check the time settings. ERR_102 Unable to start this Virtual Layer 3 Switch. \r\n\r\nTo start the Virtual Layer 3 Switch, at least 1 virtual interface must be defined in the Virtual Layer 3 Switch. @@ -1788,7 +1788,9 @@ LS_LICENSE_NOT_VPNCLUSTER Connection "%S": License error occurred. The license registered on this VPN Server is of a type that prevents the use of the current clustering function and a VPN Client has attempted connection while operating in Cluster mode. You must restart the VPN Server. LS_LICENSE_VIOLATION Connection "%S": A license violation has occurred on the VPN Server and connections are not being received. LS_LICENSE_VIOLATION_DETECTED A license violation has been detected. A different VPN Server is operating with the same server ID "%I64u" as this VPN Server. It is possible that there are two or more VPN Servers in the cluster that are using the same license. Check the license information of each VPN Server. - +LS_API_AUTH_OK HTTPS API client "%r:%u" (%S): Administration mode: "%S": The embedded HTTPS web server accepted the successful login. Username: "%S", Method: "%S", Path: "%S" +LS_API_AUTH_ERROR HTTPS API client "%r:%u" (%S): The embedded HTTPS web server refused a login attempt. Username: "%S", Method: "%S", Path: "%S" +LS_API_RPC_CALL HTTPS API client "%r:%u" (%S): The client called a JSON-API. Method: "%S", Returned error code: %u (0 = success), Returned error message: "%s" # (OpenVPN Logs) LO_PREFIX_RAW OpenVPN Module: @@ -7154,6 +7156,8 @@ SW_UNINSTALLINFO_URL http://selinks.org/ SW_UNINSTALLINFO_PUBLISHER SoftEther VPN Project +SW_KB3033929_REQUIRED In Windows 7 and Windows Server 2008 R2, some SoftEther VPN functions require the Microsoft's Windows Update module KB3033929 installed.\r\n\r\nIf KB3033929 is not installed in your Windows, please install it from Windows Update or Microsoft website before installing SoftEther VPN. + SW_COMPONENTS_ABOUT_TAG About %s SW_COMPONENTS_REQUIRE_ADMIN Installation Requires Administrators Privileges diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_ja.stb softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_ja.stb --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_ja.stb 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_ja.stb 2019-07-23 21:37:12.000000000 +0000 @@ -160,11 +160,11 @@ ERR_92 指定された名前の仮想レイヤ 3 スイッチは既に存在します。別の名前を指定してください。 ERR_93 指定された名前の仮想レイヤ 3 スイッチが見つかりません。 ERR_94 指定された名前が不正です。使用できない文字が含まれていないかどうかチェックしてください。 -ERR_95 仮想レイヤ 3 インターフェイスの追加に失敗しました。 -ERR_96 仮想レイヤ 3 インターフェイスの削除に失敗しました。 +ERR_95 仮想レイヤ 3 インターフェイスの追加に失敗しました。パラメータが正しいかどうか確認してください。また、仮想レイヤ 3 スイッチが動作中の場合は、仮想レイヤ 3 インターフェイスの追加または削除はできません。仮想レイヤ 3 スイッチを停止してください。 +ERR_96 仮想レイヤ 3 インターフェイスの削除に失敗しました。パラメータが正しいかどうか確認してください。また、仮想レイヤ 3 スイッチが動作中の場合は、仮想レイヤ 3 インターフェイスの追加または削除はできません。仮想レイヤ 3 スイッチを停止してください。 ERR_97 指定された仮想レイヤ 3 インターフェイスの接続先仮想 HUB に接続している仮想レイヤ 3 インターフェイスが仮想レイヤ 3 スイッチの中に既に存在します。1 つの仮想レイヤ 3 スイッチの中では、同一の仮想 HUB に接続する仮想レイヤ 3 インターフェイスは 1 つしか定義できません。 -ERR_98 ルーティングテーブルの追加に失敗しました。 -ERR_99 ルーティングテーブルの削除に失敗しました。 +ERR_98 ルーティングテーブルの追加に失敗しました。パラメータが正しいかどうか確認してください。また、仮想レイヤ 3 スイッチが動作中の場合は、ルーティングテーブルの追加または削除はできません。仮想レイヤ 3 スイッチを停止してください。 +ERR_99 ルーティングテーブルの削除に失敗しました。パラメータが正しいかどうか確認してください。また、仮想レイヤ 3 スイッチが動作中の場合は、ルーティングテーブルの追加または削除はできません。仮想レイヤ 3 スイッチを停止してください。 ERR_100 指定されたルーティングテーブルはすでに存在します。 ERR_101 クライアントとサーバーの間の時計がずれています。時刻設定を確認してください。 ERR_102 この仮想レイヤ 3 スイッチを開始できません。\r\n\r\n仮想レイヤ 3 スイッチを開始するには、最低でも 1 つの仮想インターフェイスが仮想レイヤ 3 スイッチ内に定義されている必要があります。 @@ -1792,7 +1792,9 @@ LS_LICENSE_NOT_VPNCLUSTER コネクション "%S": ライセンスエラーが発生しました。この VPN Server には現在クラスタリング機能を使用できない種類のライセンスが登録されていますが、クラスタモードで動作中に VPN Client が接続しようとしました。VPN Server を再起動する必要があります。 LS_LICENSE_VIOLATION コネクション "%S": VPN Server でライセンス違反が発生しているため、接続を受け付けられません。 LS_LICENSE_VIOLATION_DETECTED ライセンス違反を検出しました。別の VPN Server が、この VPN Server と同じサーバー ID "%I64u" で動作しています。クラスタ内に同一のライセンスを使用した 2 台以上の VPN Server が存在する可能性があります。各 VPN Server のライセンス情報を確認してください。 - +LS_API_AUTH_OK HTTPS API クライアント "%r:%u" (%S): 管理モード: "%S" で組み込み HTTPS Web サーバーを用いてログインに成功しました。使用されたユーザー名: "%S", メソッド: "%S", パス: "%S" +LS_API_AUTH_ERROR HTTPS API クライアント "%r:%u" (%S): 組み込み HTTPS Web サーバーを用いてログインに失敗しました。使用されたユーザー名: "%S", メソッド: "%S", パス: "%S" +LS_API_RPC_CALL HTTPS API クライアント "%r:%u" (%S): JSON-API を呼び出しました。メソッド名: "%S", 結果エラーコード: %u (0 = 成功), 結果エラーメッセージ: "%s" # (OpenVPN ログ) LO_PREFIX_RAW OpenVPN モジュール: @@ -7156,6 +7158,8 @@ SW_UNINSTALLINFO_URL http://selinks.org/ SW_UNINSTALLINFO_PUBLISHER SoftEther VPN Project +SW_KB3033929_REQUIRED Windows 7 および Windows Server 2008 R2 では、SoftEther VPN の一部の機能を利用するためには、Microsoft 社の Windows Update プログラム KB3033929 がインストールされている必要があります。\r\n\r\nKB3033929 がインストールされていない場合は、SoftEther VPN をインストールする前に、Windows Update または Microsoft 社の Web サイトから KB3033929 をインストールをしてください。 + SW_COMPONENTS_ABOUT_TAG 「%s」とは SW_COMPONENTS_REQUIRE_ADMIN インストールには管理者権限が必要です diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_ko.stb softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_ko.stb --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_ko.stb 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_ko.stb 2019-07-23 21:37:12.000000000 +0000 @@ -164,11 +164,11 @@ ERR_92 지정된 이름의 가상 레이어 3 스위치는 이미 존재합니다. 다른 이름을 지정하십시오. ERR_93 지정된 이름의 가상 레이어 3 스위치가 없습니다. ERR_94 지정된 이름이 잘못되었습니다. 사용할 수없는 문자가 포함되어 있는지 확인하십시오. -ERR_95 가상 레이어 3 인터페이스의 추가에 실패했습니다. -ERR_96 가상 레이어 3 인터페이스의 삭제에 실패했습니다. +ERR_95 가상 레이어 3 인터페이스의 추가에 실패했습니다. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. +ERR_96 가상 레이어 3 인터페이스의 삭제에 실패했습니다. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. ERR_97 지정된 가상 레이어 3 인터페이스가 연결된 가상 HUB에 연결하는 가상 레이어 3 인터페이스가 가상 레이어 3 스위치에 이미 존재합니다. 하나의 가상 레이어 3 스위치에서 동일한 가상 HUB에 연결하는 가상 레이어 3 인터페이스는 하나 밖에 정의 할 수 없습니다. -ERR_98 라우팅 테이블 추가에 실패했습니다. -ERR_99 라우팅 테이블의 삭제에 실패했습니다. +ERR_98 라우팅 테이블 추가에 실패했습니다. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. +ERR_99 라우팅 테이블의 삭제에 실패했습니다. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. ERR_100 지정된 라우팅 테이블이 이미 존재합니다. ERR_101 클라이언트와 서버 사이의 시계가 어긋나 있습니다. 시간 설정을 확인하십시오. ERR_102 이 가상 레이어 3 스위치를 시작할 수 없습니다. \r\n\r\n 가상 레이어 3 스위치를 시작하려면 최소한 1 개의 가상 인터페이스가 가상 레이어 3 스위치에 정의되어 있어야합니다. @@ -1773,6 +1773,9 @@ LS_LICENSE_NOT_VPNCLUSTER 연결 "%S": 라이센스 오류가 발생했습니다. 이 VPN Server는 현재 클러스터링 기능을 사용할 수없는 종류의 라이센스가 등록되어 있지만 클러스터 모드로 실행 중에 VPN Client가 연결을 시도했습니다. VPN Server를 다시 시작해야합니다. LS_LICENSE_VIOLATION 연결 "%S": VPN Server에서 라이센스 위반이 발생하고 있기 때문에 연결을 받아 들일 수 없습니다. LS_LICENSE_VIOLATION_DETECTED 라이센스 위반을 감지했습니다. 다른 VPN Server가 이 VPN Server와 동일한 서버 ID "%I64u"으로 동작합니다. 클러스터에 동일한 라이센스를 사용하여 두 개 이상의 VPN Server가 있을 수 있습니다. 각 VPN Server의 라이센스 정보를 확인하십시오. +LS_API_AUTH_OK HTTPS API client "%r:%u" (%S): Administration mode: "%S": The embedded HTTPS web server accepted the successful login. Username: "%S", Method: "%S", Path: "%S" +LS_API_AUTH_ERROR HTTPS API client "%r:%u" (%S): The embedded HTTPS web server refused a login attempt. Username: "%S", Method: "%S", Path: "%S" +LS_API_RPC_CALL HTTPS API client "%r:%u" (%S): The client called a JSON-API. Method: "%S", Returned error code: %u (0 = success), Returned error message: "%s" # (OpenVPN 로그) @@ -7131,6 +7134,8 @@ SW_UNINSTALLINFO_URL http://selinks.org/ SW_UNINSTALLINFO_PUBLISHER SoftEther VPN Project +SW_KB3033929_REQUIRED In Windows 7 and Windows Server 2008 R2, some SoftEther VPN functions require the Microsoft's Windows Update module KB3033929 installed.\r\n\r\nIf KB3033929 is not installed in your Windows, please install it from Windows Update or Microsoft website before installing SoftEther VPN. + SW_COMPONENTS_ABOUT_TAG '%s'는 SW_COMPONENTS_REQUIRE_ADMIN 설치하려면 관리자 권한이 있어야합니다 diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_ru.stb softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_ru.stb --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_ru.stb 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_ru.stb 2019-07-23 21:37:12.000000000 +0000 @@ -158,11 +158,11 @@ ERR_92 A Virtual Layer 3 Switch with the specified name already exists. Specify a different name. ERR_93 Specified Virtual Layer 3 Switch not found. ERR_94 The specified name is invalid. Check if the name contains characters that cannot be used. -ERR_95 Failed to add the Virtual Layer 3 interface. -ERR_96 Failed to delete the Virtual Layer 3 interface. +ERR_95 Failed to add the Virtual Layer 3 interface. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. +ERR_96 Failed to delete the Virtual Layer 3 interface. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. ERR_97 The Virtual Layer 3 interface that is connecting to the destination Virtual Hub of the specified Virtual Layer 3 interface already exists in the Virtual Layer 3 Switch. No more than one Virtual Layer 3 interface that connects to the same Virtual Hub can be defined in a Virtual Layer 3 Switch. -ERR_98 Failed to add routing table entry. -ERR_99 Failed to delete routing table entry. +ERR_98 Failed to add routing table entry. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. +ERR_99 Failed to delete routing table entry. Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. ERR_100 The specified routing table entry already exists. ERR_101 The client clock and the server clock are not synchronized with each other. Check the time settings. ERR_102 Unable to start this Virtual Layer 3 Switch. \r\n\r\nTo start the Virtual Layer 3 Switch, at least 1 virtual interface must be defined in the Virtual Layer 3 Switch. @@ -1788,6 +1788,9 @@ LS_LICENSE_NOT_VPNCLUSTER Connection "%S": License error occurred. The license registered on this VPN Server is of a type that prevents the use of the current clustering function and a VPN Client has attempted connection while operating in Cluster mode. You must restart the VPN Server. LS_LICENSE_VIOLATION Connection "%S": A license violation has occurred on the VPN Server and connections are not being received. LS_LICENSE_VIOLATION_DETECTED A license violation has been detected. A different VPN Server is operating with the same server ID "%I64u" as this VPN Server. It is possible that there are two or more VPN Servers in the cluster that are using the same license. Check the license information of each VPN Server. +LS_API_AUTH_OK HTTPS API client "%r:%u" (%S): Administration mode: "%S": The embedded HTTPS web server accepted the successful login. Username: "%S", Method: "%S", Path: "%S" +LS_API_AUTH_ERROR HTTPS API client "%r:%u" (%S): The embedded HTTPS web server refused a login attempt. Username: "%S", Method: "%S", Path: "%S" +LS_API_RPC_CALL HTTPS API client "%r:%u" (%S): The client called a JSON-API. Method: "%S", Returned error code: %u (0 = success), Returned error message: "%s" # (OpenVPN Logs) @@ -7124,6 +7127,8 @@ SW_UNINSTALLINFO_URL http://selinks.org/ SW_UNINSTALLINFO_PUBLISHER SoftEther VPN Project +SW_KB3033929_REQUIRED In Windows 7 and Windows Server 2008 R2, some SoftEther VPN functions require the Microsoft's Windows Update module KB3033929 installed.\r\n\r\nIf KB3033929 is not installed in your Windows, please install it from Windows Update or Microsoft website before installing SoftEther VPN. + SW_COMPONENTS_ABOUT_TAG About %s SW_COMPONENTS_REQUIRE_ADMIN Installation Requires Administrators Privileges diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_tw.stb softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_tw.stb --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/strtable_tw.stb 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/strtable_tw.stb 2019-07-23 21:37:12.000000000 +0000 @@ -161,11 +161,11 @@ ERR_92 具有指定名稱的虛擬 3 層交換機已存在。指定一個不同的名稱。 ERR_93 找不到指定的虛擬 3 層交換機。 ERR_94 指定的名稱無效。檢查名稱是否有不能使用的字元 -ERR_95 無法添加虛擬 3 層介面。 -ERR_96 無法刪除虛擬 3 層介面。 +ERR_95 無法添加虛擬 3 層介面。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. +ERR_96 無法刪除虛擬 3 層介面。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting interfaces are unable when the Virtual Layer 3 switch is running. ERR_97 與指定虛擬 3 層交換介面的目標虛擬 HUB 連接的虛擬 3 層介面已在虛擬 3 層交換機中存在。不能在同一個虛擬 3 層交換機中定義超過一個連接到同一個虛擬 HUB 的虛擬 3 層介面。 -ERR_98 無法添加路由表項。 -ERR_99 無法刪除路由表項。 +ERR_98 無法添加路由表項。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. +ERR_99 無法刪除路由表項。Please check that the parameters are valid. Also please make sure that the Virtual Layer 3 switch is stopped. Adding or deleting routing table entries are unable when the Virtual Layer 3 switch is running. ERR_100 指定的路由表項已存在。 ERR_101 用戶端和伺服器的時鐘彼此不同步。檢查時間設置。 ERR_102 無法啟動此虛擬 3 層交換機。 要啟動虛擬 3 層交換機,必須在虛擬 3 層交換機定義至少一個虛擬介面。 @@ -1808,6 +1808,9 @@ LS_LICENSE_NOT_VPNCLUSTER 連接 "%S": 許可證錯誤。此 VPN Server 上註冊的許可證是禁止使用當前群集功能的類型,且一個 VPN Client 已嘗試在群集模式下連接。您必須重啟 VPN Server。 LS_LICENSE_VIOLATION 連接 "%S": VPN Server 發生違反許可證錯誤,不接受連接。 LS_LICENSE_VIOLATION_DETECTED 發現許可證違反錯誤,一個不同的 VPN Server 與此服務端具有相同的服務端ID "%I64u"。可能是在群集中有兩個或以上 VPN Server 正在使用相同的許可證。請檢查每一個 VPN Server 的許可證資訊。 +LS_API_AUTH_OK HTTPS API client "%r:%u" (%S): Administration mode: "%S": The embedded HTTPS web server accepted the successful login. Username: "%S", Method: "%S", Path: "%S" +LS_API_AUTH_ERROR HTTPS API client "%r:%u" (%S): The embedded HTTPS web server refused a login attempt. Username: "%S", Method: "%S", Path: "%S" +LS_API_RPC_CALL HTTPS API client "%r:%u" (%S): The client called a JSON-API. Method: "%S", Returned error code: %u (0 = success), Returned error message: "%s" # (OpenVPN Logs) @@ -7162,6 +7165,7 @@ SW_UNINSTALLINFO_URL http://selinks.org/ SW_UNINSTALLINFO_PUBLISHER SoftEther VPN Project +SW_KB3033929_REQUIRED In Windows 7 and Windows Server 2008 R2, some SoftEther VPN functions require the Microsoft's Windows Update module KB3033929 installed.\r\n\r\nIf KB3033929 is not installed in your Windows, please install it from Windows Update or Microsoft website before installing SoftEther VPN. SW_COMPONENTS_ABOUT_TAG 關於 %s SW_COMPONENTS_REQUIRE_ADMIN 安裝需要管理員許可權 diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/vpnserver_api_doc.html softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/vpnserver_api_doc.html --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/vpnserver_api_doc.html 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/vpnserver_api_doc.html 2019-07-23 21:37:12.000000000 +0000 @@ -0,0 +1,14648 @@ + + + + + SoftEther VPN Server JSON-RPC Suite Document + + + + + + +
+

SoftEther VPN Server JSON-RPC API Suite Document

+

This reference describes all JSON-RPC functions available on SoftEther VPN Server.

+

You can access to the latest SoftEther VPN Server JSON-RPC Document on GitHub.

+

What is SoftEther VPN Server JSON-RPC API Suite?

+

The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions).

+
    +
  • Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API.
  • +
  • You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.)
  • +
  • If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server.
  • +
  • No need to use any specific API client library since all APIs are provided on the JSON-RPC 2.0 Specification. You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment.
  • +
  • Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. The Node.js Client Library for VPN Server RPC (vpnrpc) package is also available.
  • +
+

Principle

+

Entry point

+

The entry point URL of JSON-RPC is:

+
https://<vpn_server_hostname>:<port>/api/
+
+
    +
  • Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.
  • +
  • If you want to completely disable the JSON-RPC on your VPN Server, set the DisableJsonRpcWebApi variable to true on the vpn_server.config.
  • +
+

JSON-RPC specification

+

You must use HTTPS 1.1 POST method to call each of JSON-RPC APIs.
+All APIs are based on the JSON-RPC 2.0 Specification.

+
    +
  • JSON-RPC Notification is not supported.
  • +
  • JSON-RPC Batch is not supported.
  • +
+

"vpnrpc": Node.js Client Library package for VPN Server JSON-RPC

+

If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the JavaScript Client Library for VPN Server RPC (vpnrpc).

+
    +
  • You can use the vpnrpc library in JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js.
  • +
  • As a sample code there is the sample.ts program in TypeScript. This sample calls all of available JSON-RPC APIs against the specified SoftEther VPN Server. (Note: This sample code is written in TypeScript.)
  • +
+

You can use the following command to download the vpnrpc library package with Node.js.

+
$ npm install --save-dev vpnrpc
+
+

"vpnrpc.ts": TypeScript Client Library for VPN Server JSON-RPC

+

If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the TypeScript Client Library for VPN Server RPC (vpnrpc.ts).

+
    +
  • You can use the vpnrpc.ts library in TypeScript / JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js.
  • +
  • As a sample code there is the sample.ts program in TypeScript. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server.
  • +
+

"vpnserver-jsonrpc-client-csharp": C# Client Library for VPN Server JSON-RPC

+

If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the vpnserver-jsonrpc-client-csharp C# library.

+
    +
  • The client library codes for C# is written in pure C# 7.3. It works on .NET Core 2.1 or later on Windows, Linux and macOS. Very comfort with Visual Studio for both Windows or macOS.
  • +
  • As a sample code there is the VpnServerRpcTest.cs program in C#. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server.
  • +
+

HTTPS Authentication

+

You must specify the following HTTPS custom headers for authentication on each of requests.

+ + + + + + + + + + + + + + + + + +
ValueDescription
X-VPNADMIN-HUBNAMEThe name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify empty string if you want to connect to the VPN Server as the Entire VPN Server Admin Mode.
X-VPNADMIN-PASSWORDSpecify the administration password.
+
    +
  • You can omit the above HTTPS custom authentication headers if you are calling JSON-RPC APIs from the web browser which is already logged in to the VPN Server with HTTPS Basic Authentication. In such usage the credential of HTTPS Basic Authtication will be used.
  • +
+
+

Table of contents

+ +
+

+

"Test" RPC API - Test RPC function

+

Description

+

Test RPC function. Input any integer value to the IntValue_u32 field. Then the server will convert the integer to the string, and return the string in the StrValue_str field.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "Test",
+  "params": {
+    "IntValue_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"GetServerInfo" RPC API - Get server information

+

Description

+

Get server information. This allows you to obtain the server information of the currently connected VPN Server or VPN Bridge. Included in the server information are the version number, build number and build information. You can also obtain information on the current server operation mode and the information of operating system that the server is operating on.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetServerInfo",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerProductName_str": "serverproductname",
+    "ServerVersionString_str": "serverversionstring",
+    "ServerBuildInfoString_str": "serverbuildinfostring",
+    "ServerVerInt_u32": 0,
+    "ServerBuildInt_u32": 0,
+    "ServerHostName_str": "serverhostname",
+    "ServerType_u32": 0,
+    "ServerBuildDate_dt": "2020-08-01T12:24:36.123",
+    "ServerFamilyName_str": "serverfamilyname",
+    "OsType_u32": 0,
+    "OsServicePack_u32": 0,
+    "OsSystemName_str": "ossystemname",
+    "OsProductName_str": "osproductname",
+    "OsVendorName_str": "osvendorname",
+    "OsVersion_str": "osversion",
+    "KernelName_str": "kernelname",
+    "KernelVersion_str": "kernelversion"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerProductName_strstring (ASCII)Server product name
ServerVersionString_strstring (ASCII)Server version string
ServerBuildInfoString_strstring (ASCII)Server build information string
ServerVerInt_u32number (uint32)Server version integer value
ServerBuildInt_u32number (uint32)Server build number integer value
ServerHostName_strstring (ASCII)Server host name
ServerType_u32number (enum)Type of server
Values:
0: Stand-alone server
1: Farm controller server
2: Farm member server
ServerBuildDate_dtDateBuild date and time of the server
ServerFamilyName_strstring (ASCII)Family name
OsType_u32number (enum)OS type
Values:
1100: Windows 95
1200: Windows 98
1300: Windows Me
1400: Windows (unknown)
2100: Windows NT 4.0 Workstation
2110: Windows NT 4.0 Server
2111: Windows NT 4.0 Server, Enterprise Edition
2112: Windows NT 4.0 Terminal Server
2113: BackOffice Server 4.5
2114: Small Business Server 4.5
2200: Windows 2000 Professional
2211: Windows 2000 Server
2212: Windows 2000 Advanced Server
2213: Windows 2000 Datacenter Server
2214: BackOffice Server 2000
2215: Small Business Server 2000
2300: Windows XP Home Edition
2301: Windows XP Professional
2410: Windows Server 2003 Web Edition
2411: Windows Server 2003 Standard Edition
2412: Windows Server 2003 Enterprise Edition
2413: Windows Server 2003 DataCenter Edition
2414: BackOffice Server 2003
2415: Small Business Server 2003
2500: Windows Vista
2510: Windows Server 2008
2600: Windows 7
2610: Windows Server 2008 R2
2700: Windows 8
2710: Windows Server 2012
2701: Windows 8.1
2711: Windows Server 2012 R2
2702: Windows 10
2712: Windows Server 10
2800: Windows 11 or later
2810: Windows Server 11 or later
3000: Unknown UNIX
3100: Linux
3200: Solaris
3300: Cygwin
3400: BSD
3500: MacOS X
OsServicePack_u32number (uint32)Service pack number
OsSystemName_strstring (ASCII)OS system name
OsProductName_strstring (ASCII)OS product name
OsVendorName_strstring (ASCII)OS vendor name
OsVersion_strstring (ASCII)OS version
KernelName_strstring (ASCII)Kernel name
KernelVersion_strstring (ASCII)Kernel version
+
+

+

"GetServerStatus" RPC API - Get Current Server Status

+

Description

+

Get Current Server Status. This allows you to obtain in real-time the current status of the currently connected VPN Server or VPN Bridge. You can get statistical information on data communication and the number of different kinds of objects that exist on the server. You can get information on how much memory is being used on the current computer by the OS.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetServerStatus",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerType_u32": 0,
+    "NumTcpConnections_u32": 0,
+    "NumTcpConnectionsLocal_u32": 0,
+    "NumTcpConnectionsRemote_u32": 0,
+    "NumHubTotal_u32": 0,
+    "NumHubStandalone_u32": 0,
+    "NumHubStatic_u32": 0,
+    "NumHubDynamic_u32": 0,
+    "NumSessionsTotal_u32": 0,
+    "NumSessionsLocal_u32": 0,
+    "NumSessionsRemote_u32": 0,
+    "NumMacTables_u32": 0,
+    "NumIpTables_u32": 0,
+    "NumUsers_u32": 0,
+    "NumGroups_u32": 0,
+    "AssignedBridgeLicenses_u32": 0,
+    "AssignedClientLicenses_u32": 0,
+    "AssignedBridgeLicensesTotal_u32": 0,
+    "AssignedClientLicensesTotal_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "CurrentTime_dt": "2020-08-01T12:24:36.123",
+    "CurrentTick_u64": 0,
+    "StartTime_dt": "2020-08-01T12:24:36.123",
+    "TotalMemory_u64": 0,
+    "UsedMemory_u64": 0,
+    "FreeMemory_u64": 0,
+    "TotalPhys_u64": 0,
+    "UsedPhys_u64": 0,
+    "FreePhys_u64": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerType_u32number (enum)Type of server
Values:
0: Stand-alone server
1: Farm controller server
2: Farm member server
NumTcpConnections_u32number (uint32)Total number of TCP connections
NumTcpConnectionsLocal_u32number (uint32)Number of Local TCP connections
NumTcpConnectionsRemote_u32number (uint32)Number of remote TCP connections
NumHubTotal_u32number (uint32)Total number of HUBs
NumHubStandalone_u32number (uint32)Nymber of stand-alone HUB
NumHubStatic_u32number (uint32)Number of static HUBs
NumHubDynamic_u32number (uint32)Number of Dynamic HUBs
NumSessionsTotal_u32number (uint32)Total number of sessions
NumSessionsLocal_u32number (uint32)Number of local VPN sessions
NumSessionsRemote_u32number (uint32)The number of remote sessions
NumMacTables_u32number (uint32)Number of MAC table entries (total sum of all Virtual Hubs)
NumIpTables_u32number (uint32)Number of IP table entries (total sum of all Virtual Hubs)
NumUsers_u32number (uint32)Number of users (total sum of all Virtual Hubs)
NumGroups_u32number (uint32)Number of groups (total sum of all Virtual Hubs)
AssignedBridgeLicenses_u32number (uint32)Number of assigned bridge licenses (Useful to make a commercial version)
AssignedClientLicenses_u32number (uint32)Number of assigned client licenses (Useful to make a commercial version)
AssignedBridgeLicensesTotal_u32number (uint32)Number of Assigned bridge license (cluster-wide), useful to make a commercial version
AssignedClientLicensesTotal_u32number (uint32)Number of assigned client licenses (cluster-wide), useful to make a commercial version
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
CurrentTime_dtDateCurrent time
CurrentTick_u64number (uint64)64 bit High-Precision Logical System Clock
StartTime_dtDateVPN Server Start-up time
TotalMemory_u64number (uint64)Memory information: Total Memory
UsedMemory_u64number (uint64)Memory information: Used Memory
FreeMemory_u64number (uint64)Memory information: Free Memory
TotalPhys_u64number (uint64)Memory information: Total Phys
UsedPhys_u64number (uint64)Memory information: Used Phys
FreePhys_u64number (uint64)Memory information: Free Phys
+
+

+

"CreateListener" RPC API - Create New TCP Listener

+

Description

+

Create New TCP Listener. This allows you to create a new TCP Listener on the server. By creating the TCP Listener the server starts listening for a connection from clients at the specified TCP/IP port number. A TCP Listener that has been created can be deleted by the DeleteListener API. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To execute this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateListener",
+  "params": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Port_u32number (uint32)Port number (Range: 1 - 65535)
Enable_boolbooleanActive state
+
+

+

"EnumListener" RPC API - Get List of TCP Listeners

+

Description

+

Get List of TCP Listeners. This allows you to get a list of TCP listeners registered on the current server. You can obtain information on whether the various TCP listeners have a status of operating or error. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumListener",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ListenerList": [
+      {
+        "Ports_u32": 0,
+        "Enables_bool": false,
+        "Errors_bool": false
+      },
+      {
+        "Ports_u32": 0,
+        "Enables_bool": false,
+        "Errors_bool": false
+      },
+      {
+        "Ports_u32": 0,
+        "Enables_bool": false,
+        "Errors_bool": false
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ListenerListArray objectList of listener items
Ports_u32number (uint32)TCP port number (range: 1 - 65535)
Enables_boolbooleanActive state
Errors_boolbooleanThe flag to indicate if the error occurred on the listener port
+
+

+

"DeleteListener" RPC API - Delete TCP Listener

+

Description

+

Delete TCP Listener. This allows you to delete a TCP Listener that's registered on the server. When the TCP Listener is in a state of operation, the listener will automatically be deleted when its operation stops. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteListener",
+  "params": {
+    "Port_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Port_u32number (uint32)Port number (Range: 1 - 65535)
Enable_boolbooleanActive state
+
+

+

"EnableListener" RPC API - Enable / Disable TCP Listener

+

Description

+

Enable / Disable TCP Listener. This starts or stops the operation of TCP Listeners registered on the current server. You can also get a list of TCP Listeners currently registered by using the EnumListener API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnableListener",
+  "params": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Port_u32": 0,
+    "Enable_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Port_u32number (uint32)Port number (Range: 1 - 65535)
Enable_boolbooleanActive state
+
+

+

"SetServerPassword" RPC API - Set VPN Server Administrator Password

+

Description

+

Set VPN Server Administrator Password. This sets the VPN Server administrator password. You can specify the password as a parameter. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetServerPassword",
+  "params": {
+    "PlainTextPassword_str": "plaintextpassword"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "PlainTextPassword_str": "plaintextpassword"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
PlainTextPassword_strstring (ASCII)The plaintext password
+
+

+

"SetFarmSetting" RPC API - Set the VPN Server clustering configuration

+

Description

+

Set the VPN Server clustering configuration. Use this to set the VPN Server type as Standalone Server, Cluster Controller Server or Cluster Member Server. Standalone server means a VPN Server that does not belong to any cluster in its current state. When VPN Server is installed, by default it will be in standalone server mode. Unless you have particular plans to configure a cluster, we recommend the VPN Server be operated in standalone mode. A cluster controller is the central computer of all member servers of a cluster in the case where a clustering environment is made up of multiple VPN Servers. Multiple cluster members can be added to the cluster as required. A cluster requires one computer to serve this role. The other cluster member servers that are configured in the same cluster begin operation as a cluster member by connecting to the cluster controller. To call this API, you must have VPN Server administrator privileges. Also, when this API is executed, VPN Server will automatically restart. This API cannot be called on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetFarmSetting",
+  "params": {
+    "ServerType_u32": 0,
+    "NumPort_u32": 0,
+    "Ports_u32": [
+      1,
+      2,
+      3
+    ],
+    "PublicIp_ip": "192.168.0.1",
+    "ControllerName_str": "controllername",
+    "ControllerPort_u32": 0,
+    "MemberPasswordPlaintext_str": "memberpasswordplaintext",
+    "Weight_u32": 0,
+    "ControllerOnly_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerType_u32": 0,
+    "NumPort_u32": 0,
+    "Ports_u32": [
+      1,
+      2,
+      3
+    ],
+    "PublicIp_ip": "192.168.0.1",
+    "ControllerName_str": "controllername",
+    "ControllerPort_u32": 0,
+    "MemberPasswordPlaintext_str": "memberpasswordplaintext",
+    "Weight_u32": 0,
+    "ControllerOnly_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerType_u32number (enum)Type of server
Values:
0: Stand-alone server
1: Farm controller server
2: Farm member server
NumPort_u32number (uint32)Valid only for Cluster Member servers. Number of the Ports_u32 element.
Ports_u32number[] (uint32)Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers.
PublicIp_ipstring (IP address)Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used.
ControllerName_strstring (ASCII)Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller.
ControllerPort_u32number (uint32)Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller.
MemberPasswordPlaintext_strstring (ASCII)Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller.
Weight_u32number (uint32)This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used.
ControllerOnly_boolbooleanValid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments.
+
+

+

"GetFarmSetting" RPC API - Get Clustering Configuration of Current VPN Server

+

Description

+

Get Clustering Configuration of Current VPN Server. You can use this to acquire the clustering configuration of the current VPN Server. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetFarmSetting",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerType_u32": 0,
+    "NumPort_u32": 0,
+    "Ports_u32": [
+      1,
+      2,
+      3
+    ],
+    "PublicIp_ip": "192.168.0.1",
+    "ControllerName_str": "controllername",
+    "ControllerPort_u32": 0,
+    "MemberPasswordPlaintext_str": "memberpasswordplaintext",
+    "Weight_u32": 0,
+    "ControllerOnly_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerType_u32number (enum)Type of server
Values:
0: Stand-alone server
1: Farm controller server
2: Farm member server
NumPort_u32number (uint32)Valid only for Cluster Member servers. Number of the Ports_u32 element.
Ports_u32number[] (uint32)Valid only for Cluster Member servers. Specify the list of public port numbers on this server. The list must have at least one public port number set, and it is also possible to set multiple public port numbers.
PublicIp_ipstring (IP address)Valid only for Cluster Member servers. Specify the public IP address of this server. If you wish to leave public IP address unspecified, specify the empty string. When a public IP address is not specified, the IP address of the network interface used when connecting to the cluster controller will be automatically used.
ControllerName_strstring (ASCII)Valid only for Cluster Member servers. Specify the host name or IP address of the destination cluster controller.
ControllerPort_u32number (uint32)Valid only for Cluster Member servers. Specify the TCP port number of the destination cluster controller.
MemberPasswordPlaintext_strstring (ASCII)Valid only for Cluster Member servers. Specify the password required to connect to the destination controller. It needs to be the same as an administrator password on the destination controller.
Weight_u32number (uint32)This sets a value for the performance standard ratio of this VPN Server. This is the standard value for when load balancing is performed in the cluster. For example, making only one machine 200 while the other members have a status of 100, will regulate that machine to receive twice as many connections as the other members. Specify 1 or higher for the value. If this parameter is left unspecified, 100 will be used.
ControllerOnly_boolbooleanValid only for Cluster Controller server. By specifying true, the VPN Server will operate only as a controller on the cluster and it will always distribute general VPN Client connections to members other than itself. This function is used in high-load environments.
+
+

+

"GetFarmInfo" RPC API - Get Cluster Member Information

+

Description

+

Get Cluster Member Information. When the VPN Server is operating as a cluster controller, you can get information on cluster member servers on that cluster by specifying the IDs of the member servers. You can get the following information about the specified cluster member server: Server Type, Time Connection has been Established, IP Address, Host Name, Points, Public Port List, Number of Operating Virtual Hubs, First Virtual Hub, Number of Sessions and Number of TCP Connections. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetFarmInfo",
+  "params": {
+    "Id_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Id_u32": 0,
+    "Controller_bool": false,
+    "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+    "Ip_ip": "192.168.0.1",
+    "Hostname_str": "hostname",
+    "Point_u32": 0,
+    "NumPort_u32": 0,
+    "Ports_u32": [
+      1,
+      2,
+      3
+    ],
+    "ServerCert_bin": "SGVsbG8gV29ybGQ=",
+    "NumFarmHub_u32": 0,
+    "HubsList": [
+      {
+        "HubName_str": "hubname",
+        "DynamicHub_bool": false
+      },
+      {
+        "HubName_str": "hubname",
+        "DynamicHub_bool": false
+      },
+      {
+        "HubName_str": "hubname",
+        "DynamicHub_bool": false
+      }
+    ],
+    "NumSessions_u32": 0,
+    "NumTcpConnections_u32": 0,
+    "Weight_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Id_u32number (uint32)ID
Controller_boolbooleanThe flag if the server is Cluster Controller (false: Cluster Member servers)
ConnectedTime_dtDateConnection Established Time
Ip_ipstring (IP address)IP address
Hostname_strstring (ASCII)Host name
Point_u32number (uint32)Point
NumPort_u32number (uint32)Number of Public Ports
Ports_u32number[] (uint32)Public Ports
ServerCert_binstring (Base64 binary)Server certificate
NumFarmHub_u32number (uint32)Number of farm HUB
HubsListArray objectThe hosted Virtual Hub list
NumSessions_u32number (uint32)Number of hosted VPN sessions
NumTcpConnections_u32number (uint32)Number of TCP connections
Weight_u32number (uint32)Performance Standard Ratio
HubName_strstring (ASCII)The Virtual Hub name
DynamicHub_boolbooleanDynamic HUB
+
+

+

"EnumFarmMember" RPC API - Get List of Cluster Members

+

Description

+

Get List of Cluster Members. Use this API when the VPN Server is operating as a cluster controller to get a list of the cluster member servers on the same cluster, including the cluster controller itself. For each member, the following information is also listed: Type, Connection Start, Host Name, Points, Number of Session, Number of TCP Connections, Number of Operating Virtual Hubs, Using Client Connection License and Using Bridge Connection License. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumFarmMember",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "NumFarm_u32": 0,
+    "FarmMemberList": [
+      {
+        "Id_u32": 0,
+        "Controller_bool": false,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Ip_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "Point_u32": 0,
+        "NumSessions_u32": 0,
+        "NumTcpConnections_u32": 0,
+        "NumHubs_u32": 0,
+        "AssignedClientLicense_u32": 0,
+        "AssignedBridgeLicense_u32": 0
+      },
+      {
+        "Id_u32": 0,
+        "Controller_bool": false,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Ip_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "Point_u32": 0,
+        "NumSessions_u32": 0,
+        "NumTcpConnections_u32": 0,
+        "NumHubs_u32": 0,
+        "AssignedClientLicense_u32": 0,
+        "AssignedBridgeLicense_u32": 0
+      },
+      {
+        "Id_u32": 0,
+        "Controller_bool": false,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Ip_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "Point_u32": 0,
+        "NumSessions_u32": 0,
+        "NumTcpConnections_u32": 0,
+        "NumHubs_u32": 0,
+        "AssignedClientLicense_u32": 0,
+        "AssignedBridgeLicense_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
NumFarm_u32number (uint32)Number of Cluster Members
FarmMemberListArray objectCluster Members list
Id_u32number (uint32)ID
Controller_boolbooleanController
ConnectedTime_dtDateConnection time
Ip_ipstring (IP address)IP address
Hostname_strstring (ASCII)Host name
Point_u32number (uint32)Point
NumSessions_u32number (uint32)Number of sessions
NumTcpConnections_u32number (uint32)Number of TCP connections
NumHubs_u32number (uint32)Number of HUBs
AssignedClientLicense_u32number (uint32)Number of assigned client licenses
AssignedBridgeLicense_u32number (uint32)Number of assigned bridge licenses
+
+

+

"GetFarmConnectionStatus" RPC API - Get Connection Status to Cluster Controller

+

Description

+

Get Connection Status to Cluster Controller. Use this API when the VPN Server is operating as a cluster controller to get the status of connection to the cluster controller. You can get the following information: Controller IP Address, Port Number, Connection Status, Connection Start Time, First Connection Established Time, Current Connection Established Time, Number of Connection Attempts, Number of Successful Connections, Number of Failed Connections. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetFarmConnectionStatus",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Ip_ip": "192.168.0.1",
+    "Port_u32": 0,
+    "Online_bool": false,
+    "LastError_u32": 0,
+    "StartedTime_dt": "2020-08-01T12:24:36.123",
+    "FirstConnectedTime_dt": "2020-08-01T12:24:36.123",
+    "CurrentConnectedTime_dt": "2020-08-01T12:24:36.123",
+    "NumTry_u32": 0,
+    "NumConnected_u32": 0,
+    "NumFailed_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Ip_ipstring (IP address)IP address
Port_u32number (uint32)Port number
Online_boolbooleanOnline state
LastError_u32number (uint32)Last error code
StartedTime_dtDateConnection start time
FirstConnectedTime_dtDateFirst connection time
CurrentConnectedTime_dtDateConnection time of this time
NumTry_u32number (uint32)Number of retries
NumConnected_u32number (uint32)Number of connection count
NumFailed_u32number (uint32)Connection failure count
+
+

+

"SetServerCert" RPC API - Set SSL Certificate and Private Key of VPN Server

+

Description

+

Set SSL Certificate and Private Key of VPN Server. You can set the SSL certificate that the VPN Server provides to the connected client and the private key for that certificate. The certificate must be in X.509 format and the private key must be Base 64 encoded format. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetServerCert",
+  "params": {
+    "Cert_bin": "SGVsbG8gV29ybGQ=",
+    "Key_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Cert_bin": "SGVsbG8gV29ybGQ=",
+    "Key_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Cert_binstring (Base64 binary)The body of the certificate
Key_binstring (Base64 binary)The body of the private key
+
+

+

"GetServerCert" RPC API - Get SSL Certificate and Private Key of VPN Server

+

Description

+

Get SSL Certificate and Private Key of VPN Server. Use this to get the SSL certificate private key that the VPN Server provides to the connected client. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetServerCert",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Cert_bin": "SGVsbG8gV29ybGQ=",
+    "Key_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Cert_binstring (Base64 binary)The body of the certificate
Key_binstring (Base64 binary)The body of the private key
+
+

+

"GetServerCipher" RPC API - Get the Encrypted Algorithm Used for VPN Communication

+

Description

+

Get the Encrypted Algorithm Used for VPN Communication. Use this API to get the current setting of the algorithm used for the electronic signature and encrypted for SSL connection to be used for communication between the VPN Server and the connected client and the list of algorithms that can be used on the VPN Server.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetServerCipher",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "String_str": "string"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
String_strstring (ASCII)A string value
+
+

+

"SetServerCipher" RPC API - Set the Encrypted Algorithm Used for VPN Communication

+

Description

+

Set the Encrypted Algorithm Used for VPN Communication. Use this API to set the algorithm used for the electronic signature and encrypted for SSL connections to be used for communication between the VPN Server and the connected client. By specifying the algorithm name, the specified algorithm will be used later between the VPN Client and VPN Bridge connected to this server and the data will be encrypted. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetServerCipher",
+  "params": {
+    "String_str": "string"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "String_str": "string"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
String_strstring (ASCII)A string value
+
+

+

"CreateHub" RPC API - Create New Virtual Hub

+

Description

+

Create New Virtual Hub. Use this to create a new Virtual Hub on the VPN Server. The created Virtual Hub will begin operation immediately. When the VPN Server is operating on a cluster, this API is only valid for the cluster controller. Also, the new Virtual Hub will operate as a dynamic Virtual Hub. You can change it to a static Virtual Hub by using the SetHub API. To get a list of Virtual Hubs that are already on the VPN Server, use the EnumHub API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateHub",
+  "params": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Specify the name of the Virtual Hub to create / update.
AdminPasswordPlainText_strstring (ASCII)Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.
Online_boolbooleanOnline flag
MaxSession_u32number (uint32)Maximum number of VPN sessions
NoEnum_boolbooleanNo Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.
HubType_u32number (enum)Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
+
+

+

"SetHub" RPC API - Set the Virtual Hub configuration

+

Description

+

Set the Virtual Hub configuration. You can call this API to change the configuration of the specified Virtual Hub. You can set the Virtual Hub online or offline. You can set the maximum number of sessions that can be concurrently connected to the Virtual Hub that is currently being managed. You can set the Virtual Hub administrator password. You can set other parameters for the Virtual Hub. Before call this API, you need to obtain the latest state of the Virtual Hub by using the GetHub API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHub",
+  "params": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Specify the name of the Virtual Hub to create / update.
AdminPasswordPlainText_strstring (ASCII)Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.
Online_boolbooleanOnline flag
MaxSession_u32number (uint32)Maximum number of VPN sessions
NoEnum_boolbooleanNo Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.
HubType_u32number (enum)Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
+
+

+

"GetHub" RPC API - Get the Virtual Hub configuration

+

Description

+

Get the Virtual Hub configuration. You can call this API to get the current configuration of the specified Virtual Hub. To change the configuration of the Virtual Hub, call the SetHub API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHub",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminPasswordPlainText_str": "adminpasswordplaintext",
+    "Online_bool": false,
+    "MaxSession_u32": 0,
+    "NoEnum_bool": false,
+    "HubType_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Specify the name of the Virtual Hub to create / update.
AdminPasswordPlainText_strstring (ASCII)Specify an administrator password when the administrator password is going to be set for the Virtual Hub. On the update, leave it to empty string if you don't want to change the password.
Online_boolbooleanOnline flag
MaxSession_u32number (uint32)Maximum number of VPN sessions
NoEnum_boolbooleanNo Enum flag. By enabling this option, the VPN Client user will be unable to enumerate this Virtual Hub even if they send a Virtual Hub enumeration request to the VPN Server.
HubType_u32number (enum)Type of the Virtual Hub (Valid only for Clustered VPN Servers)
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
+
+

+

"EnumHub" RPC API - Get List of Virtual Hubs

+

Description

+

Get List of Virtual Hubs. Use this to get a list of existing Virtual Hubs on the VPN Server. For each Virtual Hub, you can get the following information: Virtual Hub Name, Status, Type, Number of Users, Number of Groups, Number of Sessions, Number of MAC Tables, Number of IP Tables, Number of Logins, Last Login, and Last Communication. Note that when connecting in Virtual Hub Admin Mode, if in the options of a Virtual Hub that you do not have administrator privileges for, the option Don't Enumerate this Virtual Hub for Anonymous Users is enabled then that Virtual Hub will not be enumerated. If you are connected in Server Admin Mode, then the list of all Virtual Hubs will be displayed. When connecting to and managing a non-cluster-controller cluster member of a clustering environment, only the Virtual Hub currently being hosted by that VPN Server will be displayed. When connecting to a cluster controller for administration purposes, all the Virtual Hubs will be displayed.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumHub",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "NumHub_u32": 0,
+    "HubList": [
+      {
+        "HubName_str": "hubname",
+        "Online_bool": false,
+        "HubType_u32": 0,
+        "NumUsers_u32": 0,
+        "NumGroups_u32": 0,
+        "NumSessions_u32": 0,
+        "NumMacTables_u32": 0,
+        "NumIpTables_u32": 0,
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "NumLogin_u32": 0,
+        "IsTrafficFilled_bool": false,
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      },
+      {
+        "HubName_str": "hubname",
+        "Online_bool": false,
+        "HubType_u32": 0,
+        "NumUsers_u32": 0,
+        "NumGroups_u32": 0,
+        "NumSessions_u32": 0,
+        "NumMacTables_u32": 0,
+        "NumIpTables_u32": 0,
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "NumLogin_u32": 0,
+        "IsTrafficFilled_bool": false,
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      },
+      {
+        "HubName_str": "hubname",
+        "Online_bool": false,
+        "HubType_u32": 0,
+        "NumUsers_u32": 0,
+        "NumGroups_u32": 0,
+        "NumSessions_u32": 0,
+        "NumMacTables_u32": 0,
+        "NumIpTables_u32": 0,
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "NumLogin_u32": 0,
+        "IsTrafficFilled_bool": false,
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
NumHub_u32number (uint32)Number of Virtual Hubs
HubListArray objectVirtual Hubs
HubName_strstring (ASCII)The name of the Virtual Hub
Online_boolbooleanOnline state
HubType_u32number (enum)Type of HUB (Valid only for Clustered VPN Servers)
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
NumUsers_u32number (uint32)Number of users
NumGroups_u32number (uint32)Number of registered groups
NumSessions_u32number (uint32)Number of registered sessions
NumMacTables_u32number (uint32)Number of current MAC table entries
NumIpTables_u32number (uint32)Number of current IP table entries
LastCommTime_dtDateLast communication date and time
LastLoginTime_dtDateLast login date and time
CreatedTime_dtDateCreation date and time
NumLogin_u32number (uint32)Number of accumulated logins
IsTrafficFilled_boolbooleanWhether the traffic information is provided
Ex.Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Ex.Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Ex.Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Ex.Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Ex.Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Ex.Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Ex.Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Ex.Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
+
+

+

"DeleteHub" RPC API - Delete Virtual Hub

+

Description

+

Delete Virtual Hub. Use this to delete an existing Virtual Hub on the VPN Server. If you delete the Virtual Hub, all sessions that are currently connected to the Virtual Hub will be disconnected and new sessions will be unable to connect to the Virtual Hub. Also, this will also delete all the Hub settings, user objects, group objects, certificates and Cascade Connections. Once you delete the Virtual Hub, it cannot be recovered. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Servers that are operating as a VPN Bridge or cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteHub",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
+
+

+

"GetHubRadius" RPC API - Get Setting of RADIUS Server Used for User Authentication

+

Description

+

Get Setting of RADIUS Server Used for User Authentication. Use this to get the current settings for the RADIUS server used when a user connects to the currently managed Virtual Hub using RADIUS Server Authentication Mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubRadius",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "RadiusServerName_str": "radiusservername",
+    "RadiusPort_u32": 0,
+    "RadiusSecret_str": "radiussecret",
+    "RadiusRetryInterval_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
RadiusServerName_strstring (ASCII)RADIUS server name
RadiusPort_u32number (uint32)RADIUS port number
RadiusSecret_strstring (ASCII)Secret key
RadiusRetryInterval_u32number (uint32)Radius retry interval
+
+

+

"SetHubRadius" RPC API - Set RADIUS Server to use for User Authentication

+

Description

+

Set RADIUS Server to use for User Authentication. To accept users to the currently managed Virtual Hub in RADIUS server authentication mode, you can specify an external RADIUS server that confirms the user name and password. (You can specify multiple hostname by splitting with comma or semicolon.) The RADIUS server must be set to receive requests from IP addresses of this VPN Server. Also, authentication by Password Authentication Protocol (PAP) must be enabled. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubRadius",
+  "params": {
+    "HubName_str": "hubname",
+    "RadiusServerName_str": "radiusservername",
+    "RadiusPort_u32": 0,
+    "RadiusSecret_str": "radiussecret",
+    "RadiusRetryInterval_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "RadiusServerName_str": "radiusservername",
+    "RadiusPort_u32": 0,
+    "RadiusSecret_str": "radiussecret",
+    "RadiusRetryInterval_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
RadiusServerName_strstring (ASCII)RADIUS server name
RadiusPort_u32number (uint32)RADIUS port number
RadiusSecret_strstring (ASCII)Secret key
RadiusRetryInterval_u32number (uint32)Radius retry interval
+
+

+

"EnumConnection" RPC API - Get List of TCP Connections Connecting to the VPN Server

+

Description

+

Get List of TCP Connections Connecting to the VPN Server. Use this to get a list of TCP/IP connections that are currently connecting to the VPN Server. It does not display the TCP connections that have been established as VPN sessions. To get the list of TCP/IP connections that have been established as VPN sessions, you can use the EnumSession API. You can get the following: Connection Name, Connection Source, Connection Start and Type. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumConnection",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "NumConnection_u32": 0,
+    "ConnectionList": [
+      {
+        "Name_str": "name",
+        "Hostname_str": "hostname",
+        "Ip_ip": "192.168.0.1",
+        "Port_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Type_u32": 0
+      },
+      {
+        "Name_str": "name",
+        "Hostname_str": "hostname",
+        "Ip_ip": "192.168.0.1",
+        "Port_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Type_u32": 0
+      },
+      {
+        "Name_str": "name",
+        "Hostname_str": "hostname",
+        "Ip_ip": "192.168.0.1",
+        "Port_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Type_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
NumConnection_u32number (uint32)Number of connections
ConnectionListArray objectConnection list
Name_strstring (ASCII)Connection name
Hostname_strstring (ASCII)Host name
Ip_ipstring (IP address)IP address
Port_u32number (uint32)Port number
ConnectedTime_dtDateConnected time
Type_u32number (enum)Connection type
Values:
0: VPN Client
1: During initialization
2: Login connection
3: Additional connection
4: RPC for server farm
5: RPC for Management
6: HUB enumeration
7: Password change
8: SSTP
9: OpenVPN
+
+

+

"DisconnectConnection" RPC API - Disconnect TCP Connections Connecting to the VPN Server

+

Description

+

Disconnect TCP Connections Connecting to the VPN Server. Use this to forcefully disconnect specific TCP/IP connections that are connecting to the VPN Server. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DisconnectConnection",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Connection name
+
+

+

"GetConnectionInfo" RPC API - Get Information of TCP Connections Connecting to the VPN Server

+

Description

+

Get Information of TCP Connections Connecting to the VPN Server. Use this to get detailed information of a specific TCP/IP connection that is connecting to the VPN Server. You can get the following information: Connection Name, Connection Type, Source Hostname, Source IP Address, Source Port Number (TCP), Connection Start, Server Product Name, Server Version, Server Build Number, Client Product Name, Client Version, and Client Build Number. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetConnectionInfo",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "Type_u32": 0,
+    "Hostname_str": "hostname",
+    "Ip_ip": "192.168.0.1",
+    "Port_u32": 0,
+    "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+    "ServerStr_str": "serverstr",
+    "ServerVer_u32": 0,
+    "ServerBuild_u32": 0,
+    "ClientStr_str": "clientstr",
+    "ClientVer_u32": 0,
+    "ClientBuild_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Connection name
Type_u32number (enum)Type
Values:
0: VPN Client
1: During initialization
2: Login connection
3: Additional connection
4: RPC for server farm
5: RPC for Management
6: HUB enumeration
7: Password change
8: SSTP
9: OpenVPN
Hostname_strstring (ASCII)Host name
Ip_ipstring (IP address)IP address
Port_u32number (uint32)Port number
ConnectedTime_dtDateConnected time
ServerStr_strstring (ASCII)Server string
ServerVer_u32number (uint32)Server version
ServerBuild_u32number (uint32)Server build number
ClientStr_strstring (ASCII)Client string
ClientVer_u32number (uint32)Client version
ClientBuild_u32number (uint32)Client build number
+
+

+

"SetHubOnline" RPC API - Switch Virtual Hub to Online or Offline

+

Description

+

Switch Virtual Hub to Online or Offline. Use this to set the Virtual Hub to online or offline. A Virtual Hub with an offline status cannot receive VPN connections from clients. When you set the Virtual Hub offline, all sessions will be disconnected. A Virtual Hub with an offline status cannot receive VPN connections from clients. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubOnline",
+  "params": {
+    "HubName_str": "hubname",
+    "Online_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Online_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline / offline flag
+
+

+

"GetHubStatus" RPC API - Get Current Status of Virtual Hub

+

Description

+

Get Current Status of Virtual Hub. Use this to get the current status of the Virtual Hub currently being managed. You can get the following information: Virtual Hub Type, Number of Sessions, Number of Each Type of Object, Number of Logins, Last Login, Last Communication, and Communication Statistical Data.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubStatus",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Online_bool": false,
+    "HubType_u32": 0,
+    "NumSessions_u32": 0,
+    "NumSessionsClient_u32": 0,
+    "NumSessionsBridge_u32": 0,
+    "NumAccessLists_u32": 0,
+    "NumUsers_u32": 0,
+    "NumGroups_u32": 0,
+    "NumMacTables_u32": 0,
+    "NumIpTables_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "SecureNATEnabled_bool": false,
+    "LastCommTime_dt": "2020-08-01T12:24:36.123",
+    "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+    "CreatedTime_dt": "2020-08-01T12:24:36.123",
+    "NumLogin_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline
HubType_u32number (enum)Type of HUB
Values:
0: Stand-alone HUB
1: Static HUB
2: Dynamic HUB
NumSessions_u32number (uint32)Number of sessions
NumSessionsClient_u32number (uint32)Number of sessions (client mode)
NumSessionsBridge_u32number (uint32)Number of sessions (bridge mode)
NumAccessLists_u32number (uint32)Number of Access list entries
NumUsers_u32number (uint32)Number of users
NumGroups_u32number (uint32)Number of groups
NumMacTables_u32number (uint32)Number of MAC table entries
NumIpTables_u32number (uint32)Number of IP table entries
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
SecureNATEnabled_boolbooleanWhether SecureNAT is enabled
LastCommTime_dtDateLast communication date and time
LastLoginTime_dtDateLast login date and time
CreatedTime_dtDateCreation date and time
NumLogin_u32number (uint32)Number of logins
+
+

+

"SetHubLog" RPC API - Set the logging configuration of the Virtual Hub

+

Description

+

Set the logging configuration of the Virtual Hub. Use this to enable or disable a security log or packet logs of the Virtual Hub currently being managed, set the save contents of the packet log for each type of packet to be saved, and set the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. There are the following packet types: TCP Connection Log, TCP Packet Log, DHCP Packet Log, UDP Packet Log, ICMP Packet Log, IP Packet Log, ARP Packet Log, and Ethernet Packet Log. To get the current setting, you can use the LogGet API. The log file switch cycle can be changed to switch in every second, every minute, every hour, every day, every month or not switch. To get the current setting, you can use the GetHubLog API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubLog",
+  "params": {
+    "HubName_str": "hubname",
+    "SaveSecurityLog_bool": false,
+    "SecurityLogSwitchType_u32": 0,
+    "SavePacketLog_bool": false,
+    "PacketLogSwitchType_u32": 0,
+    "PacketLogConfig_u32": [
+      1,
+      2,
+      3
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "SaveSecurityLog_bool": false,
+    "SecurityLogSwitchType_u32": 0,
+    "SavePacketLog_bool": false,
+    "PacketLogSwitchType_u32": 0,
+    "PacketLogConfig_u32": [
+      1,
+      2,
+      3
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
SaveSecurityLog_boolbooleanThe flag to enable / disable saving the security log
SecurityLogSwitchType_u32number (enum)The log filename switching setting of the security log
Values:
0: No switching
1: Secondly basis
2: Minutely basis
3: Hourly basis
4: Daily basis
5: Monthly basis
SavePacketLog_boolbooleanThe flag to enable / disable saving the security log
PacketLogSwitchType_u32number (enum)The log filename switching settings of the packet logs
Values:
0: No switching
1: Secondly basis
2: Minutely basis
3: Hourly basis
4: Daily basis
5: Monthly basis
PacketLogConfig_u32number (enum)Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7.
Values:
0: Not save
1: Only header
2: All payloads
+
+

+

"GetHubLog" RPC API - Get the logging configuration of the Virtual Hub

+

Description

+

Get the logging configuration of the Virtual Hub. Use this to get the configuration for a security log or packet logs of the Virtual Hub currently being managed, get the setting for save contents of the packet log for each type of packet to be saved, and get the log file switch cycle for the security log or packet log that the currently managed Virtual Hub saves. To set the current setting, you can use the SetHubLog API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubLog",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "SaveSecurityLog_bool": false,
+    "SecurityLogSwitchType_u32": 0,
+    "SavePacketLog_bool": false,
+    "PacketLogSwitchType_u32": 0,
+    "PacketLogConfig_u32": [
+      1,
+      2,
+      3
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
SaveSecurityLog_boolbooleanThe flag to enable / disable saving the security log
SecurityLogSwitchType_u32number (enum)The log filename switching setting of the security log
Values:
0: No switching
1: Secondly basis
2: Minutely basis
3: Hourly basis
4: Daily basis
5: Monthly basis
SavePacketLog_boolbooleanThe flag to enable / disable saving the security log
PacketLogSwitchType_u32number (enum)The log filename switching settings of the packet logs
Values:
0: No switching
1: Secondly basis
2: Minutely basis
3: Hourly basis
4: Daily basis
5: Monthly basis
PacketLogConfig_u32number (enum)Specify the save contents of the packet logs (uint * 16 array). The index numbers: TcpConnection = 0, TcpAll = 1, DHCP = 2, UDP = 3, ICMP = 4, IP = 5, ARP = 6, Ethernet = 7.
Values:
0: Not save
1: Only header
2: All payloads
+
+

+

"AddCa" RPC API - Add Trusted CA Certificate

+

Description

+

Add Trusted CA Certificate. Use this to add a new certificate to a list of CA certificates trusted by the currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. To get a list of the current certificates you can use the EnumCa API. The certificate you add must be saved in the X.509 file format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddCa",
+  "params": {
+    "HubName_str": "hubname",
+    "Cert_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Cert_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Cert_binstring (Base64 binary)The body of the X.509 certificate
+
+

+

"EnumCa" RPC API - Get List of Trusted CA Certificates

+

Description

+

Get List of Trusted CA Certificates. Here you can manage the certificate authority certificates that are trusted by this currently managed Virtual Hub. The list of certificate authority certificates that are registered is used to verify certificates when a VPN Client is connected in signed certificate authentication mode. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumCa",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "CAList": [
+      {
+        "Key_u32": 0,
+        "SubjectName_utf": "subjectname",
+        "IssuerName_utf": "issuername",
+        "Expires_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "Key_u32": 0,
+        "SubjectName_utf": "subjectname",
+        "IssuerName_utf": "issuername",
+        "Expires_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "Key_u32": 0,
+        "SubjectName_utf": "subjectname",
+        "IssuerName_utf": "issuername",
+        "Expires_dt": "2020-08-01T12:24:36.123"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
CAListArray objectThe list of CA
Key_u32number (uint32)The key id of the item
SubjectName_utfstring (UTF8)Subject
IssuerName_utfstring (UTF8)Issuer
Expires_dtDateExpiration date
+
+

+

"GetCa" RPC API - Get Trusted CA Certificate

+

Description

+

Get Trusted CA Certificate. Use this to get an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub and save it as a file in X.509 format. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetCa",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "Cert_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)The key id of the certificate
Cert_binstring (Base64 binary)The body of the X.509 certificate
+
+

+

"DeleteCa" RPC API - Delete Trusted CA Certificate

+

Description

+

Delete Trusted CA Certificate. Use this to delete an existing certificate from the list of CA certificates trusted by the currently managed Virtual Hub. To get a list of the current certificates you can use the EnumCa API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteCa",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Certificate key id to be deleted
+
+

+ +

Description

+

Create New Cascade Connection. Use this to create a new Cascade Connection on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Cascade Connection to another Virtual Hub that is operating on the same or a different computer. To create a Cascade Connection, you must specify the name of the Cascade Connection, destination server and destination Virtual Hub and user name. When a new Cascade Connection is created, the type of user authentication is initially set as Anonymous Authentication and the proxy server setting and the verification options of the server certificate is not set. To change these settings and other advanced settings after a Cascade Connection has been created, use the other APIs that include the name "Link". [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateLink",
+  "params": {
+    "HubName_Ex_str": "hubname_ex",
+    "CheckServerCert_bool": false,
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_Ex_str": "hubname_ex",
+    "Online_bool": false,
+    "CheckServerCert_bool": false,
+    "ServerCert_bin": "SGVsbG8gV29ybGQ=",
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "ProxyName_str": "clientoption_proxyname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "clientoption_proxyusername",
+    "ProxyPassword_str": "clientoption_proxypassword",
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "DisableQoS_bool": false,
+    "NoTls1_bool": false,
+    "NoUdpAcceleration_bool": false,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_Ex_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
CheckServerCert_boolbooleanThe flag to enable validation for the server certificate
ServerCert_binstring (Base64 binary)The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.
AccountName_utfstring (UTF8)Client Option Parameters: Specify the name of the Cascade Connection
Hostname_strstring (ASCII)Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.
Port_u32number (uint32)Client Option Parameters: Specify the port number of the destination VPN Server.
ProxyType_u32number (enum)Client Option Parameters: The type of the proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyName_strstring (ASCII)Client Option Parameters: The hostname or IP address of the proxy server name
ProxyPort_u32number (uint32)Client Option Parameters: The port number of the proxy server
ProxyUsername_strstring (ASCII)Client Option Parameters: The username to connect to the proxy server
ProxyPassword_strstring (ASCII)Client Option Parameters: The password to connect to the proxy server
HubName_strstring (ASCII)Client Option Parameters: The Virtual Hub on the destination VPN Server
MaxConnection_u32number (uint32)Client Option Parameters: Number of TCP Connections to Use in VPN Communication
UseEncrypt_boolbooleanClient Option Parameters: The flag to enable the encryption on the communication
UseCompress_boolbooleanClient Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection
HalfConnection_boolbooleanClient Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.
AdditionalConnectionInterval_u32number (uint32)Client Option Parameters: Connection attempt interval when additional connection will be established
ConnectionDisconnectSpan_u32number (uint32)Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)
DisableQoS_boolbooleanClient Option Parameters: Disable QoS Control Function if the value is true
NoTls1_boolbooleanClient Option Parameters: Do not use TLS 1.x of the value is true
NoUdpAcceleration_boolbooleanClient Option Parameters: Do not use UDP acceleration mode if the value is true
AuthType_u32number (enum)Authentication type
Values:
0: Anonymous authentication
1: SHA-0 hashed password authentication
2: Plain password authentication
3: Certificate authentication
Username_strstring (ASCII)User name
HashedPassword_binstring (Base64 binary)SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).
PlainPassword_strstring (ASCII)Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).
ClientX_binstring (Base64 binary)Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
ClientK_binstring (Base64 binary)Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
SecPol_CheckMac_boolbooleanSecurity policy: Prohibit the duplicate MAC address
SecPol_CheckIP_boolbooleanSecurity policy: Prohibit a duplicate IP address (IPv4)
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
SecPol_RAFilter_boolbooleanSecurity policy: Filter the router advertisement packet (IPv6)
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
SecPol_CheckIPv6_boolbooleanSecurity policy: Prohibit the duplicate IP address (IPv6)
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+ +

Description

+

Get the Cascade Connection Setting. Use this to get the Connection Setting of a Cascade Connection that is registered on the currently managed Virtual Hub. To change the Connection Setting contents of the Cascade Connection, use the APIs that include the name "Link" after creating the Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetLink",
+  "params": {
+    "HubName_Ex_str": "hubname_ex",
+    "AccountName_utf": "clientoption_accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_Ex_str": "hubname_ex",
+    "Online_bool": false,
+    "CheckServerCert_bool": false,
+    "ServerCert_bin": "SGVsbG8gV29ybGQ=",
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "ProxyName_str": "clientoption_proxyname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "clientoption_proxyusername",
+    "ProxyPassword_str": "clientoption_proxypassword",
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "DisableQoS_bool": false,
+    "NoTls1_bool": false,
+    "NoUdpAcceleration_bool": false,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_Ex_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
CheckServerCert_boolbooleanThe flag to enable validation for the server certificate
ServerCert_binstring (Base64 binary)The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.
AccountName_utfstring (UTF8)Client Option Parameters: Specify the name of the Cascade Connection
Hostname_strstring (ASCII)Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.
Port_u32number (uint32)Client Option Parameters: Specify the port number of the destination VPN Server.
ProxyType_u32number (enum)Client Option Parameters: The type of the proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyName_strstring (ASCII)Client Option Parameters: The hostname or IP address of the proxy server name
ProxyPort_u32number (uint32)Client Option Parameters: The port number of the proxy server
ProxyUsername_strstring (ASCII)Client Option Parameters: The username to connect to the proxy server
ProxyPassword_strstring (ASCII)Client Option Parameters: The password to connect to the proxy server
HubName_strstring (ASCII)Client Option Parameters: The Virtual Hub on the destination VPN Server
MaxConnection_u32number (uint32)Client Option Parameters: Number of TCP Connections to Use in VPN Communication
UseEncrypt_boolbooleanClient Option Parameters: The flag to enable the encryption on the communication
UseCompress_boolbooleanClient Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection
HalfConnection_boolbooleanClient Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.
AdditionalConnectionInterval_u32number (uint32)Client Option Parameters: Connection attempt interval when additional connection will be established
ConnectionDisconnectSpan_u32number (uint32)Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)
DisableQoS_boolbooleanClient Option Parameters: Disable QoS Control Function if the value is true
NoTls1_boolbooleanClient Option Parameters: Do not use TLS 1.x of the value is true
NoUdpAcceleration_boolbooleanClient Option Parameters: Do not use UDP acceleration mode if the value is true
AuthType_u32number (enum)Authentication type
Values:
0: Anonymous authentication
1: SHA-0 hashed password authentication
2: Plain password authentication
3: Certificate authentication
Username_strstring (ASCII)User name
HashedPassword_binstring (Base64 binary)SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).
PlainPassword_strstring (ASCII)Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).
ClientX_binstring (Base64 binary)Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
ClientK_binstring (Base64 binary)Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
SecPol_CheckMac_boolbooleanSecurity policy: Prohibit the duplicate MAC address
SecPol_CheckIP_boolbooleanSecurity policy: Prohibit a duplicate IP address (IPv4)
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
SecPol_RAFilter_boolbooleanSecurity policy: Filter the router advertisement packet (IPv6)
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
SecPol_CheckIPv6_boolbooleanSecurity policy: Prohibit the duplicate IP address (IPv6)
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+ +

Description

+

Change Existing Cascade Connection. Use this to alter the setting of an existing Cascade Connection on the currently managed Virtual Hub.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetLink",
+  "params": {
+    "HubName_Ex_str": "hubname_ex",
+    "CheckServerCert_bool": false,
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_Ex_str": "hubname_ex",
+    "Online_bool": false,
+    "CheckServerCert_bool": false,
+    "ServerCert_bin": "SGVsbG8gV29ybGQ=",
+    "AccountName_utf": "clientoption_accountname",
+    "Hostname_str": "clientoption_hostname",
+    "Port_u32": 0,
+    "ProxyType_u32": 0,
+    "ProxyName_str": "clientoption_proxyname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "clientoption_proxyusername",
+    "ProxyPassword_str": "clientoption_proxypassword",
+    "HubName_str": "clientoption_hubname",
+    "MaxConnection_u32": 0,
+    "UseEncrypt_bool": false,
+    "UseCompress_bool": false,
+    "HalfConnection_bool": false,
+    "AdditionalConnectionInterval_u32": 0,
+    "ConnectionDisconnectSpan_u32": 0,
+    "DisableQoS_bool": false,
+    "NoTls1_bool": false,
+    "NoUdpAcceleration_bool": false,
+    "AuthType_u32": 0,
+    "Username_str": "clientauth_username",
+    "HashedPassword_bin": "SGVsbG8gV29ybGQ=",
+    "PlainPassword_str": "clientauth_plainpassword",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientK_bin": "SGVsbG8gV29ybGQ=",
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "SecPol_CheckMac_bool": false,
+    "SecPol_CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:RSandRAFilter_bool": false,
+    "SecPol_RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "SecPol_CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_Ex_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
CheckServerCert_boolbooleanThe flag to enable validation for the server certificate
ServerCert_binstring (Base64 binary)The body of server X.509 certificate to compare. Valid only if the CheckServerCert_bool flag is true.
AccountName_utfstring (UTF8)Client Option Parameters: Specify the name of the Cascade Connection
Hostname_strstring (ASCII)Client Option Parameters: Specify the hostname of the destination VPN Server. You can also specify by IP address.
Port_u32number (uint32)Client Option Parameters: Specify the port number of the destination VPN Server.
ProxyType_u32number (enum)Client Option Parameters: The type of the proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyName_strstring (ASCII)Client Option Parameters: The hostname or IP address of the proxy server name
ProxyPort_u32number (uint32)Client Option Parameters: The port number of the proxy server
ProxyUsername_strstring (ASCII)Client Option Parameters: The username to connect to the proxy server
ProxyPassword_strstring (ASCII)Client Option Parameters: The password to connect to the proxy server
HubName_strstring (ASCII)Client Option Parameters: The Virtual Hub on the destination VPN Server
MaxConnection_u32number (uint32)Client Option Parameters: Number of TCP Connections to Use in VPN Communication
UseEncrypt_boolbooleanClient Option Parameters: The flag to enable the encryption on the communication
UseCompress_boolbooleanClient Option Parameters: Enable / Disable Data Compression when Communicating by Cascade Connection
HalfConnection_boolbooleanClient Option Parameters: Specify true when enabling half duplex mode. When using two or more TCP connections for VPN communication, it is possible to use Half Duplex Mode. By enabling half duplex mode it is possible to automatically fix data transmission direction as half and half for each TCP connection. In the case where a VPN using 8 TCP connections is established, for example, when half-duplex is enabled, communication can be fixes so that 4 TCP connections are dedicated to the upload direction and the other 4 connections are dedicated to the download direction.
AdditionalConnectionInterval_u32number (uint32)Client Option Parameters: Connection attempt interval when additional connection will be established
ConnectionDisconnectSpan_u32number (uint32)Client Option Parameters: Connection Life of Each TCP Connection (0 for no keep-alive)
DisableQoS_boolbooleanClient Option Parameters: Disable QoS Control Function if the value is true
NoTls1_boolbooleanClient Option Parameters: Do not use TLS 1.x of the value is true
NoUdpAcceleration_boolbooleanClient Option Parameters: Do not use UDP acceleration mode if the value is true
AuthType_u32number (enum)Authentication type
Values:
0: Anonymous authentication
1: SHA-0 hashed password authentication
2: Plain password authentication
3: Certificate authentication
Username_strstring (ASCII)User name
HashedPassword_binstring (Base64 binary)SHA-0 Hashed password. Valid only if ClientAuth_AuthType_u32 == SHA0_Hashed_Password (1). The SHA-0 hashed password must be caluclated by the SHA0(UpperCase(username_ascii_string) + password_ascii_string).
PlainPassword_strstring (ASCII)Plaintext Password. Valid only if ClientAuth_AuthType_u32 == PlainPassword (2).
ClientX_binstring (Base64 binary)Client certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
ClientK_binstring (Base64 binary)Client private key of the certificate. Valid only if ClientAuth_AuthType_u32 == Cert (3).
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
SecPol_CheckMac_boolbooleanSecurity policy: Prohibit the duplicate MAC address
SecPol_CheckIP_boolbooleanSecurity policy: Prohibit a duplicate IP address (IPv4)
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
SecPol_RAFilter_boolbooleanSecurity policy: Filter the router advertisement packet (IPv6)
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
SecPol_CheckIPv6_boolbooleanSecurity policy: Prohibit the duplicate IP address (IPv6)
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+ +

Description

+

Get List of Cascade Connections. Use this to get a list of Cascade Connections that are registered on the currently managed Virtual Hub. By using a Cascade Connection, you can connect this Virtual Hub by Layer 2 Cascade Connection to another Virtual Hub that is operating on the same or a different computer. [Warning About Cascade Connections] By connecting using a Cascade Connection you can create a Layer 2 bridge between multiple Virtual Hubs but if the connection is incorrectly configured, a loopback Cascade Connection could inadvertently be created. When using a Cascade Connection function please design the network topology with care. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumLink",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "NumLink_u32": 0,
+    "LinkList": [
+      {
+        "AccountName_utf": "accountname",
+        "Online_bool": false,
+        "Connected_bool": false,
+        "LastError_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Hostname_str": "hostname",
+        "TargetHubName_str": "targethubname"
+      },
+      {
+        "AccountName_utf": "accountname",
+        "Online_bool": false,
+        "Connected_bool": false,
+        "LastError_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Hostname_str": "hostname",
+        "TargetHubName_str": "targethubname"
+      },
+      {
+        "AccountName_utf": "accountname",
+        "Online_bool": false,
+        "Connected_bool": false,
+        "LastError_u32": 0,
+        "ConnectedTime_dt": "2020-08-01T12:24:36.123",
+        "Hostname_str": "hostname",
+        "TargetHubName_str": "targethubname"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
NumLink_u32number (uint32)Number of cascade connections
LinkListArray objectThe list of cascade connections
AccountName_utfstring (UTF8)The name of cascade connection
Online_boolbooleanOnline flag
Connected_boolbooleanThe flag indicates whether the cascade connection is established
LastError_u32number (uint32)The error last occurred if the cascade connection is in the fail state
ConnectedTime_dtDateConnection completion time
Hostname_strstring (ASCII)Host name of the destination VPN server
TargetHubName_strstring (ASCII)The Virtual Hub name
+
+

+

"SetLinkOnline" RPC API - Switch Cascade Connection to Online Status

+

Description

+

Switch Cascade Connection to Online Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to online status. The Cascade Connection that is switched to online status begins the process of connecting to the destination VPN Server in accordance with the Connection Setting. The Cascade Connection that is switched to online status will establish normal connection to the VPN Server or continue to attempt connection until it is switched to offline status. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetLinkOnline",
+  "params": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccountName_utfstring (UTF8)The name of the cascade connection
+
+

+

"SetLinkOffline" RPC API - Switch Cascade Connection to Offline Status

+

Description

+

Switch Cascade Connection to Offline Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to switch that Cascade Connection to offline status. The Cascade Connection that is switched to offline will not connect to the VPN Server until next time it is switched to the online status using the SetLinkOnline API You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetLinkOffline",
+  "params": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccountName_utfstring (UTF8)The name of the cascade connection
+
+

+ +

Description

+

Delete Cascade Connection Setting. Use this to delete a Cascade Connection that is registered on the currently managed Virtual Hub. If the specified Cascade Connection has a status of online, the connections will be automatically disconnected and then the Cascade Connection will be deleted. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteLink",
+  "params": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccountName_utfstring (UTF8)The name of the cascade connection
+
+

+ +

Description

+

Change Name of Cascade Connection. When a Cascade Connection registered on the currently managed Virtual Hub is specified, use this to change the name of that Cascade Connection. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "RenameLink",
+  "params": {
+    "HubName_str": "hubname",
+    "OldAccountName_utf": "oldaccountname",
+    "NewAccountName_utf": "newaccountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "OldAccountName_utf": "oldaccountname",
+    "NewAccountName_utf": "newaccountname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
OldAccountName_utfstring (UTF8)The old name of the cascade connection
NewAccountName_utfstring (UTF8)The new name of the cascade connection
+
+

+

"GetLinkStatus" RPC API - Get Current Cascade Connection Status

+

Description

+

Get Current Cascade Connection Status. When a Cascade Connection registered on the currently managed Virtual Hub is specified and that Cascade Connection is currently online, use this to get its connection status and other information. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetLinkStatus",
+  "params": {
+    "HubName_Ex_str": "hubname_ex",
+    "AccountName_utf": "accountname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_Ex_str": "hubname_ex",
+    "AccountName_utf": "accountname",
+    "Active_bool": false,
+    "Connected_bool": false,
+    "SessionStatus_u32": 0,
+    "ServerName_str": "servername",
+    "ServerPort_u32": 0,
+    "ServerProductName_str": "serverproductname",
+    "ServerProductVer_u32": 0,
+    "ServerProductBuild_u32": 0,
+    "ServerX_bin": "SGVsbG8gV29ybGQ=",
+    "ClientX_bin": "SGVsbG8gV29ybGQ=",
+    "StartTime_dt": "2020-08-01T12:24:36.123",
+    "FirstConnectionEstablisiedTime_dt": "2020-08-01T12:24:36.123",
+    "CurrentConnectionEstablishTime_dt": "2020-08-01T12:24:36.123",
+    "NumConnectionsEatablished_u32": 0,
+    "HalfConnection_bool": false,
+    "QoS_bool": false,
+    "MaxTcpConnections_u32": 0,
+    "NumTcpConnections_u32": 0,
+    "NumTcpConnectionsUpload_u32": 0,
+    "NumTcpConnectionsDownload_u32": 0,
+    "UseEncrypt_bool": false,
+    "CipherName_str": "ciphername",
+    "UseCompress_bool": false,
+    "IsRUDPSession_bool": false,
+    "UnderlayProtocol_str": "underlayprotocol",
+    "IsUdpAccelerationEnabled_bool": false,
+    "IsUsingUdpAcceleration_bool": false,
+    "SessionName_str": "sessionname",
+    "ConnectionName_str": "connectionname",
+    "SessionKey_bin": "SGVsbG8gV29ybGQ=",
+    "TotalSendSize_u64": 0,
+    "TotalRecvSize_u64": 0,
+    "TotalSendSizeReal_u64": 0,
+    "TotalRecvSizeReal_u64": 0,
+    "IsBridgeMode_bool": false,
+    "IsMonitorMode_bool": false,
+    "VLanId_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_Ex_strstring (ASCII)The Virtual Hub name
AccountName_utfstring (UTF8)The name of the cascade connection
Active_boolbooleanThe flag whether the cascade connection is enabled
Connected_boolbooleanThe flag whether the cascade connection is established
SessionStatus_u32number (enum)The session status
Values:
0: Connecting
1: Negotiating
2: During user authentication
3: Connection complete
4: Wait to retry
5: Idle state
ServerName_strstring (ASCII)The destination VPN server name
ServerPort_u32number (uint32)The port number of the server
ServerProductName_strstring (ASCII)Server product name
ServerProductVer_u32number (uint32)Server product version
ServerProductBuild_u32number (uint32)Server product build number
ServerX_binstring (Base64 binary)Server's X.509 certificate
ClientX_binstring (Base64 binary)Client certificate
StartTime_dtDateConnection start time
FirstConnectionEstablisiedTime_dtDateConnection completion time of the first connection
CurrentConnectionEstablishTime_dtDateConnection completion time of this connection
NumConnectionsEatablished_u32number (uint32)Number of connections have been established so far
HalfConnection_boolbooleanHalf-connection
QoS_boolbooleanVoIP / QoS
MaxTcpConnections_u32number (uint32)Maximum number of the underlying TCP connections
NumTcpConnections_u32number (uint32)Number of current underlying TCP connections
NumTcpConnectionsUpload_u32number (uint32)Number of underlying inbound TCP connections
NumTcpConnectionsDownload_u32number (uint32)Number of underlying outbound TCP connections
UseEncrypt_boolbooleanUse of encryption
CipherName_strstring (ASCII)Cipher algorithm name
UseCompress_boolbooleanUse of compression
IsRUDPSession_boolbooleanThe flag whether this is a R-UDP session
UnderlayProtocol_strstring (ASCII)Underlying physical communication protocol
IsUdpAccelerationEnabled_boolbooleanThe UDP acceleration is enabled
IsUsingUdpAcceleration_boolbooleanThe UDP acceleration is being actually used
SessionName_strstring (ASCII)Session name
ConnectionName_strstring (ASCII)Connection name
SessionKey_binstring (Base64 binary)Session key
TotalSendSize_u64number (uint64)Total transmitted data size
TotalRecvSize_u64number (uint64)Total received data size
TotalSendSizeReal_u64number (uint64)Total transmitted data size (no compression)
TotalRecvSizeReal_u64number (uint64)Total received data size (no compression)
IsBridgeMode_boolbooleanThe flag whether the VPN session is Bridge Mode
IsMonitorMode_boolbooleanThe flag whether the VPN session is Monitor mode
VLanId_u32number (uint32)VLAN ID
+
+

+

"AddAccess" RPC API - Add Access List Rule

+

Description

+

Add Access List Rule. Use this to add a new rule to the access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define an priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. You can also use the access list to generate delays, jitters and packet losses. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddAccess",
+  "params": {
+    "HubName_str": "hubname",
+    "AccessListSingle": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccessListSingle": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccessListSingleArray objectAccess list (Must be a single item)
Id_u32number (uint32)ID
Note_utfstring (UTF8)Specify a description (note) for this rule
Active_boolbooleanEnabled flag (true: enabled, false: disabled)
Priority_u32number (uint32)Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.
Discard_boolbooleanThe flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.
IsIPv6_boolbooleanThe flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.
SrcIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.
SrcSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
DestIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.
DestSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
SrcIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.
SrcSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
DestIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.
DestSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
Protocol_u32number (enum)The IP protocol number
Values:
1: ICMP for IPv4
6: TCP
17: UDP
58: ICMP for IPv6
SrcPortStart_u32number (uint32)The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcPortEnd_u32number (uint32)The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortStart_u32number (uint32)The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortEnd_u32number (uint32)The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcUsername_strstring (ASCII)Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
DestUsername_strstring (ASCII)Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
CheckSrcMac_boolbooleanSpecify true if you want to check the source MAC address.
SrcMacAddress_binstring (Base64 binary)Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
SrcMacMask_binstring (Base64 binary)Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckDstMac_boolbooleanSpecify true if you want to check the destination MAC address.
DstMacAddress_binstring (Base64 binary)Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
DstMacMask_binstring (Base64 binary)Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckTcpState_boolbooleanSpecify true if you want to check the state of the TCP connection.
Established_boolbooleanValid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.
Delay_u32number (uint32)Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.
Jitter_u32number (uint32)Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.
Loss_u32number (uint32)Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.
RedirectUrl_strstring (ASCII)The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.
+
+

+

"DeleteAccess" RPC API - Delete Rule from Access List

+

Description

+

Delete Rule from Access List. Use this to specify a packet filter rule registered on the access list of the currently managed Virtual Hub and delete it. To delete a rule, you must specify that rule's ID. You can display the ID by using the EnumAccess API. If you wish not to delete the rule but to only temporarily disable it, use the SetAccessList API to set the rule status to disable. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteAccess",
+  "params": {
+    "HubName_str": "hubname",
+    "Id_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Id_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Id_u32number (uint32)ID
+
+

+

"EnumAccess" RPC API - Get Access List Rule List

+

Description

+

Get Access List Rule List. Use this to get a list of packet filter rules that are registered on access list of the currently managed Virtual Hub. The access list is a set of packet file rules that are applied to packets that flow through the Virtual Hub. You can register multiple rules in an access list and you can also define a priority for each rule. All packets are checked for the conditions specified by the rules registered in the access list and based on the operation that is stipulated by the first matching rule, they either pass or are discarded. Packets that do not match any rule are implicitly allowed to pass. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumAccess",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccessList": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccessListArray objectAccess list
Id_u32number (uint32)ID
Note_utfstring (UTF8)Specify a description (note) for this rule
Active_boolbooleanEnabled flag (true: enabled, false: disabled)
Priority_u32number (uint32)Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.
Discard_boolbooleanThe flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.
IsIPv6_boolbooleanThe flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.
SrcIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.
SrcSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
DestIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.
DestSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
SrcIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.
SrcSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
DestIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.
DestSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
Protocol_u32number (enum)The IP protocol number
Values:
1: ICMP for IPv4
6: TCP
17: UDP
58: ICMP for IPv6
SrcPortStart_u32number (uint32)The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcPortEnd_u32number (uint32)The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortStart_u32number (uint32)The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortEnd_u32number (uint32)The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcUsername_strstring (ASCII)Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
DestUsername_strstring (ASCII)Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
CheckSrcMac_boolbooleanSpecify true if you want to check the source MAC address.
SrcMacAddress_binstring (Base64 binary)Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
SrcMacMask_binstring (Base64 binary)Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckDstMac_boolbooleanSpecify true if you want to check the destination MAC address.
DstMacAddress_binstring (Base64 binary)Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
DstMacMask_binstring (Base64 binary)Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckTcpState_boolbooleanSpecify true if you want to check the state of the TCP connection.
Established_boolbooleanValid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.
Delay_u32number (uint32)Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.
Jitter_u32number (uint32)Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.
Loss_u32number (uint32)Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.
RedirectUrl_strstring (ASCII)The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.
+
+

+

"SetAccessList" RPC API - Replace all access lists on a single bulk API call

+

Description

+

Replace all access lists on a single bulk API call. This API removes all existing access list rules on the Virtual Hub, and replace them by new access list rules specified by the parameter.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetAccessList",
+  "params": {
+    "HubName_str": "hubname",
+    "AccessList": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AccessList": [
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      },
+      {
+        "Id_u32": 0,
+        "Note_utf": "note",
+        "Active_bool": false,
+        "Priority_u32": 0,
+        "Discard_bool": false,
+        "IsIPv6_bool": false,
+        "SrcIpAddress_ip": "192.168.0.1",
+        "SrcSubnetMask_ip": "255.255.255.255",
+        "DestIpAddress_ip": "192.168.0.1",
+        "DestSubnetMask_ip": "255.255.255.255",
+        "SrcIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "SrcSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "DestIpAddress6_bin": "SGVsbG8gV29ybGQ=",
+        "DestSubnetMask6_bin": "SGVsbG8gV29ybGQ=",
+        "Protocol_u32": 0,
+        "SrcPortStart_u32": 0,
+        "SrcPortEnd_u32": 0,
+        "DestPortStart_u32": 0,
+        "DestPortEnd_u32": 0,
+        "SrcUsername_str": "srcusername",
+        "DestUsername_str": "destusername",
+        "CheckSrcMac_bool": false,
+        "SrcMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "SrcMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckDstMac_bool": false,
+        "DstMacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "DstMacMask_bin": "SGVsbG8gV29ybGQ=",
+        "CheckTcpState_bool": false,
+        "Established_bool": false,
+        "Delay_u32": 0,
+        "Jitter_u32": 0,
+        "Loss_u32": 0,
+        "RedirectUrl_str": "redirecturl"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
AccessListArray objectAccess list
Id_u32number (uint32)ID
Note_utfstring (UTF8)Specify a description (note) for this rule
Active_boolbooleanEnabled flag (true: enabled, false: disabled)
Priority_u32number (uint32)Specify an integer of 1 or higher to indicate the priority of the rule. Higher priority is given to rules with the lower priority values.
Discard_boolbooleanThe flag if the rule is DISCARD operation or PASS operation. When a packet matches this rule condition, this operation is decided. When the operation of the rule is PASS, the packet is allowed to pass, otherwise the packet will be discarded.
IsIPv6_boolbooleanThe flag if the rule is for IPv6. Specify false for IPv4, or specify true for IPv6.
SrcIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 address as a rule condition. You must also specify the SrcSubnetMask_ip field.
SrcSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a source IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
DestIpAddress_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 address as a rule condition. You must also specify the DestSubnetMask_ip field.
DestSubnetMask_ipstring (IP address)Valid only if the rule is IPv4 mode (IsIPv6_bool == false). Specify a destination IPv4 subnet mask as a rule condition. "0.0.0.0" means all hosts. "255.255.255.255" means one single host.
SrcIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the SrcSubnetMask6_bin field.
SrcSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a source IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
DestIpAddress6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 address as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 address in binary form. You must also specify the DestSubnetMask6_bin field.
DestSubnetMask6_binstring (Base64 binary)Valid only if the rule is IPv6 mode (IsIPv6_bool == true). Specify a destination IPv6 subnet mask as a rule condition. The field must be a byte array of 16 bytes (128 bits) to contain the IPv6 subnet mask in binary form.
Protocol_u32number (enum)The IP protocol number
Values:
1: ICMP for IPv4
6: TCP
17: UDP
58: ICMP for IPv6
SrcPortStart_u32number (uint32)The Start Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcPortEnd_u32number (uint32)The End Value of the Source Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the source port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortStart_u32number (uint32)The Start Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
DestPortEnd_u32number (uint32)The End Value of the Destination Port Number Range. If the specified protocol is TCP/IP or UDP/IP, specify the destination port number as the rule condition. Protocols other than this will be ignored. When this parameter is not specified, the rules will apply to all port numbers.
SrcUsername_strstring (ASCII)Source user name. You can apply this rule to only the packets sent by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
DestUsername_strstring (ASCII)Destination user name. You can apply this rule to only the packets received by a user session of a user name that has been specified as a rule condition. In this case, specify the user name.
CheckSrcMac_boolbooleanSpecify true if you want to check the source MAC address.
SrcMacAddress_binstring (Base64 binary)Source MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
SrcMacMask_binstring (Base64 binary)Source MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckDstMac_boolbooleanSpecify true if you want to check the destination MAC address.
DstMacAddress_binstring (Base64 binary)Destination MAC address (6 bytes), valid only if CheckSrcMac_bool == true.
DstMacMask_binstring (Base64 binary)Destination MAC address mask (6 bytes), valid only if CheckSrcMac_bool == true.
CheckTcpState_boolbooleanSpecify true if you want to check the state of the TCP connection.
Established_boolbooleanValid only if CheckTcpState_bool == true. Set this field true to match only TCP-established packets. Set this field false to match only TCP-non established packets.
Delay_u32number (uint32)Set this value to generate delays when packets is passing. Specify the delay period in milliseconds. Specify 0 means no delays to generate. The delays must be 10000 milliseconds at most.
Jitter_u32number (uint32)Set this value to generate jitters when packets is passing. Specify the ratio of fluctuation of jitters within 0% to 100% range. Specify 0 means no jitters to generate.
Loss_u32number (uint32)Set this value to generate packet losses when packets is passing. Specify the ratio of packet losses within 0% to 100% range. Specify 0 means no packet losses to generate.
RedirectUrl_strstring (ASCII)The specified URL will be mandatory replied to the client as a response for TCP connecting request packets which matches the conditions of this access list entry via this Virtual Hub. To use this setting, you can enforce the web browser of the VPN Client computer to show the specified web site when that web browser tries to access the specific IP address.
+
+

+

"CreateUser" RPC API - Create a user

+

Description

+

Create a user. Use this to create a new user in the security account database of the currently managed Virtual Hub. By creating a user, the VPN Client can connect to the Virtual Hub by using the authentication information of that user. Note that a user whose user name has been created as "" (a single asterisk character) will automatically be registered as a RADIUS authentication user. For cases where there are users with "" as the name, when a user, whose user name that has been provided when a client connected to a VPN Server does not match existing user names, is able to be authenticated by a RADIUS server or NT domain controller by inputting a user name and password, the authentication settings and security policy settings will follow the setting for the user "*". To change the user information of a user that has been created, use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateUser",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "GroupName_str": "groupname",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "CreatedTime_dt": "2020-08-01T12:24:36.123",
+    "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "NumLogin_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)Specify the user name of the user
GroupName_strstring (ASCII)Assigned group name for the user
Realname_utfstring (UTF8)Optional real name (full name) of the user, allow using any Unicode characters
Note_utfstring (UTF8)Optional User Description
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateLast modified date and time
ExpireTime_dtDateExpiration date and time
AuthType_u32number (enum)Authentication method of the user
Values:
0: Anonymous authentication
1: Password authentication
2: User certificate authentication
3: Root certificate which is issued by trusted Certificate Authority
4: Radius authentication
5: Windows NT authentication
Auth_Password_strstring (ASCII)User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.
UserX_binstring (Base64 binary)User certificate, valid only if AuthType_u32 == UserCert(2).
Serial_binstring (Base64 binary)Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).
CommonName_utfstring (UTF8)Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).
RadiusUsername_utfstring (UTF8)Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).
NtUsername_utfstring (UTF8)Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).
NumLogin_u32number (uint32)Number of total logins of the user
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"SetUser" RPC API - Change User Settings

+

Description

+

Change User Settings. Use this to change user settings that is registered on the security account database of the currently managed Virtual Hub. The user settings that can be changed using this API are the three items that are specified when a new user is created using the CreateUser API: Group Name, Full Name, and Description. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetUser",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "GroupName_str": "groupname",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "GroupName_str": "groupname",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "CreatedTime_dt": "2020-08-01T12:24:36.123",
+    "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "NumLogin_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)Specify the user name of the user
GroupName_strstring (ASCII)Assigned group name for the user
Realname_utfstring (UTF8)Optional real name (full name) of the user, allow using any Unicode characters
Note_utfstring (UTF8)Optional User Description
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateLast modified date and time
ExpireTime_dtDateExpiration date and time
AuthType_u32number (enum)Authentication method of the user
Values:
0: Anonymous authentication
1: Password authentication
2: User certificate authentication
3: Root certificate which is issued by trusted Certificate Authority
4: Radius authentication
5: Windows NT authentication
Auth_Password_strstring (ASCII)User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.
UserX_binstring (Base64 binary)User certificate, valid only if AuthType_u32 == UserCert(2).
Serial_binstring (Base64 binary)Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).
CommonName_utfstring (UTF8)Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).
RadiusUsername_utfstring (UTF8)Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).
NtUsername_utfstring (UTF8)Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).
NumLogin_u32number (uint32)Number of total logins of the user
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"GetUser" RPC API - Get User Settings

+

Description

+

Get User Settings. Use this to get user settings information that is registered on the security account database of the currently managed Virtual Hub. The information that you can get using this API are User Name, Full Name, Group Name, Expiration Date, Security Policy, and Auth Type, as well as parameters that are specified as auth type attributes and the statistical data of that user. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetUser",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "GroupName_str": "groupname",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "CreatedTime_dt": "2020-08-01T12:24:36.123",
+    "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+    "ExpireTime_dt": "2020-08-01T12:24:36.123",
+    "AuthType_u32": 0,
+    "Auth_Password_str": "auth_password",
+    "UserX_bin": "SGVsbG8gV29ybGQ=",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "CommonName_utf": "auth_rootcert_commonname",
+    "RadiusUsername_utf": "auth_radius_radiususername",
+    "NtUsername_utf": "auth_nt_ntusername",
+    "NumLogin_u32": 0,
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)Specify the user name of the user
GroupName_strstring (ASCII)Assigned group name for the user
Realname_utfstring (UTF8)Optional real name (full name) of the user, allow using any Unicode characters
Note_utfstring (UTF8)Optional User Description
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateLast modified date and time
ExpireTime_dtDateExpiration date and time
AuthType_u32number (enum)Authentication method of the user
Values:
0: Anonymous authentication
1: Password authentication
2: User certificate authentication
3: Root certificate which is issued by trusted Certificate Authority
4: Radius authentication
5: Windows NT authentication
Auth_Password_strstring (ASCII)User password, valid only if AuthType_u32 == Password(1). Valid only to create or set operations.
UserX_binstring (Base64 binary)User certificate, valid only if AuthType_u32 == UserCert(2).
Serial_binstring (Base64 binary)Certificate Serial Number, optional, valid only if AuthType_u32 == RootCert(3).
CommonName_utfstring (UTF8)Certificate Common Name, optional, valid only if AuthType_u32 == RootCert(3).
RadiusUsername_utfstring (UTF8)Username in RADIUS server, optional, valid only if AuthType_u32 == Radius(4).
NtUsername_utfstring (UTF8)Username in NT Domain server, optional, valid only if AuthType_u32 == NT(5).
NumLogin_u32number (uint32)Number of total logins of the user
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"DeleteUser" RPC API - Delete a user

+

Description

+

Delete a user. Use this to delete a user that is registered on the security account database of the currently managed Virtual Hub. By deleting the user, that user will no long be able to connect to the Virtual Hub. You can use the SetUser API to set the user's security policy to deny access instead of deleting a user, set the user to be temporarily denied from logging in. To get the list of currently registered users, use the EnumUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteUser",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)User or group name
+
+

+

"EnumUser" RPC API - Get List of Users

+

Description

+

Get List of Users. Use this to get a list of users that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumUser",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "UserList": [
+      {
+        "Name_str": "name",
+        "GroupName_str": "groupname",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "AuthType_u32": 0,
+        "NumLogin_u32": 0,
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "DenyAccess_bool": false,
+        "IsTrafficFilled_bool": false,
+        "IsExpiresFilled_bool": false,
+        "Expires_dt": "2020-08-01T12:24:36.123",
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      },
+      {
+        "Name_str": "name",
+        "GroupName_str": "groupname",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "AuthType_u32": 0,
+        "NumLogin_u32": 0,
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "DenyAccess_bool": false,
+        "IsTrafficFilled_bool": false,
+        "IsExpiresFilled_bool": false,
+        "Expires_dt": "2020-08-01T12:24:36.123",
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      },
+      {
+        "Name_str": "name",
+        "GroupName_str": "groupname",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "AuthType_u32": 0,
+        "NumLogin_u32": 0,
+        "LastLoginTime_dt": "2020-08-01T12:24:36.123",
+        "DenyAccess_bool": false,
+        "IsTrafficFilled_bool": false,
+        "IsExpiresFilled_bool": false,
+        "Expires_dt": "2020-08-01T12:24:36.123",
+        "Ex.Recv.BroadcastBytes_u64": 0,
+        "Ex.Recv.BroadcastCount_u64": 0,
+        "Ex.Recv.UnicastBytes_u64": 0,
+        "Ex.Recv.UnicastCount_u64": 0,
+        "Ex.Send.BroadcastBytes_u64": 0,
+        "Ex.Send.BroadcastCount_u64": 0,
+        "Ex.Send.UnicastBytes_u64": 0,
+        "Ex.Send.UnicastCount_u64": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
UserListArray objectUser list
Name_strstring (ASCII)User name
GroupName_strstring (ASCII)Group name
Realname_utfstring (UTF8)Real name
Note_utfstring (UTF8)Note
AuthType_u32number (enum)Authentication method
Values:
0: Anonymous authentication
1: Password authentication
2: User certificate authentication
3: Root certificate which is issued by trusted Certificate Authority
4: Radius authentication
5: Windows NT authentication
NumLogin_u32number (uint32)Number of logins
LastLoginTime_dtDateLast login date and time
DenyAccess_boolbooleanAccess denied
IsTrafficFilled_boolbooleanFlag of whether the traffic variable is set
IsExpiresFilled_boolbooleanFlag of whether expiration date variable is set
Expires_dtDateExpiration date
Ex.Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Ex.Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Ex.Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Ex.Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Ex.Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Ex.Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Ex.Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Ex.Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
+
+

+

"CreateGroup" RPC API - Create Group

+

Description

+

Create Group. Use this to create a new group in the security account database of the currently managed Virtual Hub. You can register multiple users in a group. To register users in a group use the SetUser API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "CreateGroup",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)The group name
Realname_utfstring (UTF8)Optional real name (full name) of the group, allow using any Unicode characters
Note_utfstring (UTF8)Optional, specify a description of the group
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"SetGroup" RPC API - Set group settings

+

Description

+

Set group settings. Use this to set group settings that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetGroup",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)The group name
Realname_utfstring (UTF8)Optional real name (full name) of the group, allow using any Unicode characters
Note_utfstring (UTF8)Optional, specify a description of the group
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"GetGroup" RPC API - Get Group Setting (Sync mode)

+

Description

+

Get Group Setting (Sync mode). Use this to get the setting of a group that is registered on the security account database of the currently managed Virtual Hub. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetGroup",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Realname_utf": "realname",
+    "Note_utf": "note",
+    "Recv.BroadcastBytes_u64": 0,
+    "Recv.BroadcastCount_u64": 0,
+    "Recv.UnicastBytes_u64": 0,
+    "Recv.UnicastCount_u64": 0,
+    "Send.BroadcastBytes_u64": 0,
+    "Send.BroadcastCount_u64": 0,
+    "Send.UnicastBytes_u64": 0,
+    "Send.UnicastCount_u64": 0,
+    "UsePolicy_bool": false,
+    "policy:Access_bool": false,
+    "policy:DHCPFilter_bool": false,
+    "policy:DHCPNoServer_bool": false,
+    "policy:DHCPForce_bool": false,
+    "policy:NoBridge_bool": false,
+    "policy:NoRouting_bool": false,
+    "policy:CheckMac_bool": false,
+    "policy:CheckIP_bool": false,
+    "policy:ArpDhcpOnly_bool": false,
+    "policy:PrivacyFilter_bool": false,
+    "policy:NoServer_bool": false,
+    "policy:NoBroadcastLimiter_bool": false,
+    "policy:MonitorPort_bool": false,
+    "policy:MaxConnection_u32": 0,
+    "policy:TimeOut_u32": 0,
+    "policy:MaxMac_u32": 0,
+    "policy:MaxIP_u32": 0,
+    "policy:MaxUpload_u32": 0,
+    "policy:MaxDownload_u32": 0,
+    "policy:FixPassword_bool": false,
+    "policy:MultiLogins_u32": 0,
+    "policy:NoQoS_bool": false,
+    "policy:RSandRAFilter_bool": false,
+    "policy:RAFilter_bool": false,
+    "policy:DHCPv6Filter_bool": false,
+    "policy:DHCPv6NoServer_bool": false,
+    "policy:NoRoutingV6_bool": false,
+    "policy:CheckIPv6_bool": false,
+    "policy:NoServerV6_bool": false,
+    "policy:MaxIPv6_u32": 0,
+    "policy:NoSavePassword_bool": false,
+    "policy:AutoDisconnect_u32": 0,
+    "policy:FilterIPv4_bool": false,
+    "policy:FilterIPv6_bool": false,
+    "policy:FilterNonIP_bool": false,
+    "policy:NoIPv6DefaultRouterInRA_bool": false,
+    "policy:NoIPv6DefaultRouterInRAWhenIPv6_bool": false,
+    "policy:VLanId_u32": 0,
+    "policy:Ver3_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)The group name
Realname_utfstring (UTF8)Optional real name (full name) of the group, allow using any Unicode characters
Note_utfstring (UTF8)Optional, specify a description of the group
Recv.BroadcastBytes_u64number (uint64)Number of broadcast packets (Recv)
Recv.BroadcastCount_u64number (uint64)Broadcast bytes (Recv)
Recv.UnicastBytes_u64number (uint64)Unicast count (Recv)
Recv.UnicastCount_u64number (uint64)Unicast bytes (Recv)
Send.BroadcastBytes_u64number (uint64)Number of broadcast packets (Send)
Send.BroadcastCount_u64number (uint64)Broadcast bytes (Send)
Send.UnicastBytes_u64number (uint64)Unicast bytes (Send)
Send.UnicastCount_u64number (uint64)Unicast bytes (Send)
UsePolicy_boolbooleanThe flag whether to use security policy
policy:Access_boolbooleanSecurity policy: Allow Access. The users, which this policy value is true, have permission to make VPN connection to VPN Server.
policy:DHCPFilter_boolbooleanSecurity policy: Filter DHCP Packets (IPv4). All IPv4 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPNoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv4). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv4 addresses to DHCP clients.
policy:DHCPForce_boolbooleanSecurity policy: Enforce DHCP Allocated IP Addresses (IPv4). Computers in sessions that have this policy setting will only be able to use IPv4 addresses allocated by a DHCP server on the virtual network side.
policy:NoBridge_boolbooleanSecurity policy: Deny Bridge Operation. Bridge-mode connections are denied for user sessions that have this policy setting. Even in cases when the Ethernet Bridge is configured in the client side, communication will not be possible.
policy:NoRouting_boolbooleanSecurity policy: Deny Routing Operation (IPv4). IPv4 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckMac_boolbooleanSecurity policy: Deny MAC Addresses Duplication. The use of duplicating MAC addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:CheckIP_boolbooleanSecurity policy: Deny IP Address Duplication (IPv4). The use of duplicating IPv4 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:ArpDhcpOnly_boolbooleanSecurity policy: Deny Non-ARP / Non-DHCP / Non-ICMPv6 broadcasts. The sending or receiving of broadcast packets that are not ARP protocol, DHCP protocol, nor ICMPv6 on the virtual network will not be allowed for sessions with this policy setting.
policy:PrivacyFilter_boolbooleanSecurity policy: Privacy Filter Mode. All direct communication between sessions with the privacy filter mode policy setting will be filtered.
policy:NoServer_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv4). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv4.
policy:NoBroadcastLimiter_boolbooleanSecurity policy: Unlimited Number of Broadcasts. If a computer of a session with this policy setting sends broadcast packets of a number unusually larger than what would be considered normal on the virtual network, there will be no automatic limiting.
policy:MonitorPort_boolbooleanSecurity policy: Allow Monitoring Mode. Users with this policy setting will be granted to connect to the Virtual Hub in Monitoring Mode. Sessions in Monitoring Mode are able to monitor (tap) all packets flowing through the Virtual Hub.
policy:MaxConnection_u32number (uint32)Security policy: Maximum Number of TCP Connections. For sessions with this policy setting, this sets the maximum number of physical TCP connections consists in a physical VPN session.
policy:TimeOut_u32number (uint32)Security policy: Time-out Period. For sessions with this policy setting, this sets, in seconds, the time-out period to wait before disconnecting a session when communication trouble occurs between the VPN Client / VPN Server.
policy:MaxMac_u32number (uint32)Security policy: Maximum Number of MAC Addresses. For sessions with this policy setting, this limits the number of MAC addresses per session.
policy:MaxIP_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv4). For sessions with this policy setting, this specifies the number of IPv4 addresses that can be registered for a single session.
policy:MaxUpload_u32number (uint32)Security policy: Upload Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the inwards direction from outside to inside the Virtual Hub.
policy:MaxDownload_u32number (uint32)Security policy: Download Bandwidth. For sessions with this policy setting, this limits the traffic bandwidth that is in the outwards direction from inside the Virtual Hub to outside the Virtual Hub.
policy:FixPassword_boolbooleanSecurity policy: Deny Changing Password. The users which use password authentication with this policy setting are not allowed to change their own password from the VPN Client Manager or similar.
policy:MultiLogins_u32number (uint32)Security policy: Maximum Number of Multiple Logins. Users with this policy setting are unable to have more than this number of concurrent logins. Bridge Mode sessions are not subjects to this policy.
policy:NoQoS_boolbooleanSecurity policy: Deny VoIP / QoS Function. Users with this security policy are unable to use VoIP / QoS functions in VPN connection sessions.
policy:RSandRAFilter_boolbooleanSecurity policy: Filter RS / RA Packets (IPv6). All ICMPv6 packets which the message-type is 133 (Router Solicitation) or 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, an IPv6 client will be unable to use IPv6 address prefix auto detection and IPv6 default gateway auto detection.
policy:RAFilter_boolbooleanSecurity policy: Filter RA Packets (IPv6). All ICMPv6 packets which the message-type is 134 (Router Advertisement) in sessions defined this policy will be filtered. As a result, a malicious users will be unable to spread illegal IPv6 prefix or default gateway advertisements on the network.
policy:DHCPv6Filter_boolbooleanSecurity policy: Filter DHCP Packets (IPv6). All IPv6 DHCP packets in sessions defined this policy will be filtered.
policy:DHCPv6NoServer_boolbooleanSecurity policy: Disallow DHCP Server Operation (IPv6). Computers connected to sessions that have this policy setting will not be allowed to become a DHCP server and distribute IPv6 addresses to DHCP clients.
policy:NoRoutingV6_boolbooleanSecurity policy: Deny Routing Operation (IPv6). IPv6 routing will be denied for sessions that have this policy setting. Even in the case where the IP router is operating on the user client side, communication will not be possible.
policy:CheckIPv6_boolbooleanSecurity policy: Deny IP Address Duplication (IPv6). The use of duplicating IPv6 addresses that are in use by computers of different sessions cannot be used by sessions with this policy setting.
policy:NoServerV6_boolbooleanSecurity policy: Deny Operation as TCP/IP Server (IPv6). Computers of sessions with this policy setting can't listen and accept TCP/IP connections in IPv6.
policy:MaxIPv6_u32number (uint32)Security policy: Maximum Number of IP Addresses (IPv6). For sessions with this policy setting, this specifies the number of IPv6 addresses that can be registered for a single session.
policy:NoSavePassword_boolbooleanSecurity policy: Disallow Password Save in VPN Client. For users with this policy setting, when the user is using standard password authentication, the user will be unable to save the password in VPN Client. The user will be required to input passwords for every time to connect a VPN. This will improve the security. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:AutoDisconnect_u32number (uint32)Security policy: VPN Client Automatic Disconnect. For users with this policy setting, a user's VPN session will be disconnected automatically after the specific period will elapse. In this case no automatic re-connection will be performed. This can prevent a lot of inactive VPN Sessions. If this policy is enabled, VPN Client Version 2.0 will be denied to access.
policy:FilterIPv4_boolbooleanSecurity policy: Filter All IPv4 Packets. All IPv4 and ARP packets in sessions defined this policy will be filtered.
policy:FilterIPv6_boolbooleanSecurity policy: Filter All IPv6 Packets. All IPv6 packets in sessions defined this policy will be filtered.
policy:FilterNonIP_boolbooleanSecurity policy: Filter All Non-IP Packets. All non-IP packets in sessions defined this policy will be filtered. "Non-IP packet" mean a packet which is not IPv4, ARP nor IPv6. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets.
policy:NoIPv6DefaultRouterInRA_boolbooleanSecurity policy: No Default-Router on IPv6 RA. In all VPN Sessions defines this policy, any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:NoIPv6DefaultRouterInRAWhenIPv6_boolbooleanSecurity policy: No Default-Router on IPv6 RA (physical IPv6). In all VPN Sessions defines this policy (only when the physical communication protocol between VPN Client / VPN Bridge and VPN Server is IPv6), any IPv6 RA (Router Advertisement) packet with non-zero value in the router-lifetime will set to zero-value. This is effective to avoid the horrible behavior from the IPv6 routing confusion which is caused by the VPN client's attempts to use the remote-side IPv6 router as its local IPv6 router.
policy:VLanId_u32number (uint32)Security policy: VLAN ID (IEEE802.1Q). You can specify the VLAN ID on the security policy. All VPN Sessions defines this policy, all Ethernet packets toward the Virtual Hub from the user will be inserted a VLAN tag (IEEE 802.1Q) with the VLAN ID. The user can also receive only packets with a VLAN tag which has the same VLAN ID. (Receiving process removes the VLAN tag automatically.) Any Ethernet packets with any other VLAN IDs or non-VLAN packets will not be received. All VPN Sessions without this policy definition can send / receive any kinds of Ethernet packets regardless of VLAN tags, and VLAN tags are not inserted or removed automatically. Any tagged-VLAN packets via the Virtual Hub will be regarded as non-IP packets. Therefore, tagged-VLAN packets are not subjects for IPv4 / IPv6 security policies, access lists nor other IPv4 / IPv6 specific deep processing.
policy:Ver3_boolbooleanSecurity policy: Whether version 3.0 (must be true)
+
+

+

"DeleteGroup" RPC API - Delete User from Group

+

Description

+

Delete User from Group. Use this to delete a specified user from the group that is registered on the security account database of the currently managed Virtual Hub. By deleting a user from the group, that user becomes unassigned. To get the list of currently registered groups, use the EnumGroup API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteGroup",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)User or group name
+
+

+

"EnumGroup" RPC API - Get List of Groups

+

Description

+

Get List of Groups. Use this to get a list of groups that are registered on the security account database of the currently managed Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a member server on a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumGroup",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "GroupList": [
+      {
+        "Name_str": "name",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "NumUsers_u32": 0,
+        "DenyAccess_bool": false
+      },
+      {
+        "Name_str": "name",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "NumUsers_u32": 0,
+        "DenyAccess_bool": false
+      },
+      {
+        "Name_str": "name",
+        "Realname_utf": "realname",
+        "Note_utf": "note",
+        "NumUsers_u32": 0,
+        "DenyAccess_bool": false
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
GroupListArray objectGroup list
Name_strstring (ASCII)User name
Realname_utfstring (UTF8)Real name
Note_utfstring (UTF8)Note
NumUsers_u32number (uint32)Number of users
DenyAccess_boolbooleanAccess denied
+
+

+

"EnumSession" RPC API - Get List of Connected VPN Sessions

+

Description

+

Get List of Connected VPN Sessions. Use this to get a list of the sessions connected to the Virtual Hub currently being managed. In the list of sessions, the following information will be obtained for each connection: Session Name, Session Site, User Name, Source Host Name, TCP Connection, Transfer Bytes and Transfer Packets. If the currently connected VPN Server is a cluster controller and the currently managed Virtual Hub is a static Virtual Hub, you can get an all-linked-together list of all sessions connected to that Virtual Hub on all cluster members. In all other cases, only the list of sessions that are actually connected to the currently managed VPN Server will be obtained.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumSession",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "SessionList": [
+      {
+        "Name_str": "name",
+        "RemoteSession_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "Username_str": "username",
+        "ClientIP_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "MaxNumTcp_u32": 0,
+        "CurrentNumTcp_u32": 0,
+        "PacketSize_u64": 0,
+        "PacketNum_u64": 0,
+        "LinkMode_bool": false,
+        "SecureNATMode_bool": false,
+        "BridgeMode_bool": false,
+        "Layer3Mode_bool": false,
+        "Client_BridgeMode_bool": false,
+        "Client_MonitorMode_bool": false,
+        "VLanId_u32": 0,
+        "UniqueId_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "Name_str": "name",
+        "RemoteSession_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "Username_str": "username",
+        "ClientIP_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "MaxNumTcp_u32": 0,
+        "CurrentNumTcp_u32": 0,
+        "PacketSize_u64": 0,
+        "PacketNum_u64": 0,
+        "LinkMode_bool": false,
+        "SecureNATMode_bool": false,
+        "BridgeMode_bool": false,
+        "Layer3Mode_bool": false,
+        "Client_BridgeMode_bool": false,
+        "Client_MonitorMode_bool": false,
+        "VLanId_u32": 0,
+        "UniqueId_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "Name_str": "name",
+        "RemoteSession_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "Username_str": "username",
+        "ClientIP_ip": "192.168.0.1",
+        "Hostname_str": "hostname",
+        "MaxNumTcp_u32": 0,
+        "CurrentNumTcp_u32": 0,
+        "PacketSize_u64": 0,
+        "PacketNum_u64": 0,
+        "LinkMode_bool": false,
+        "SecureNATMode_bool": false,
+        "BridgeMode_bool": false,
+        "Layer3Mode_bool": false,
+        "Client_BridgeMode_bool": false,
+        "Client_MonitorMode_bool": false,
+        "VLanId_u32": 0,
+        "UniqueId_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
SessionListArray objectVPN sessions list
Name_strstring (ASCII)Session name
RemoteSession_boolbooleanRemote session
RemoteHostname_strstring (ASCII)Remote server name
Username_strstring (ASCII)User name
ClientIP_ipstring (IP address)IP address
Hostname_strstring (ASCII)Host name
MaxNumTcp_u32number (uint32)Maximum number of underlying TCP connections
CurrentNumTcp_u32number (uint32)Number of current underlying TCP connections
PacketSize_u64number (uint64)Packet size transmitted
PacketNum_u64number (uint64)Number of packets transmitted
LinkMode_boolbooleanIs a Cascade VPN session
SecureNATMode_boolbooleanIs a SecureNAT VPN session
BridgeMode_boolbooleanIs the VPN session for Local Bridge
Layer3Mode_boolbooleanIs a Layer-3 Switch VPN session
Client_BridgeMode_boolbooleanIs in Bridge Mode
Client_MonitorMode_boolbooleanIs in Monitor Mode
VLanId_u32number (uint32)VLAN ID
UniqueId_binstring (Base64 binary)Unique ID of the VPN Session
CreatedTime_dtDateCreation date and time
LastCommTime_dtDateLast communication date and time
+
+

+

"GetSessionStatus" RPC API - Get Session Status

+

Description

+

Get Session Status. Use this to specify a session currently connected to the currently managed Virtual Hub and get the session information. The session status includes the following: source host name and user name, version information, time information, number of TCP connections, communication parameters, session key, statistical information on data transferred, and other client and server information. To get the list of currently connected sessions, use the EnumSession API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSessionStatus",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name",
+    "Username_str": "username",
+    "RealUsername_str": "realusername",
+    "GroupName_str": "groupname",
+    "LinkMode_bool": false,
+    "Client_Ip_Address_ip": "192.168.0.1",
+    "SessionStatus_ClientHostName_str": "clienthostname",
+    "Active_bool": false,
+    "Connected_bool": false,
+    "SessionStatus_u32": 0,
+    "ServerName_str": "servername",
+    "ServerPort_u32": 0,
+    "ServerProductName_str": "serverproductname",
+    "ServerProductVer_u32": 0,
+    "ServerProductBuild_u32": 0,
+    "StartTime_dt": "2020-08-01T12:24:36.123",
+    "FirstConnectionEstablisiedTime_dt": "2020-08-01T12:24:36.123",
+    "CurrentConnectionEstablishTime_dt": "2020-08-01T12:24:36.123",
+    "NumConnectionsEatablished_u32": 0,
+    "HalfConnection_bool": false,
+    "QoS_bool": false,
+    "MaxTcpConnections_u32": 0,
+    "NumTcpConnections_u32": 0,
+    "NumTcpConnectionsUpload_u32": 0,
+    "NumTcpConnectionsDownload_u32": 0,
+    "UseEncrypt_bool": false,
+    "CipherName_str": "ciphername",
+    "UseCompress_bool": false,
+    "IsRUDPSession_bool": false,
+    "UnderlayProtocol_str": "underlayprotocol",
+    "IsUdpAccelerationEnabled_bool": false,
+    "IsUsingUdpAcceleration_bool": false,
+    "SessionName_str": "sessionname",
+    "ConnectionName_str": "connectionname",
+    "SessionKey_bin": "SGVsbG8gV29ybGQ=",
+    "TotalSendSize_u64": 0,
+    "TotalRecvSize_u64": 0,
+    "TotalSendSizeReal_u64": 0,
+    "TotalRecvSizeReal_u64": 0,
+    "IsBridgeMode_bool": false,
+    "IsMonitorMode_bool": false,
+    "VLanId_u32": 0,
+    "ClientProductName_str": "clientproductname",
+    "ClientProductVer_u32": 0,
+    "ClientProductBuild_u32": 0,
+    "ClientOsName_str": "clientosname",
+    "ClientOsVer_str": "clientosver",
+    "ClientOsProductId_str": "clientosproductid",
+    "ClientHostname_str": "clienthostname",
+    "UniqueId_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)VPN session name
Username_strstring (ASCII)User name
RealUsername_strstring (ASCII)Real user name which was used for the authentication
GroupName_strstring (ASCII)Group name
LinkMode_boolbooleanIs Cascade Session
Client_Ip_Address_ipstring (IP address)Client IP address
SessionStatus_ClientHostName_strstring (ASCII)Client host name
Active_boolbooleanOperation flag
Connected_boolbooleanConnected flag
SessionStatus_u32number (enum)State of the client session
Values:
0: Connecting
1: Negotiating
2: During user authentication
3: Connection complete
4: Wait to retry
5: Idle state
ServerName_strstring (ASCII)Server name
ServerPort_u32number (uint32)Port number of the server
ServerProductName_strstring (ASCII)Server product name
ServerProductVer_u32number (uint32)Server product version
ServerProductBuild_u32number (uint32)Server product build number
StartTime_dtDateConnection start time
FirstConnectionEstablisiedTime_dtDateConnection completion time of the first connection
CurrentConnectionEstablishTime_dtDateConnection completion time of this connection
NumConnectionsEatablished_u32number (uint32)Number of connections have been established so far
HalfConnection_boolbooleanHalf-connection
QoS_boolbooleanVoIP / QoS
MaxTcpConnections_u32number (uint32)Maximum number of the underlying TCP connections
NumTcpConnections_u32number (uint32)Number of current underlying TCP connections
NumTcpConnectionsUpload_u32number (uint32)Number of inbound underlying connections
NumTcpConnectionsDownload_u32number (uint32)Number of outbound underlying connections
UseEncrypt_boolbooleanUse of encryption
CipherName_strstring (ASCII)Cipher algorithm name
UseCompress_boolbooleanUse of compression
IsRUDPSession_boolbooleanIs R-UDP session
UnderlayProtocol_strstring (ASCII)Physical underlying communication protocol
IsUdpAccelerationEnabled_boolbooleanThe UDP acceleration is enabled
IsUsingUdpAcceleration_boolbooleanUsing the UDP acceleration function
SessionName_strstring (ASCII)VPN session name
ConnectionName_strstring (ASCII)Connection name
SessionKey_binstring (Base64 binary)Session key
TotalSendSize_u64number (uint64)Total transmitted data size
TotalRecvSize_u64number (uint64)Total received data size
TotalSendSizeReal_u64number (uint64)Total transmitted data size (no compression)
TotalRecvSizeReal_u64number (uint64)Total received data size (no compression)
IsBridgeMode_boolbooleanIs Bridge Mode
IsMonitorMode_boolbooleanIs Monitor mode
VLanId_u32number (uint32)VLAN ID
ClientProductName_strstring (ASCII)Client product name
ClientProductVer_u32number (uint32)Client version
ClientProductBuild_u32number (uint32)Client build number
ClientOsName_strstring (ASCII)Client OS name
ClientOsVer_strstring (ASCII)Client OS version
ClientOsProductId_strstring (ASCII)Client OS Product ID
ClientHostname_strstring (ASCII)Client host name
UniqueId_binstring (Base64 binary)Unique ID
+
+

+

"DeleteSession" RPC API - Disconnect Session

+

Description

+

Disconnect Session. Use this to specify a session currently connected to the currently managed Virtual Hub and forcefully disconnect that session using manager privileges. Note that when communication is disconnected by settings on the source client side and the automatically reconnect option is enabled, it is possible that the client will reconnect. To get the list of currently connected sessions, use the EnumSession API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteSession",
+  "params": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Name_strstring (ASCII)Session name
+
+

+

"EnumMacTable" RPC API - Get the MAC Address Table Database

+

Description

+

Get the MAC Address Table Database. Use this to get the MAC address table database that is held by the currently managed Virtual Hub. The MAC address table database is a table that the Virtual Hub requires to perform the action of switching Ethernet frames and the Virtual Hub decides the sorting destination session of each Ethernet frame based on the MAC address table database. The MAC address database is built by the Virtual Hub automatically analyzing the contents of the communication.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumMacTable",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "MacTable": [
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "VlanId_u32": 0
+      },
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "VlanId_u32": 0
+      },
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname",
+        "VlanId_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
MacTableArray objectMAC table
Key_u32number (uint32)Key ID
SessionName_strstring (ASCII)Session name
MacAddress_binstring (Base64 binary)MAC address
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateUpdating date
RemoteItem_boolbooleanRemote items
RemoteHostname_strstring (ASCII)Remote host name
VlanId_u32number (uint32)VLAN ID
+
+

+

"DeleteMacTable" RPC API - Delete MAC Address Table Entry

+

Description

+

Delete MAC Address Table Entry. Use this API to operate the MAC address table database held by the currently managed Virtual Hub and delete a specified MAC address table entry from the database. To get the contents of the current MAC address table database use the EnumMacTable API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteMacTable",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
+
+

+

"EnumIpTable" RPC API - Get the IP Address Table Database

+

Description

+

Get the IP Address Table Database. Use this to get the IP address table database that is held by the currently managed Virtual Hub. The IP address table database is a table that is automatically generated by analyzing the contents of communication so that the Virtual Hub can always know which session is using which IP address and it is frequently used by the engine that applies the Virtual Hub security policy. By specifying the session name you can get the IP address table entry that has been associated with that session.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumIpTable",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "IpTable": [
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "IpAddress_ip": "192.168.0.1",
+        "DhcpAllocated_bool": false,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname"
+      },
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "IpAddress_ip": "192.168.0.1",
+        "DhcpAllocated_bool": false,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname"
+      },
+      {
+        "Key_u32": 0,
+        "SessionName_str": "sessionname",
+        "IpAddress_ip": "192.168.0.1",
+        "DhcpAllocated_bool": false,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123",
+        "RemoteItem_bool": false,
+        "RemoteHostname_str": "remotehostname"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
IpTableArray objectMAC table
Key_u32number (uint32)Key ID
SessionName_strstring (ASCII)Session name
IpAddress_ipstring (IP address)IP address
DhcpAllocated_boolbooleanAssigned by the DHCP
CreatedTime_dtDateCreation date and time
UpdatedTime_dtDateUpdating date
RemoteItem_boolbooleanRemote items
RemoteHostname_strstring (ASCII)Remote host name
+
+

+

"DeleteIpTable" RPC API - Delete IP Address Table Entry

+

Description

+

Delete IP Address Table Entry. Use this API to operate the IP address table database held by the currently managed Virtual Hub and delete a specified IP address table entry from the database. To get the contents of the current IP address table database use the EnumIpTable API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteIpTable",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
+
+

+

"SetKeep" RPC API - Set the Keep Alive Internet Connection Function

+

Description

+

Set the Keep Alive Internet Connection Function. Use this to set the destination host name etc. of the Keep Alive Internet Connection Function. For network connection environments where connections will automatically be disconnected where there are periods of no communication that are longer than a set period, by using the Keep Alive Internet Connection Function, it is possible to keep alive the Internet connection by sending packets to a nominated server on the Internet at set intervals. When using this API, you can specify the following: Host Name, Port Number, Packet Send Interval, and Protocol. Packets sent to keep alive the Internet connection will have random content and personal information that could identify a computer or user is not sent. You can use the SetKeep API to enable/disable the Keep Alive Internet Connection Function. To execute this API on a VPN Server or VPN Bridge, you must have administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetKeep",
+  "params": {
+    "UseKeepConnect_bool": false,
+    "KeepConnectHost_str": "keepconnecthost",
+    "KeepConnectPort_u32": 0,
+    "KeepConnectProtocol_u32": 0,
+    "KeepConnectInterval_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "UseKeepConnect_bool": false,
+    "KeepConnectHost_str": "keepconnecthost",
+    "KeepConnectPort_u32": 0,
+    "KeepConnectProtocol_u32": 0,
+    "KeepConnectInterval_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
UseKeepConnect_boolbooleanThe flag to enable keep-alive to the Internet
KeepConnectHost_strstring (ASCII)Specify the host name or IP address of the destination
KeepConnectPort_u32number (uint32)Specify the port number of the destination
KeepConnectProtocol_u32number (enum)Protocol type
Values:
0: TCP
1: UDP
KeepConnectInterval_u32number (uint32)Interval Between Packets Sends (Seconds)
+
+

+

"GetKeep" RPC API - Get the Keep Alive Internet Connection Function

+

Description

+

Get the Keep Alive Internet Connection Function. Use this to get the current setting contents of the Keep Alive Internet Connection Function. In addition to the destination's Host Name, Port Number, Packet Send Interval and Protocol, you can obtain the current enabled/disabled status of the Keep Alive Internet Connection Function.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetKeep",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "UseKeepConnect_bool": false,
+    "KeepConnectHost_str": "keepconnecthost",
+    "KeepConnectPort_u32": 0,
+    "KeepConnectProtocol_u32": 0,
+    "KeepConnectInterval_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
UseKeepConnect_boolbooleanThe flag to enable keep-alive to the Internet
KeepConnectHost_strstring (ASCII)Specify the host name or IP address of the destination
KeepConnectPort_u32number (uint32)Specify the port number of the destination
KeepConnectProtocol_u32number (enum)Protocol type
Values:
0: TCP
1: UDP
KeepConnectInterval_u32number (uint32)Interval Between Packets Sends (Seconds)
+
+

+

"EnableSecureNAT" RPC API - Enable the Virtual NAT and DHCP Server Function (SecureNAT Function)

+

Description

+

Enable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to enable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub and begin its operation. Before executing this API, you must first check the setting contents of the current Virtual NAT function and DHCP Server function using the SetSecureNATOption API and GetSecureNATOption API. By enabling the SecureNAT function, you can virtually operate a NAT router (IP masquerade) and the DHCP Server function on a virtual network on the Virtual Hub. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrator's permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnableSecureNAT",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
+
+

+

"DisableSecureNAT" RPC API - Disable the Virtual NAT and DHCP Server Function (SecureNAT Function)

+

Description

+

Disable the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to disable the Virtual NAT and DHCP Server function (SecureNAT Function) on the currently managed Virtual Hub. By executing this API the Virtual NAT function immediately stops operating and the Virtual DHCP Server function deletes the DHCP lease database and stops the service. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DisableSecureNAT",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
+
+

+

"SetSecureNATOption" RPC API - Change Settings of SecureNAT Function

+

Description

+

Change Settings of SecureNAT Function. Use this to change and save the virtual host network interface settings, virtual NAT function settings and virtual DHCP server settings of the Virtual NAT and DHCP Server function (SecureNAT function) on the currently managed Virtual Hub. The SecureNAT function holds one virtual network adapter on the L2 segment inside the Virtual Hub and it has been assigned a MAC address and an IP address. By doing this, another host connected to the same L2 segment is able to communicate with the SecureNAT virtual host as if it is an actual IP host existing on the network. [Warning about SecureNAT Function] The SecureNAT function is recommended only for system administrators and people with a detailed knowledge of networks. If you use the SecureNAT function correctly, it is possible to achieve a safe form of remote access via a VPN. However when used in the wrong way, it can put the entire network in danger. Anyone who does not have a thorough knowledge of networks and anyone who does not have the network administrators permission must not enable the SecureNAT function. For a detailed explanation of the SecureNAT function, please refer to the VPN Server's manual and online documentation. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetSecureNATOption",
+  "params": {
+    "RpcHubName_str": "rpchubname",
+    "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+    "Ip_ip": "192.168.0.1",
+    "Mask_ip": "255.255.255.255",
+    "UseNat_bool": false,
+    "Mtu_u32": 0,
+    "NatTcpTimeout_u32": 0,
+    "NatUdpTimeout_u32": 0,
+    "UseDhcp_bool": false,
+    "DhcpLeaseIPStart_ip": "192.168.0.1",
+    "DhcpLeaseIPEnd_ip": "192.168.0.1",
+    "DhcpSubnetMask_ip": "255.255.255.255",
+    "DhcpExpireTimeSpan_u32": 0,
+    "DhcpGatewayAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress2_ip": "192.168.0.1",
+    "DhcpDomainName_str": "dhcpdomainname",
+    "SaveLog_bool": false,
+    "ApplyDhcpPushRoutes_bool": false,
+    "DhcpPushRoutes_str": "dhcppushroutes"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "RpcHubName_str": "rpchubname",
+    "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+    "Ip_ip": "192.168.0.1",
+    "Mask_ip": "255.255.255.255",
+    "UseNat_bool": false,
+    "Mtu_u32": 0,
+    "NatTcpTimeout_u32": 0,
+    "NatUdpTimeout_u32": 0,
+    "UseDhcp_bool": false,
+    "DhcpLeaseIPStart_ip": "192.168.0.1",
+    "DhcpLeaseIPEnd_ip": "192.168.0.1",
+    "DhcpSubnetMask_ip": "255.255.255.255",
+    "DhcpExpireTimeSpan_u32": 0,
+    "DhcpGatewayAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress2_ip": "192.168.0.1",
+    "DhcpDomainName_str": "dhcpdomainname",
+    "SaveLog_bool": false,
+    "ApplyDhcpPushRoutes_bool": false,
+    "DhcpPushRoutes_str": "dhcppushroutes"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
RpcHubName_strstring (ASCII)Target Virtual HUB name
MacAddress_binstring (Base64 binary)MAC address
Ip_ipstring (IP address)IP address
Mask_ipstring (IP address)Subnet mask
UseNat_boolbooleanUse flag of the Virtual NAT function
Mtu_u32number (uint32)MTU value (Standard: 1500)
NatTcpTimeout_u32number (uint32)NAT TCP timeout in seconds
NatUdpTimeout_u32number (uint32)NAT UDP timeout in seconds
UseDhcp_boolbooleanUsing flag of DHCP function
DhcpLeaseIPStart_ipstring (IP address)Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10)
DhcpLeaseIPEnd_ipstring (IP address)Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200)
DhcpSubnetMask_ipstring (IP address)Specify the subnet mask to be specified for the client. (Example: 255.255.255.0)
DhcpExpireTimeSpan_u32number (uint32)Specify the expiration date in second units for leasing an IP address to a client.
DhcpGatewayAddress_ipstring (IP address)Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway.
DhcpDnsServerAddress_ipstring (IP address)Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.
DhcpDnsServerAddress2_ipstring (IP address)Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.
DhcpDomainName_strstring (ASCII)Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name.
SaveLog_boolbooleanSpecify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting.
ApplyDhcpPushRoutes_boolbooleanThe flag to enable the DhcpPushRoutes_str field.
DhcpPushRoutes_strstring (ASCII)Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes.
+
+

+

"GetSecureNATOption" RPC API - Get Settings of SecureNAT Function

+

Description

+

Get Settings of SecureNAT Function. This API get the registered settings for the SecureNAT function which is set by the SetSecureNATOption API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSecureNATOption",
+  "params": {
+    "RpcHubName_str": "rpchubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "RpcHubName_str": "rpchubname",
+    "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+    "Ip_ip": "192.168.0.1",
+    "Mask_ip": "255.255.255.255",
+    "UseNat_bool": false,
+    "Mtu_u32": 0,
+    "NatTcpTimeout_u32": 0,
+    "NatUdpTimeout_u32": 0,
+    "UseDhcp_bool": false,
+    "DhcpLeaseIPStart_ip": "192.168.0.1",
+    "DhcpLeaseIPEnd_ip": "192.168.0.1",
+    "DhcpSubnetMask_ip": "255.255.255.255",
+    "DhcpExpireTimeSpan_u32": 0,
+    "DhcpGatewayAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress_ip": "192.168.0.1",
+    "DhcpDnsServerAddress2_ip": "192.168.0.1",
+    "DhcpDomainName_str": "dhcpdomainname",
+    "SaveLog_bool": false,
+    "ApplyDhcpPushRoutes_bool": false,
+    "DhcpPushRoutes_str": "dhcppushroutes"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
RpcHubName_strstring (ASCII)Target Virtual HUB name
MacAddress_binstring (Base64 binary)MAC address
Ip_ipstring (IP address)IP address
Mask_ipstring (IP address)Subnet mask
UseNat_boolbooleanUse flag of the Virtual NAT function
Mtu_u32number (uint32)MTU value (Standard: 1500)
NatTcpTimeout_u32number (uint32)NAT TCP timeout in seconds
NatUdpTimeout_u32number (uint32)NAT UDP timeout in seconds
UseDhcp_boolbooleanUsing flag of DHCP function
DhcpLeaseIPStart_ipstring (IP address)Specify the start point of the address band to be distributed to the client. (Example: 192.168.30.10)
DhcpLeaseIPEnd_ipstring (IP address)Specify the end point of the address band to be distributed to the client. (Example: 192.168.30.200)
DhcpSubnetMask_ipstring (IP address)Specify the subnet mask to be specified for the client. (Example: 255.255.255.0)
DhcpExpireTimeSpan_u32number (uint32)Specify the expiration date in second units for leasing an IP address to a client.
DhcpGatewayAddress_ipstring (IP address)Specify the IP address of the default gateway to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify 0 or none, then the client will not be notified of the default gateway.
DhcpDnsServerAddress_ipstring (IP address)Specify the IP address of the primary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.
DhcpDnsServerAddress2_ipstring (IP address)Specify the IP address of the secondary DNS Server to be notified to the client. You can specify a SecureNAT Virtual Host IP address for this when the SecureNAT Function's Virtual NAT Function has been enabled and is being used also. If you specify empty, then the client will not be notified of the DNS Server address.
DhcpDomainName_strstring (ASCII)Specify the domain name to be notified to the client. If you specify none, then the client will not be notified of the domain name.
SaveLog_boolbooleanSpecify whether or not to save the Virtual DHCP Server operation in the Virtual Hub security log. Specify true to save it. This value is interlinked with the Virtual NAT Function log save setting.
ApplyDhcpPushRoutes_boolbooleanThe flag to enable the DhcpPushRoutes_str field.
DhcpPushRoutes_strstring (ASCII)Specify the static routing table to push. Example: "192.168.5.0/255.255.255.0/192.168.4.254, 10.0.0.0/255.0.0.0/192.168.4.253" Split multiple entries (maximum: 64 entries) by comma or space characters. Each entry must be specified in the "IP network address/subnet mask/gateway IP address" format. This Virtual DHCP Server can push the classless static routes (RFC 3442) with DHCP reply messages to VPN clients. Whether or not a VPN client can recognize the classless static routes (RFC 3442) depends on the target VPN client software. SoftEther VPN Client and OpenVPN Client are supporting the classless static routes. On L2TP/IPsec and MS-SSTP protocols, the compatibility depends on the implementation of the client software. You can realize the split tunneling if you clear the default gateway field on the Virtual DHCP Server options. On the client side, L2TP/IPsec and MS-SSTP clients need to be configured not to set up the default gateway for the split tunneling usage. You can also push the classless static routes (RFC 3442) by your existing external DHCP server. In that case, disable the Virtual DHCP Server function on SecureNAT, and you need not to set up the classless routes on this API. See the RFC 3442 to understand the classless routes.
+
+

+

"EnumNAT" RPC API - Get Virtual NAT Function Session Table of SecureNAT Function

+

Description

+

Get Virtual NAT Function Session Table of SecureNAT Function. Use this to get the table of TCP and UDP sessions currently communicating via the Virtual NAT (NAT table) in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumNAT",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "NatTable": [
+      {
+        "Id_u32": 0,
+        "Protocol_u32": 0,
+        "SrcIp_ip": "192.168.0.1",
+        "SrcHost_str": "srchost",
+        "SrcPort_u32": 0,
+        "DestIp_ip": "192.168.0.1",
+        "DestHost_str": "desthost",
+        "DestPort_u32": 0,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "SendSize_u64": 0,
+        "RecvSize_u64": 0,
+        "TcpStatus_u32": 0
+      },
+      {
+        "Id_u32": 0,
+        "Protocol_u32": 0,
+        "SrcIp_ip": "192.168.0.1",
+        "SrcHost_str": "srchost",
+        "SrcPort_u32": 0,
+        "DestIp_ip": "192.168.0.1",
+        "DestHost_str": "desthost",
+        "DestPort_u32": 0,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "SendSize_u64": 0,
+        "RecvSize_u64": 0,
+        "TcpStatus_u32": 0
+      },
+      {
+        "Id_u32": 0,
+        "Protocol_u32": 0,
+        "SrcIp_ip": "192.168.0.1",
+        "SrcHost_str": "srchost",
+        "SrcPort_u32": 0,
+        "DestIp_ip": "192.168.0.1",
+        "DestHost_str": "desthost",
+        "DestPort_u32": 0,
+        "CreatedTime_dt": "2020-08-01T12:24:36.123",
+        "LastCommTime_dt": "2020-08-01T12:24:36.123",
+        "SendSize_u64": 0,
+        "RecvSize_u64": 0,
+        "TcpStatus_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual Hub Name
NatTableArray objectNAT item
Id_u32number (uint32)ID
Protocol_u32number (enum)Protocol
Values:
0: TCP
1: UDP
2: DNS
3: ICMP
SrcIp_ipstring (IP address)Source IP address
SrcHost_strstring (ASCII)Source host name
SrcPort_u32number (uint32)Source port number
DestIp_ipstring (IP address)Destination IP address
DestHost_strstring (ASCII)Destination host name
DestPort_u32number (uint32)Destination port number
CreatedTime_dtDateConnection time
LastCommTime_dtDateLast communication time
SendSize_u64number (uint64)Transmission size
RecvSize_u64number (uint64)Receive size
TcpStatus_u32number (enum)TCP state
Values:
0: Connecting
1: Send the RST (Connection failure or disconnected)
2: Connection complete
3: Connection established
4: Wait for socket disconnection
+
+

+

"EnumDHCP" RPC API - Get Virtual DHCP Server Function Lease Table of SecureNAT Function

+

Description

+

Get Virtual DHCP Server Function Lease Table of SecureNAT Function. Use this to get the lease table of IP addresses, held by the Virtual DHCP Server, that are assigned to clients in cases when the Virtual NAT function is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumDHCP",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "DhcpTable": [
+      {
+        "Id_u32": 0,
+        "LeasedTime_dt": "2020-08-01T12:24:36.123",
+        "ExpireTime_dt": "2020-08-01T12:24:36.123",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "IpAddress_ip": "192.168.0.1",
+        "Mask_u32": 0,
+        "Hostname_str": "hostname"
+      },
+      {
+        "Id_u32": 0,
+        "LeasedTime_dt": "2020-08-01T12:24:36.123",
+        "ExpireTime_dt": "2020-08-01T12:24:36.123",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "IpAddress_ip": "192.168.0.1",
+        "Mask_u32": 0,
+        "Hostname_str": "hostname"
+      },
+      {
+        "Id_u32": 0,
+        "LeasedTime_dt": "2020-08-01T12:24:36.123",
+        "ExpireTime_dt": "2020-08-01T12:24:36.123",
+        "MacAddress_bin": "SGVsbG8gV29ybGQ=",
+        "IpAddress_ip": "192.168.0.1",
+        "Mask_u32": 0,
+        "Hostname_str": "hostname"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual Hub Name
DhcpTableArray objectDHCP Item
Id_u32number (uint32)ID
LeasedTime_dtDateLease time
ExpireTime_dtDateExpiration date
MacAddress_binstring (Base64 binary)MAC address
IpAddress_ipstring (IP address)IP address
Mask_u32number (uint32)Subnet mask
Hostname_strstring (ASCII)Host name
+
+

+

"GetSecureNATStatus" RPC API - Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function)

+

Description

+

Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNAT Function). Use this to get the operating status of the Virtual NAT and DHCP Server function (SecureNAT Function) when it is operating on the currently managed Virtual Hub. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSecureNATStatus",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "NumTcpSessions_u32": 0,
+    "NumUdpSessions_u32": 0,
+    "NumIcmpSessions_u32": 0,
+    "NumDnsSessions_u32": 0,
+    "NumDhcpClients_u32": 0,
+    "IsKernelMode_bool": false,
+    "IsRawIpMode_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual Hub Name
NumTcpSessions_u32number (uint32)Number of TCP sessions
NumUdpSessions_u32number (uint32)Ntmber of UDP sessions
NumIcmpSessions_u32number (uint32)Nymber of ICMP sessions
NumDnsSessions_u32number (uint32)Number of DNS sessions
NumDhcpClients_u32number (uint32)Number of DHCP clients
IsKernelMode_boolbooleanWhether the NAT is operating in the Kernel Mode
IsRawIpMode_boolbooleanWhether the NAT is operating in the Raw IP Mode
+
+

+

"EnumEthernet" RPC API - Get List of Network Adapters Usable as Local Bridge

+

Description

+

Get List of Network Adapters Usable as Local Bridge. Use this to get a list of Ethernet devices (network adapters) that can be used as a bridge destination device as part of a Local Bridge connection. If possible, network connection name is displayed. You can use a device displayed here by using the AddLocalBridge API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumEthernet",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "EthList": [
+      {
+        "DeviceName_str": "devicename",
+        "NetworkConnectionName_utf": "networkconnectionname"
+      },
+      {
+        "DeviceName_str": "devicename",
+        "NetworkConnectionName_utf": "networkconnectionname"
+      },
+      {
+        "DeviceName_str": "devicename",
+        "NetworkConnectionName_utf": "networkconnectionname"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
EthListArray objectEthernet Network Adapters list
DeviceName_strstring (ASCII)Device name
NetworkConnectionName_utfstring (UTF8)Network connection name (description)
+
+

+

"AddLocalBridge" RPC API - Create Local Bridge Connection

+

Description

+

Create Local Bridge Connection. Use this to create a new Local Bridge connection on the VPN Server. By using a Local Bridge, you can configure a Layer 2 bridge connection between a Virtual Hub operating on this VPN server and a physical Ethernet Device (Network Adapter). You can create a tap device (virtual network interface) on the system and connect a bridge between Virtual Hubs (the tap device is only supported by Linux versions). It is possible to establish a bridge to an operating network adapter of your choice for the bridge destination Ethernet device (network adapter), but in high load environments, we recommend you prepare a network adapter dedicated to serve as a bridge. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddLocalBridge",
+  "params": {
+    "DeviceName_str": "devicename",
+    "HubNameLB_str": "hubnamelb"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "DeviceName_str": "devicename",
+    "HubNameLB_str": "hubnamelb",
+    "Online_bool": false,
+    "Active_bool": false,
+    "TapMode_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
DeviceName_strstring (ASCII)Physical Ethernet device name
HubNameLB_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
Active_boolbooleanRunning flag
TapMode_boolbooleanSpecify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).
+
+

+

"DeleteLocalBridge" RPC API - Delete Local Bridge Connection

+

Description

+

Delete Local Bridge Connection. Use this to delete an existing Local Bridge connection. To get a list of current Local Bridge connections use the EnumLocalBridge API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteLocalBridge",
+  "params": {
+    "DeviceName_str": "devicename",
+    "HubNameLB_str": "hubnamelb"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "DeviceName_str": "devicename",
+    "HubNameLB_str": "hubnamelb",
+    "Online_bool": false,
+    "Active_bool": false,
+    "TapMode_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
DeviceName_strstring (ASCII)Physical Ethernet device name
HubNameLB_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
Active_boolbooleanRunning flag
TapMode_boolbooleanSpecify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).
+
+

+

"EnumLocalBridge" RPC API - Get List of Local Bridge Connection

+

Description

+

Get List of Local Bridge Connection. Use this to get a list of the currently defined Local Bridge connections. You can get the Local Bridge connection Virtual Hub name and the bridge destination Ethernet device (network adapter) name or tap device name, as well as the operating status.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumLocalBridge",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "LocalBridgeList": [
+      {
+        "DeviceName_str": "devicename",
+        "HubNameLB_str": "hubnamelb",
+        "Online_bool": false,
+        "Active_bool": false,
+        "TapMode_bool": false
+      },
+      {
+        "DeviceName_str": "devicename",
+        "HubNameLB_str": "hubnamelb",
+        "Online_bool": false,
+        "Active_bool": false,
+        "TapMode_bool": false
+      },
+      {
+        "DeviceName_str": "devicename",
+        "HubNameLB_str": "hubnamelb",
+        "Online_bool": false,
+        "Active_bool": false,
+        "TapMode_bool": false
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
LocalBridgeListArray objectLocal Bridge list
DeviceName_strstring (ASCII)Physical Ethernet device name
HubNameLB_strstring (ASCII)The Virtual Hub name
Online_boolbooleanOnline flag
Active_boolbooleanRunning flag
TapMode_boolbooleanSpecify true if you are using a tap device rather than a network adapter for the bridge destination (only supported for Linux versions).
+
+

+

"GetBridgeSupport" RPC API - Get whether the localbridge function is supported on the current system

+

Description

+

Get whether the localbridge function is supported on the current system.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetBridgeSupport",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IsBridgeSupportedOs_bool": false,
+    "IsWinPcapNeeded_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IsBridgeSupportedOs_boolbooleanWhether the OS supports the Local Bridge function
IsWinPcapNeeded_boolbooleanWhether WinPcap is necessary to install
+
+

+

"RebootServer" RPC API - Reboot VPN Server Service

+

Description

+

Reboot VPN Server Service. Use this to restart the VPN Server service. When you restart the VPN Server, all currently connected sessions and TCP connections will be disconnected and no new connections will be accepted until the restart process has completed. By using this API, only the VPN Server service program will be restarted and the physical computer that VPN Server is operating on does not restart. This management session will also be disconnected, so you will need to reconnect to continue management. Also, by specifying the "IntValue" parameter to "1", the contents of the configuration file (.config) held by the current VPN Server will be initialized. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "RebootServer",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"GetCaps" RPC API - Get List of Server Functions / Capability

+

Description

+

Get List of Server Functions / Capability. Use this get a list of functions and capability of the VPN Server currently connected and being managed. The function and capability of VPN Servers are different depending on the operating VPN server's edition and version. Using this API, you can find out the capability of the target VPN Server and report it.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetCaps",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "CapsList": [
+      {
+        "CapsName_str": "capsname",
+        "CapsValue_u32": 0,
+        "CapsDescrption_utf": "capsdescrption"
+      },
+      {
+        "CapsName_str": "capsname",
+        "CapsValue_u32": 0,
+        "CapsDescrption_utf": "capsdescrption"
+      },
+      {
+        "CapsName_str": "capsname",
+        "CapsValue_u32": 0,
+        "CapsDescrption_utf": "capsdescrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
CapsListArray objectCaps list of the VPN Server
CapsName_strstring (ASCII)Name
CapsValue_u32number (uint32)Value
CapsDescrption_utfstring (UTF8)Descrption
+
+

+

"GetConfig" RPC API - Get the current configuration of the VPN Server

+

Description

+

Get the current configuration of the VPN Server. Use this to get a text file (.config file) that contains the current configuration contents of the VPN server. You can get the status on the VPN Server at the instant this API is executed. You can edit the configuration file by using a regular text editor. To write an edited configuration to the VPN Server, use the SetConfig API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetConfig",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "FileName_str": "filename",
+    "FileData_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
FileName_strstring (ASCII)File name (valid only for returning from the server)
FileData_binstring (Base64 binary)File data
+
+

+

"SetConfig" RPC API - Write Configuration File to VPN Server

+

Description

+

Write Configuration File to VPN Server. Use this to write the configuration file to the VPN Server. By executing this API, the contents of the specified configuration file will be applied to the VPN Server and the VPN Server program will automatically restart and upon restart, operate according to the new configuration contents. Because it is difficult for an administrator to write all the contents of a configuration file, we recommend you use the GetConfig API to get the current contents of the VPN Server configuration and save it to file. You can then edit these contents in a regular text editor and then use the SetConfig API to rewrite the contents to the VPN Server. This API is for people with a detailed knowledge of the VPN Server and if an incorrectly configured configuration file is written to the VPN Server, it not only could cause errors, it could also result in the lost of the current setting data. Take special care when carrying out this action. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetConfig",
+  "params": {
+    "FileData_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "FileName_str": "filename",
+    "FileData_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
FileName_strstring (ASCII)File name (valid only for returning from the server)
FileData_binstring (Base64 binary)File data
+
+

+

"GetDefaultHubAdminOptions" RPC API - Get Virtual Hub Administration Option default values

+

Description

+

Get Virtual Hub Administration Option default values.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetDefaultHubAdminOptions",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"GetHubAdminOptions" RPC API - Get List of Virtual Hub Administration Options

+

Description

+

Get List of Virtual Hub Administration Options. Use this to get a list of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubAdminOptions",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"SetHubAdminOptions" RPC API - Set Values of Virtual Hub Administration Options

+

Description

+

Set Values of Virtual Hub Administration Options. Use this to change the values of Virtual Hub administration options that are set on the currently managed Virtual Hub. The purpose of the Virtual Hub administration options is for the VPN Server Administrator to set limits for the setting ranges when the administration of the Virtual Hub is to be trusted to each Virtual Hub administrator. Only an administrator with administration privileges for this entire VPN Server is able to add, edit and delete the Virtual Hub administration options. The Virtual Hub administrators are unable to make changes to the administration options, however they are able to view them. There is an exception however. If allow_hub_admin_change_option is set to "1", even Virtual Hub administrators are able to edit the administration options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubAdminOptions",
+  "params": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"GetHubExtOptions" RPC API - Get List of Virtual Hub Extended Options

+

Description

+

Get List of Virtual Hub Extended Options. Use this to get a Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubExtOptions",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"SetHubExtOptions" RPC API - Set a Value of Virtual Hub Extended Options

+

Description

+

Set a Value of Virtual Hub Extended Options. Use this to set a value in the Virtual Hub Extended Options List that is set on the currently managed Virtual Hub. Virtual Hub Extended Option enables you to configure more detail settings of the Virtual Hub. By default, both VPN Server's global administrators and individual Virtual Hub's administrators can modify the Virtual Hub Extended Options. However, if the deny_hub_admin_change_ext_option is set to 1 on the Virtual Hub Admin Options, the individual Virtual Hub's administrators cannot modify the Virtual Hub Extended Options. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster member.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubExtOptions",
+  "params": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "AdminOptionList": [
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      },
+      {
+        "Name_str": "name",
+        "Value_u32": 0,
+        "Descrption_utf": "descrption"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)Virtual HUB name
AdminOptionListArray objectList data
Name_strstring (ASCII)Name
Value_u32number (uint32)Data
Descrption_utfstring (UTF8)Descrption
+
+

+

"AddL3Switch" RPC API - Define New Virtual Layer 3 Switch

+

Description

+

Define New Virtual Layer 3 Switch. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddL3Switch",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 Switch name
+
+

+

"DelL3Switch" RPC API - Delete Virtual Layer 3 Switch

+

Description

+

Delete Virtual Layer 3 Switch. Use this to delete an existing Virtual Layer 3 Switch that is defined on the VPN Server. When the specified Virtual Layer 3 Switch is operating, it will be automatically deleted after operation stops. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DelL3Switch",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 Switch name
+
+

+

"EnumL3Switch" RPC API - Get List of Virtual Layer 3 Switches

+

Description

+

Get List of Virtual Layer 3 Switches. Use this to define a new Virtual Layer 3 Switch on the VPN Server. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumL3Switch",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "L3SWList": [
+      {
+        "Name_str": "name",
+        "NumInterfaces_u32": 0,
+        "NumTables_u32": 0,
+        "Active_bool": false,
+        "Online_bool": false
+      },
+      {
+        "Name_str": "name",
+        "NumInterfaces_u32": 0,
+        "NumTables_u32": 0,
+        "Active_bool": false,
+        "Online_bool": false
+      },
+      {
+        "Name_str": "name",
+        "NumInterfaces_u32": 0,
+        "NumTables_u32": 0,
+        "Active_bool": false,
+        "Online_bool": false
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
L3SWListArray objectLayer-3 switch list
Name_strstring (ASCII)Name of the layer-3 switch
NumInterfaces_u32number (uint32)Number of layer-3 switch virtual interfaces
NumTables_u32number (uint32)Number of routing tables
Active_boolbooleanActivated flag
Online_boolbooleanOnline flag
+
+

+

"StartL3Switch" RPC API - Start Virtual Layer 3 Switch Operation

+

Description

+

Start Virtual Layer 3 Switch Operation. Use this to start the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently stopped. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. [Explanation on Virtual Layer 3 Switch Function] You can define Virtual Layer 3 Switches between multiple Virtual Hubs operating on this VPN Server and configure routing between different IP networks. [Caution about the Virtual Layer 3 Switch Function] The Virtual Layer 3 Switch functions are provided for network administrators and other people who know a lot about networks and IP routing. If you are using the regular VPN functions, you do not need to use the Virtual Layer 3 Switch functions. If the Virtual Layer 3 Switch functions are to be used, the person who configures them must have sufficient knowledge of IP routing and be perfectly capable of not impacting the network.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "StartL3Switch",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 Switch name
+
+

+

"StopL3Switch" RPC API - Stop Virtual Layer 3 Switch Operation

+

Description

+

Stop Virtual Layer 3 Switch Operation. Use this to stop the operation of an existing Virtual Layer 3 Switch defined on the VPN Server whose operation is currently operating. To get a list of existing Virtual Layer 3 Switches, use the EnumL3Switch API. To call this API, you must have VPN Server administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "StopL3Switch",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 Switch name
+
+

+

"AddL3If" RPC API - Add Virtual Interface to Virtual Layer 3 Switch

+

Description

+

Add Virtual Interface to Virtual Layer 3 Switch. Use this to add to a specified Virtual Layer 3 Switch, a virtual interface that connects to a Virtual Hub operating on the same VPN Server. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. You must define the IP network space that the virtual interface belongs to and the IP address of the interface itself. Also, you must specify the name of the Virtual Hub that the interface will connect to. You can specify a Virtual Hub that currently doesn't exist for the Virtual Hub name. The virtual interface must have one IP address in the Virtual Hub. You also must specify the subnet mask of an IP network that the IP address belongs to. Routing via the Virtual Layer 3 Switches of IP spaces of multiple virtual Hubs operates based on the IP address is specified here. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddL3If",
+  "params": {
+    "Name_str": "name",
+    "HubName_str": "hubname",
+    "IpAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "HubName_str": "hubname",
+    "IpAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
HubName_strstring (ASCII)Virtual HUB name
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask
+
+

+

"DelL3If" RPC API - Delete Virtual Interface of Virtual Layer 3 Switch

+

Description

+

Delete Virtual Interface of Virtual Layer 3 Switch. Use this to delete a virtual interface already defined in the specified Virtual Layer 3 Switch. You can get a list of the virtual interfaces currently defined, by using the EnumL3If API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DelL3If",
+  "params": {
+    "Name_str": "name",
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "HubName_str": "hubname",
+    "IpAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
HubName_strstring (ASCII)Virtual HUB name
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask
+
+

+

"EnumL3If" RPC API - Get List of Interfaces Registered on the Virtual Layer 3 Switch

+

Description

+

Get List of Interfaces Registered on the Virtual Layer 3 Switch. Use this to get a list of virtual interfaces when virtual interfaces have been defined on a specified Virtual Layer 3 Switch. You can define multiple virtual interfaces and routing tables for a single Virtual Layer 3 Switch. A virtual interface is associated to a virtual Hub and operates as a single IP host on the Virtual Hub when that Virtual Hub is operating. When multiple virtual interfaces that respectively belong to a different IP network of a different Virtual Hub are defined, IP routing will be automatically performed between these interfaces. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumL3If",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "L3IFList": [
+      {
+        "Name_str": "name",
+        "HubName_str": "hubname",
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Name_str": "name",
+        "HubName_str": "hubname",
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Name_str": "name",
+        "HubName_str": "hubname",
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)Layer-3 switch name
L3IFListArray objectLayer-3 interface list
Name_strstring (ASCII)L3 switch name
HubName_strstring (ASCII)Virtual HUB name
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask
+
+

+

"AddL3Table" RPC API - Add Routing Table Entry for Virtual Layer 3 Switch

+

Description

+

Add Routing Table Entry for Virtual Layer 3 Switch. Here you can add a new routing table entry to the routing table of the specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference the routing table and execute routing. You must specify the contents of the routing table entry to be added to the Virtual Layer 3 Switch. You must specify any IP address that belongs to the same IP network in the virtual interface of this Virtual Layer 3 Switch as the gateway address. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddL3Table",
+  "params": {
+    "Name_str": "name",
+    "NetworkAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255",
+    "GatewayAddress_ip": "192.168.0.1",
+    "Metric_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "NetworkAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255",
+    "GatewayAddress_ip": "192.168.0.1",
+    "Metric_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
NetworkAddress_ipstring (IP address)Network address
SubnetMask_ipstring (IP address)Subnet mask
GatewayAddress_ipstring (IP address)Gateway address
Metric_u32number (uint32)Metric
+
+

+

"DelL3Table" RPC API - Delete Routing Table Entry of Virtual Layer 3 Switch

+

Description

+

Delete Routing Table Entry of Virtual Layer 3 Switch. Use this to delete a routing table entry that is defined in the specified Virtual Layer 3 Switch. You can get a list of the already defined routing table entries by using the EnumL3Table API. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge. To execute this API, the target Virtual Layer 3 Switch must be stopped. If it is not stopped, first use the StopL3Switch API to stop it and then execute this API.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DelL3Table",
+  "params": {
+    "Name_str": "name",
+    "NetworkAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255",
+    "GatewayAddress_ip": "192.168.0.1",
+    "Metric_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "NetworkAddress_ip": "192.168.0.1",
+    "SubnetMask_ip": "255.255.255.255",
+    "GatewayAddress_ip": "192.168.0.1",
+    "Metric_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
NetworkAddress_ipstring (IP address)Network address
SubnetMask_ipstring (IP address)Subnet mask
GatewayAddress_ipstring (IP address)Gateway address
Metric_u32number (uint32)Metric
+
+

+

"EnumL3Table" RPC API - Get List of Routing Tables of Virtual Layer 3 Switch

+

Description

+

Get List of Routing Tables of Virtual Layer 3 Switch. Use this to get a list of routing tables when routing tables have been defined on a specified Virtual Layer 3 Switch. If the destination IP address of the IP packet does not belong to any IP network that belongs to a virtual interface, the IP routing engine of the Virtual Layer 3 Switch will reference this routing table and execute routing. To call this API, you must have VPN Server administrator privileges. Also, this API does not operate on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumL3Table",
+  "params": {
+    "Name_str": "name"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Name_str": "name",
+    "L3Table": [
+      {
+        "Name_str": "name",
+        "NetworkAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255",
+        "GatewayAddress_ip": "192.168.0.1",
+        "Metric_u32": 0
+      },
+      {
+        "Name_str": "name",
+        "NetworkAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255",
+        "GatewayAddress_ip": "192.168.0.1",
+        "Metric_u32": 0
+      },
+      {
+        "Name_str": "name",
+        "NetworkAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255",
+        "GatewayAddress_ip": "192.168.0.1",
+        "Metric_u32": 0
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Name_strstring (ASCII)L3 switch name
L3TableArray objectRouting table item list
Name_strstring (ASCII)L3 switch name
NetworkAddress_ipstring (IP address)Network address
SubnetMask_ipstring (IP address)Subnet mask
GatewayAddress_ipstring (IP address)Gateway address
Metric_u32number (uint32)Metric
+
+

+

"EnumCrl" RPC API - Get List of Certificates Revocation List

+

Description

+

Get List of Certificates Revocation List. Use this to get a Certificates Revocation List that is set on the currently managed Virtual Hub. By registering certificates in the Certificates Revocation List, the clients who provide these certificates will be unable to connect to this Virtual Hub using certificate authentication mode. Normally with this function, in cases where the security of a private key has been compromised or where a person holding a certificate has been stripped of their privileges, by registering that certificate as invalid on the Virtual Hub, it is possible to deny user authentication when that certificate is used by a client to connect to the Virtual Hub. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumCrl",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "CRLList": [
+      {
+        "Key_u32": 0,
+        "CrlInfo_utf": "crlinfo"
+      },
+      {
+        "Key_u32": 0,
+        "CrlInfo_utf": "crlinfo"
+      },
+      {
+        "Key_u32": 0,
+        "CrlInfo_utf": "crlinfo"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
CRLListArray objectCRL list
Key_u32number (uint32)Key ID
CrlInfo_utfstring (UTF8)The contents of the CRL item
+
+

+

"AddCrl" RPC API - Add a Revoked Certificate

+

Description

+

Add a Revoked Certificate. Use this to add a new revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddCrl",
+  "params": {
+    "HubName_str": "hubname",
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
CommonName_utfstring (UTF8)CN, optional
Organization_utfstring (UTF8)O, optional
Unit_utfstring (UTF8)OU, optional
Country_utfstring (UTF8)C, optional
State_utfstring (UTF8)ST, optional
Local_utfstring (UTF8)L, optional
Serial_binstring (Base64 binary)Serial, optional
DigestMD5_binstring (Base64 binary)MD5 Digest, optional
DigestSHA1_binstring (Base64 binary)SHA1 Digest, optional
+
+

+

"DelCrl" RPC API - Delete a Revoked Certificate

+

Description

+

Delete a Revoked Certificate. Use this to specify and delete a revoked certificate definition from the certificate revocation list that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DelCrl",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
CommonName_utfstring (UTF8)CN, optional
Organization_utfstring (UTF8)O, optional
Unit_utfstring (UTF8)OU, optional
Country_utfstring (UTF8)C, optional
State_utfstring (UTF8)ST, optional
Local_utfstring (UTF8)L, optional
Serial_binstring (Base64 binary)Serial, optional
DigestMD5_binstring (Base64 binary)MD5 Digest, optional
DigestSHA1_binstring (Base64 binary)SHA1 Digest, optional
+
+

+

"GetCrl" RPC API - Get a Revoked Certificate

+

Description

+

Get a Revoked Certificate. Use this to specify and get the contents of a revoked certificate definition from the Certificates Revocation List that is set on the currently managed Virtual Hub. To get the list of currently registered revoked certificate definitions, use the EnumCrl API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetCrl",
+  "params": {
+    "HubName_str": "hubname",
+    "Key_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
CommonName_utfstring (UTF8)CN, optional
Organization_utfstring (UTF8)O, optional
Unit_utfstring (UTF8)OU, optional
Country_utfstring (UTF8)C, optional
State_utfstring (UTF8)ST, optional
Local_utfstring (UTF8)L, optional
Serial_binstring (Base64 binary)Serial, optional
DigestMD5_binstring (Base64 binary)MD5 Digest, optional
DigestSHA1_binstring (Base64 binary)SHA1 Digest, optional
+
+

+

"SetCrl" RPC API - Change Existing CRL (Certificate Revocation List) Entry

+

Description

+

Change Existing CRL (Certificate Revocation List) Entry. Use this to alter an existing revoked certificate definition in the Certificate Revocation List that is set on the currently managed Virtual Hub. Specify the contents to be registered in the Certificate Revocation List by using the parameters of this API. When a user connects to a Virtual Hub in certificate authentication mode and that certificate matches 1 or more of the contents registered in the certificates revocation list, the user is denied connection. A certificate that matches all the conditions that are defined by the parameters specified by this API will be judged as invalid. The items that can be set are as follows: Name (CN), Organization (O), Organization Unit (OU), Country (C), State (ST), Locale (L), Serial Number (hexadecimal), MD5 Digest Value (hexadecimal, 128 bit), and SHA-1 Digest Value (hexadecimal, 160 bit). For the specification of a digest value (hash value) a certificate is optionally specified depending on the circumstances. Normally when a MD5 or SHA-1 digest value is input, it is not necessary to input the other items. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetCrl",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Key_u32": 0,
+    "CommonName_utf": "commonname",
+    "Organization_utf": "organization",
+    "Unit_utf": "unit",
+    "Country_utf": "country",
+    "State_utf": "state",
+    "Local_utf": "local",
+    "Serial_bin": "SGVsbG8gV29ybGQ=",
+    "DigestMD5_bin": "SGVsbG8gV29ybGQ=",
+    "DigestSHA1_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Key_u32number (uint32)Key ID
CommonName_utfstring (UTF8)CN, optional
Organization_utfstring (UTF8)O, optional
Unit_utfstring (UTF8)OU, optional
Country_utfstring (UTF8)C, optional
State_utfstring (UTF8)ST, optional
Local_utfstring (UTF8)L, optional
Serial_binstring (Base64 binary)Serial, optional
DigestMD5_binstring (Base64 binary)MD5 Digest, optional
DigestSHA1_binstring (Base64 binary)SHA1 Digest, optional
+
+

+

"SetAcList" RPC API - Add Rule to Source IP Address Limit List

+

Description

+

Add Rule to Source IP Address Limit List. Use this to add a new rule to the Source IP Address Limit List that is set on the currently managed Virtual Hub. The items set here will be used to decide whether to allow or deny connection from a VPN Client when this client attempts connection to the Virtual Hub. You can specify a client IP address, or IP address or mask to match the rule as the contents of the rule item. By specifying an IP address only, there will only be one specified computer that will match the rule, but by specifying an IP net mask address or subnet mask address, all the computers in the range of that subnet will match the rule. You can specify the priority for the rule. You can specify an integer of 1 or greater for the priority and the smaller the number, the higher the priority. To get a list of the currently registered Source IP Address Limit List, use the GetAcList API. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetAcList",
+  "params": {
+    "HubName_str": "hubname",
+    "ACList": [
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      }
+    ]
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "ACList": [
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
ACListArray objectSource IP Address Limit List
Id_u32number (uint32)ID
Priority_u32number (uint32)Priority
Deny_boolbooleanDeny access
Masked_boolbooleanSet true if you want to specify the SubnetMask_ip item.
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask, valid only if Masked_bool == true
+
+

+

"GetAcList" RPC API - Get List of Rule Items of Source IP Address Limit List

+

Description

+

Get List of Rule Items of Source IP Address Limit List. Use this to get a list of Source IP Address Limit List rules that is set on the currently managed Virtual Hub. You can allow or deny VPN connections to this Virtual Hub according to the client computer's source IP address. You can define multiple rules and set a priority for each rule. The search proceeds from the rule with the highest order or priority and based on the action of the rule that the IP address first matches, the connection from the client is either allowed or denied. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetAcList",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "ACList": [
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      },
+      {
+        "Id_u32": 0,
+        "Priority_u32": 0,
+        "Deny_bool": false,
+        "Masked_bool": false,
+        "IpAddress_ip": "192.168.0.1",
+        "SubnetMask_ip": "255.255.255.255"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
ACListArray objectSource IP Address Limit List
Id_u32number (uint32)ID
Priority_u32number (uint32)Priority
Deny_boolbooleanDeny access
Masked_boolbooleanSet true if you want to specify the SubnetMask_ip item.
IpAddress_ipstring (IP address)IP address
SubnetMask_ipstring (IP address)Subnet mask, valid only if Masked_bool == true
+
+

+

"EnumLogFile" RPC API - Get List of Log Files

+

Description

+

Get List of Log Files. Use this to display a list of log files outputted by the VPN Server that have been saved on the VPN Server computer. By specifying a log file file name displayed here and calling it using the ReadLogFile API you can download the contents of the log file. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumLogFile",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "LogFiles": [
+      {
+        "ServerName_str": "servername",
+        "FilePath_str": "filepath",
+        "FileSize_u32": 0,
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "ServerName_str": "servername",
+        "FilePath_str": "filepath",
+        "FileSize_u32": 0,
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123"
+      },
+      {
+        "ServerName_str": "servername",
+        "FilePath_str": "filepath",
+        "FileSize_u32": 0,
+        "UpdatedTime_dt": "2020-08-01T12:24:36.123"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
LogFilesArray objectLog file list
ServerName_strstring (ASCII)Server name
FilePath_strstring (ASCII)File path
FileSize_u32number (uint32)File size
UpdatedTime_dtDateLast write date
+
+

+

"ReadLogFile" RPC API - Download a part of Log File

+

Description

+

Download a part of Log File. Use this to download the log file that is saved on the VPN Server computer. To download the log file first get the list of log files using the EnumLogFile API and then download the log file using the ReadLogFile API. If you are connected to the VPN Server in server admin mode, you can display or download the packet logs and security logs of all Virtual Hubs and the server log of the VPN Server. When connected in Virtual Hub Admin Mode, you are able to view or download only the packet log and security log of the Virtual Hub that is the target of management.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "ReadLogFile",
+  "params": {
+    "FilePath_str": "filepath"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerName_str": "servername",
+    "FilePath_str": "filepath",
+    "Offset_u32": 0,
+    "Buffer_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerName_strstring (ASCII)Server name
FilePath_strstring (ASCII)File Path
Offset_u32number (uint32)Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field.
Buffer_binstring (Base64 binary)Received buffer
+
+

+

"SetSysLog" RPC API - Set syslog Send Function

+

Description

+

Set syslog Send Function. Use this to set the usage of syslog send function and which syslog server to use.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetSysLog",
+  "params": {
+    "SaveType_u32": 0,
+    "Hostname_str": "hostname",
+    "Port_u32": 0
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "SaveType_u32": 0,
+    "Hostname_str": "hostname",
+    "Port_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
SaveType_u32number (enum)The behavior of the syslog function
Values:
0: Do not use syslog
1: Only server log
2: Server and Virtual HUB security log
3: Server, Virtual HUB security, and packet log
Hostname_strstring (ASCII)Specify the host name or IP address of the syslog server
Port_u32number (uint32)Specify the port number of the syslog server
+
+

+

"GetSysLog" RPC API - Get syslog Send Function

+

Description

+

Get syslog Send Function. This allows you to get the current setting contents of the syslog send function. You can get the usage setting of the syslog function and the host name and port number of the syslog server to use.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSysLog",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "SaveType_u32": 0,
+    "Hostname_str": "hostname",
+    "Port_u32": 0
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
SaveType_u32number (enum)The behavior of the syslog function
Values:
0: Do not use syslog
1: Only server log
2: Server and Virtual HUB security log
3: Server, Virtual HUB security, and packet log
Hostname_strstring (ASCII)Specify the host name or IP address of the syslog server
Port_u32number (uint32)Specify the port number of the syslog server
+
+

+

"SetHubMsg" RPC API - Set Today's Message of Virtual Hub

+

Description

+

Set Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetHubMsg",
+  "params": {
+    "HubName_str": "hubname",
+    "Msg_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Msg_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Msg_binstring (Base64 binary)Message (Unicode strings acceptable)
+
+

+

"GetHubMsg" RPC API - Get Today's Message of Virtual Hub

+

Description

+

Get Today's Message of Virtual Hub. The message will be displayed on VPN Client UI when a user will establish a connection to the Virtual Hub.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetHubMsg",
+  "params": {
+    "HubName_str": "hubname"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Msg_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Msg_binstring (Base64 binary)Message (Unicode strings acceptable)
+
+

+

"Crash" RPC API - Raise a vital error on the VPN Server / Bridge to terminate the process forcefully

+

Description

+

Raise a vital error on the VPN Server / Bridge to terminate the process forcefully. This API will raise a fatal error (memory access violation) on the VPN Server / Bridge running process in order to crash the process. As the result, VPN Server / Bridge will be terminated and restarted if it is running as a service mode. If the VPN Server is running as a user mode, the process will not automatically restarted. This API is for a situation when the VPN Server / Bridge is under a non-recoverable error or the process is in an infinite loop. This API will disconnect all VPN Sessions on the VPN Server / Bridge. All unsaved settings in the memory of VPN Server / Bridge will be lost. Before run this API, call the Flush API to try to save volatile data to the configuration file. To execute this API, you must have VPN Server / VPN Bridge administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "Crash",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"GetAdminMsg" RPC API - Get the message for administrators

+

Description

+

Get the message for administrators.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetAdminMsg",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "HubName_str": "hubname",
+    "Msg_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
HubName_strstring (ASCII)The Virtual Hub name
Msg_binstring (Base64 binary)Message (Unicode strings acceptable)
+
+

+

"Flush" RPC API - Save All Volatile Data of VPN Server / Bridge to the Configuration File

+

Description

+

Save All Volatile Data of VPN Server / Bridge to the Configuration File. The number of configuration file bytes will be returned as the "IntValue" parameter. Normally, the VPN Server / VPN Bridge retains the volatile configuration data in memory. It is flushed to the disk as vpn_server.config or vpn_bridge.config periodically. The period is 300 seconds (5 minutes) by default. (The period can be altered by modifying the AutoSaveConfigSpan item in the configuration file.) The data will be saved on the timing of shutting down normally of the VPN Server / Bridge. Execute the Flush API to make the VPN Server / Bridge save the settings to the file immediately. The setting data will be stored on the disk drive of the server computer. Use the Flush API in a situation that you do not have an enough time to shut down the server process normally. To call this API, you must have VPN Server administrator privileges. To execute this API, you must have VPN Server / VPN Bridge administrator privileges.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "Flush",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"SetIPsecServices" RPC API - Enable or Disable IPsec VPN Server Function

+

Description

+

Enable or Disable IPsec VPN Server Function. Enable or Disable IPsec VPN Server Function on the VPN Server. If you enable this function, Virtual Hubs on the VPN Server will be able to accept Remote-Access VPN connections from L2TP-compatible PCs, Mac OS X and Smartphones, and also can accept EtherIP Site-to-Site VPN Connection. VPN Connections from Smartphones suchlike iPhone, iPad and Android, and also from native VPN Clients on Mac OS X and Windows can be accepted. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetIPsecServices",
+  "params": {
+    "L2TP_Raw_bool": false,
+    "L2TP_IPsec_bool": false,
+    "EtherIP_IPsec_bool": false,
+    "IPsec_Secret_str": "ipsec_secret",
+    "L2TP_DefaultHub_str": "l2tp_defaulthub"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "L2TP_Raw_bool": false,
+    "L2TP_IPsec_bool": false,
+    "EtherIP_IPsec_bool": false,
+    "IPsec_Secret_str": "ipsec_secret",
+    "L2TP_DefaultHub_str": "l2tp_defaulthub"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
L2TP_Raw_boolbooleanEnable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option.
L2TP_IPsec_boolbooleanEnable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option.
EtherIP_IPsec_boolbooleanEnable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging.
IPsec_Secret_strstring (ASCII)Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters.
L2TP_DefaultHub_strstring (ASCII)Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target.
+
+

+

"GetIPsecServices" RPC API - Get the Current IPsec VPN Server Settings

+

Description

+

Get the Current IPsec VPN Server Settings. Get and view the current IPsec VPN Server settings on the VPN Server. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetIPsecServices",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "L2TP_Raw_bool": false,
+    "L2TP_IPsec_bool": false,
+    "EtherIP_IPsec_bool": false,
+    "IPsec_Secret_str": "ipsec_secret",
+    "L2TP_DefaultHub_str": "l2tp_defaulthub"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
L2TP_Raw_boolbooleanEnable or Disable the L2TP Server Function (Raw L2TP with No Encryptions). To accept special VPN clients, enable this option.
L2TP_IPsec_boolbooleanEnable or Disable the L2TP over IPsec Server Function. To accept VPN connections from iPhone, iPad, Android, Windows or Mac OS X, enable this option.
EtherIP_IPsec_boolbooleanEnable or Disable the EtherIP / L2TPv3 over IPsec Server Function (for site-to-site VPN Server function). Router Products which are compatible with EtherIP over IPsec can connect to Virtual Hubs on the VPN Server and establish Layer-2 (Ethernet) Bridging.
IPsec_Secret_strstring (ASCII)Specify the IPsec Pre-Shared Key. An IPsec Pre-Shared Key is also called as "PSK" or "secret". Specify it equal or less than 8 letters, and distribute it to every users who will connect to the VPN Server. Please note: Google Android 4.0 has a bug which a Pre-Shared Key with 10 or more letters causes a unexpected behavior. For that reason, the letters of a Pre-Shared Key should be 9 or less characters.
L2TP_DefaultHub_strstring (ASCII)Specify the default Virtual HUB in a case of omitting the name of HUB on the Username. Users should specify their username such as "Username@Target Virtual HUB Name" to connect this L2TP Server. If the designation of the Virtual Hub is omitted, the above HUB will be used as the target.
+
+

+

"AddEtherIpId" RPC API - Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices

+

Description

+

Add New EtherIP / L2TPv3 over IPsec Client Setting to Accept EthreIP / L2TPv3 Client Devices. Add a new setting entry to enable the EtherIP / L2TPv3 over IPsec Server Function to accept client devices. In order to accept connections from routers by the EtherIP / L2TPv3 over IPsec Server Function, you have to define the relation table between an IPsec Phase 1 string which is presented by client devices of EtherIP / L2TPv3 over IPsec compatible router, and the designation of the destination Virtual Hub. After you add a definition entry by AddEtherIpId API, the defined connection setting to the Virtual Hub will be applied on the login-attepting session from an EtherIP / L2TPv3 over IPsec client device. The username and password in an entry must be registered on the Virtual Hub. An EtherIP / L2TPv3 client will be regarded as it connected the Virtual HUB with the identification of the above user information. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "AddEtherIpId",
+  "params": {
+    "Id_str": "id",
+    "HubName_str": "hubname",
+    "UserName_str": "username",
+    "Password_str": "password"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Id_str": "id",
+    "HubName_str": "hubname",
+    "UserName_str": "username",
+    "Password_str": "password"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Id_strstring (ASCII)Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.
HubName_strstring (ASCII)Specify the name of the Virtual Hub to connect.
UserName_strstring (ASCII)Specify the username to login to the destination Virtual Hub.
Password_strstring (ASCII)Specify the password to login to the destination Virtual Hub.
+
+

+

"GetEtherIpId" RPC API - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions

+

Description

+

Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetEtherIpId",
+  "params": {
+    "Id_str": "id"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Id_str": "id",
+    "HubName_str": "hubname",
+    "UserName_str": "username",
+    "Password_str": "password"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Id_strstring (ASCII)Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.
HubName_strstring (ASCII)Specify the name of the Virtual Hub to connect.
UserName_strstring (ASCII)Specify the username to login to the destination Virtual Hub.
Password_strstring (ASCII)Specify the password to login to the destination Virtual Hub.
+
+

+

"DeleteEtherIpId" RPC API - Delete an EtherIP / L2TPv3 over IPsec Client Setting

+

Description

+

Delete an EtherIP / L2TPv3 over IPsec Client Setting. This API deletes an entry to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "DeleteEtherIpId",
+  "params": {
+    "Id_str": "id"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Id_str": "id",
+    "HubName_str": "hubname",
+    "UserName_str": "username",
+    "Password_str": "password"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Id_strstring (ASCII)Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.
HubName_strstring (ASCII)Specify the name of the Virtual Hub to connect.
UserName_strstring (ASCII)Specify the username to login to the destination Virtual Hub.
Password_strstring (ASCII)Specify the password to login to the destination Virtual Hub.
+
+

+

"EnumEtherIpId" RPC API - Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions

+

Description

+

Get the Current List of EtherIP / L2TPv3 Client Device Entry Definitions. This API gets and shows the list of entries to accept VPN clients by EtherIP / L2TPv3 over IPsec Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "EnumEtherIpId",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Settings": [
+      {
+        "Id_str": "id",
+        "HubName_str": "hubname",
+        "UserName_str": "username",
+        "Password_str": "password"
+      },
+      {
+        "Id_str": "id",
+        "HubName_str": "hubname",
+        "UserName_str": "username",
+        "Password_str": "password"
+      },
+      {
+        "Id_str": "id",
+        "HubName_str": "hubname",
+        "UserName_str": "username",
+        "Password_str": "password"
+      }
+    ]
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
SettingsArray objectSetting list
Id_strstring (ASCII)Specify an ISAKMP Phase 1 ID. The ID must be exactly same as a ID in the configuration of the EtherIP / L2TPv3 Client. You can specify IP address as well as characters as ID, if the EtherIP Client uses IP address as Phase 1 ID. If you specify '*' (asterisk), it will be a wildcard to match any clients which doesn't match other explicit rules.
HubName_strstring (ASCII)Specify the name of the Virtual Hub to connect.
UserName_strstring (ASCII)Specify the username to login to the destination Virtual Hub.
Password_strstring (ASCII)Specify the password to login to the destination Virtual Hub.
+
+

+

"SetOpenVpnSstpConfig" RPC API - Set Settings for OpenVPN Clone Server Function

+

Description

+

Set Settings for OpenVPN Clone Server Function. The VPN Server has the clone functions of OpenVPN software products by OpenVPN Technologies, Inc. Any OpenVPN Clients can connect to this VPN Server. The manner to specify a username to connect to the Virtual Hub, and the selection rule of default Hub by using this clone server functions are same to the IPsec Server functions. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetOpenVpnSstpConfig",
+  "params": {
+    "EnableOpenVPN_bool": false,
+    "OpenVPNPortList_str": "openvpnportlist",
+    "EnableSSTP_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "EnableOpenVPN_bool": false,
+    "OpenVPNPortList_str": "openvpnportlist",
+    "EnableSSTP_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
EnableOpenVPN_boolbooleanSpecify true to enable the OpenVPN Clone Server Function. Specify false to disable.
OpenVPNPortList_strstring (ASCII)Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports.
EnableSSTP_boolbooleanpecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable.
+
+

+

"GetOpenVpnSstpConfig" RPC API - Get the Current Settings of OpenVPN Clone Server Function

+

Description

+

Get the Current Settings of OpenVPN Clone Server Function. Get and show the current settings of OpenVPN Clone Server Function. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetOpenVpnSstpConfig",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "EnableOpenVPN_bool": false,
+    "OpenVPNPortList_str": "openvpnportlist",
+    "EnableSSTP_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
EnableOpenVPN_boolbooleanSpecify true to enable the OpenVPN Clone Server Function. Specify false to disable.
OpenVPNPortList_strstring (ASCII)Specify UDP ports to listen for OpenVPN. Multiple UDP ports can be specified with splitting by space or comma letters, for example: "1194, 2001, 2010, 2012". The default port for OpenVPN is UDP 1194. You can specify any other UDP ports.
EnableSSTP_boolbooleanpecify true to enable the Microsoft SSTP VPN Clone Server Function. Specify false to disable.
+
+

+

"GetDDnsClientStatus" RPC API - Show the Current Status of Dynamic DNS Function

+

Description

+

Show the Current Status of Dynamic DNS Function. Get and show the current status of the Dynamic DNS function. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetDDnsClientStatus",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "Err_IPv4_u32": 0,
+    "ErrStr_IPv4_utf": "errstr_ipv4",
+    "Err_IPv6_u32": 0,
+    "ErrStr_IPv6_utf": "errstr_ipv6",
+    "CurrentHostName_str": "currenthostname",
+    "CurrentFqdn_str": "currentfqdn",
+    "DnsSuffix_str": "dnssuffix",
+    "CurrentIPv4_str": "currentipv4",
+    "CurrentIPv6_str": "currentipv6"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Err_IPv4_u32number (uint32)Last error code (IPv4)
ErrStr_IPv4_utfstring (UTF8)Last error string (IPv4)
Err_IPv6_u32number (uint32)Last error code (IPv6)
ErrStr_IPv6_utfstring (UTF8)Last error string (IPv6)
CurrentHostName_strstring (ASCII)Current DDNS host name
CurrentFqdn_strstring (ASCII)Current FQDN of the DDNS hostname
DnsSuffix_strstring (ASCII)DDNS suffix
CurrentIPv4_strstring (ASCII)Current IPv4 address of the VPN Server
CurrentIPv6_strstring (ASCII)Current IPv6 address of the VPN Server
+
+

+

"ChangeDDnsClientHostname" RPC API - Set the Dynamic DNS Hostname

+

Description

+

Set the Dynamic DNS Hostname. You must specify the new hostname on the StrValue_str field. You can use this API to change the hostname assigned by the Dynamic DNS function. The currently assigned hostname can be showen by the GetDDnsClientStatus API. The Dynamic DNS assigns a unique and permanent DNS hostname for this VPN Server. You can use that hostname to specify this VPN Server on the settings for VPN Client and VPN Bridge. You need not to register and keep a domain name. Also, if your ISP assignes you a dynamic (not-fixed) IP address, the corresponding IP address of your Dynamic DNS hostname will be automatically changed. It enables you to keep running the VPN Server by using only a dynamic IP address. Therefore, you need not any longer to keep static global IP addresses with expenses monthly costs. [Caution] To disable the Dynamic DNS Function, modify the configuration file of VPN Server. The "declare root" directive has the "declare DDnsClient" directive. In this directive, you can switch "bool Disable" from false to true, and reboot the VPN Server, then the Dynamic DNS Function will be disabled. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "ChangeDDnsClientHostname",
+  "params": {
+    "StrValue_str": "strvalue"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"RegenerateServerCert" RPC API - Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server

+

Description

+

Generate New Self-Signed Certificate with Specified CN (Common Name) and Register on VPN Server. You can specify the new CN (common name) value on the StrValue_str field. You can use this API to replace the current certificate on the VPN Server to a new self-signed certificate which has the CN (Common Name) value in the fields. This API is convenient if you are planning to use Microsoft SSTP VPN Clone Server Function. Because of the value of CN (Common Name) on the SSL certificate of VPN Server must match to the hostname specified on the SSTP VPN client. This API will delete the existing SSL certificate of the VPN Server. It is recommended to backup the current SSL certificate and private key by using the GetServerCert API beforehand. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "RegenerateServerCert",
+  "params": {
+    "StrValue_str": "strvalue"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IntValue_u32": 0,
+    "Int64Value_u64": 0,
+    "StrValue_str": "strvalue",
+    "UniStrValue_utf": "unistrvalue"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IntValue_u32number (uint32)A 32-bit integer field
Int64Value_u64number (uint64)A 64-bit integer field
StrValue_strstring (ASCII)An Ascii string field
UniStrValue_utfstring (UTF8)An UTF-8 string field
+
+

+

"MakeOpenVpnConfigFile" RPC API - Generate a Sample Setting File for OpenVPN Client

+

Description

+

Generate a Sample Setting File for OpenVPN Client. Originally, the OpenVPN Client requires a user to write a very difficult configuration file manually. This API helps you to make a useful configuration sample. What you need to generate the configuration file for the OpenVPN Client is to run this API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "MakeOpenVpnConfigFile",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ServerName_str": "servername",
+    "FilePath_str": "filepath",
+    "Offset_u32": 0,
+    "Buffer_bin": "SGVsbG8gV29ybGQ="
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ServerName_strstring (ASCII)Server name
FilePath_strstring (ASCII)File Path
Offset_u32number (uint32)Offset to download. You have to call the ReadLogFile API multiple times to download the entire log file with requesting a part of the file by specifying the Offset_u32 field.
Buffer_binstring (Base64 binary)Received buffer
+
+

+

"SetSpecialListener" RPC API - Enable / Disable the VPN over ICMP / VPN over DNS Server Function

+

Description

+

Enable / Disable the VPN over ICMP / VPN over DNS Server Function. You can establish a VPN only with ICMP or DNS packets even if there is a firewall or routers which blocks TCP/IP communications. You have to enable the following functions beforehand. Warning: Use this function for emergency only. It is helpful when a firewall or router is misconfigured to blocks TCP/IP, but either ICMP or DNS is not blocked. It is not for long-term stable using. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetSpecialListener",
+  "params": {
+    "VpnOverIcmpListener_bool": false,
+    "VpnOverDnsListener_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "VpnOverIcmpListener_bool": false,
+    "VpnOverDnsListener_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
VpnOverIcmpListener_boolbooleanThe flag to activate the VPN over ICMP server function
VpnOverDnsListener_boolbooleanThe flag to activate the VPN over DNS function
+
+

+

"GetSpecialListener" RPC API - Get Current Setting of the VPN over ICMP / VPN over DNS Function

+

Description

+

Get Current Setting of the VPN over ICMP / VPN over DNS Function. Get and show the current VPN over ICMP / VPN over DNS Function status. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetSpecialListener",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "VpnOverIcmpListener_bool": false,
+    "VpnOverDnsListener_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
VpnOverIcmpListener_boolbooleanThe flag to activate the VPN over ICMP server function
VpnOverDnsListener_boolbooleanThe flag to activate the VPN over DNS function
+
+

+

"GetAzureStatus" RPC API - Show the current status of VPN Azure function

+

Description

+

Show the current status of VPN Azure function. Get and show the current status of the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetAzureStatus",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IsEnabled_bool": false,
+    "IsConnected_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IsEnabled_boolbooleanWhether VPN Azure Function is Enabled
IsConnected_boolbooleanWhether connection to VPN Azure Cloud Server is established
+
+

+

"SetAzureStatus" RPC API - Enable / Disable VPN Azure Function

+

Description

+

Enable / Disable VPN Azure Function. Enable or disable the VPN Azure function. VPN Azure makes it easier to establish a VPN Session from your home PC to your office PC. While a VPN connection is established, you can access to any other servers on the private network of your company. You don't need a global IP address on the office PC (VPN Server). It can work behind firewalls or NATs. No network administrator's configuration required. You can use the built-in SSTP-VPN Client of Windows in your home PC. VPN Azure is a cloud VPN service operated by SoftEther Corporation. VPN Azure is free of charge and available to anyone. Visit http://www.vpnazure.net/ to see details and how-to-use instructions. The VPN Azure hostname is same to the hostname of the Dynamic DNS setting, but altering the domain suffix to "vpnazure.net". To change the hostname use the ChangeDDnsClientHostname API. To call this API, you must have VPN Server administrator privileges. This API cannot be invoked on VPN Bridge. You cannot execute this API for Virtual Hubs of VPN Servers operating as a cluster.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetAzureStatus",
+  "params": {
+    "IsEnabled_bool": false
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "IsEnabled_bool": false,
+    "IsConnected_bool": false
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
IsEnabled_boolbooleanWhether VPN Azure Function is Enabled
IsConnected_boolbooleanWhether connection to VPN Azure Cloud Server is established
+
+

+

"GetDDnsInternetSettng" RPC API - Get the Proxy Settings for Connecting to the DDNS server

+

Description

+

Get the Proxy Settings for Connecting to the DDNS server.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "GetDDnsInternetSettng",
+  "params": {}
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ProxyType_u32": 0,
+    "ProxyHostName_str": "proxyhostname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "proxyusername",
+    "ProxyPassword_str": "proxypassword"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ProxyType_u32number (enum)Type of proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyHostName_strstring (ASCII)Proxy server host name
ProxyPort_u32number (uint32)Proxy server port number
ProxyUsername_strstring (ASCII)Proxy server user name
ProxyPassword_strstring (ASCII)Proxy server password
+
+

+

"SetDDnsInternetSettng" RPC API - Set the Proxy Settings for Connecting to the DDNS server

+

Description

+

Set the Proxy Settings for Connecting to the DDNS server.

+

Input JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "method": "SetDDnsInternetSettng",
+  "params": {
+    "ProxyType_u32": 0,
+    "ProxyHostName_str": "proxyhostname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "proxyusername",
+    "ProxyPassword_str": "proxypassword"
+  }
+}
+
+

Output JSON-RPC Format

+
{
+  "jsonrpc": "2.0",
+  "id": "rpc_call_id",
+  "result": {
+    "ProxyType_u32": 0,
+    "ProxyHostName_str": "proxyhostname",
+    "ProxyPort_u32": 0,
+    "ProxyUsername_str": "proxyusername",
+    "ProxyPassword_str": "proxypassword"
+  }
+}
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ProxyType_u32number (enum)Type of proxy server
Values:
0: Direct TCP connection
1: Connection via HTTP proxy server
2: Connection via SOCKS proxy server
ProxyHostName_strstring (ASCII)Proxy server host name
ProxyPort_u32number (uint32)Proxy server port number
ProxyUsername_strstring (ASCII)Proxy server user name
ProxyPassword_strstring (ASCII)Proxy server password
+
+

Automatically generated at 2019-07-10 14:36:11 by vpnserver-jsonrpc-codegen.
+Copyright (c) 2014-2019 SoftEther VPN Project under the Apache License 2.0.

+ +
+ + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/hub.html softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/hub.html --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/hub.html 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/hub.html 2019-07-23 21:37:12.000000000 +0000 @@ -0,0 +1,23 @@ + + + + + +
+

+ + + +

List of Users

+
    + +

    List of Active VPN Sessions

    +
      + +
      + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_footer.html softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_footer.html --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_footer.html 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_footer.html 2019-07-23 21:37:12.000000000 +0000 @@ -0,0 +1,4 @@ +

       

      +

       

      +
      +

      Copyright (c) SoftEther VPN Project under the Apache License 2.0.

      diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_head.html softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_head.html --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_head.html 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_head.html 2019-07-23 21:37:12.000000000 +0000 @@ -0,0 +1,9 @@ + + SoftEther VPN Server HTML5 Web Administration Console (Under construction!) + + + + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_menu.html softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_menu.html --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_menu.html 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/include_menu.html 2019-07-23 21:37:12.000000000 +0000 @@ -0,0 +1,29 @@ + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/index.html softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/index.html --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/index.html 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/index.html 2019-07-23 21:37:12.000000000 +0000 @@ -0,0 +1,45 @@ + + + + + +
      +

      SoftEther VPN Server HTML5 Ajax-based Web Administration Console
      (Under construction!)

      +

      This is the sample of HTML5 Ajax-based VPN Server Web Administration Console.

      +

      The purpose of this HTML5 admin page is to make administrators easy to set up and manage the running VPN Servers.

      +

      Authentication for this page

      +

      You must supply the HTTP basic authentication credential as following.

      +
        +
      • To login to the VPN server as the entire server administrator, specify empty or "administrator" as the username field, + and specify the server administrative password as the password field.
      • +
      • To login to a particular Virtual Hub as the hub administrator, specify the hub name as the username field, and specify + the hub administrative password as the password field.
      • +
      + +

      Your HTML5 development contribution is very appreciated

      +

      This HTML5 page is obviously under construction, and providing very minimum functions as sample.
      This initial page is written by Daiyuu Nobori (the core developer of SoftEther VPN). He is obviously lack of HTML5 development ability.
      Please kindly consider to contribute for SoftEther VPN's development on GitHub. Your code will help every people running SoftEther VPN Server.

      + +

      This HTML5 page's JavaScript codes directly call SoftEther VPN Server JSON-RPC API on the running VPN Server from the web browser.
      You can also call the SoftEther VPN Server JSON-RPC API remotely from your original application. (JavaScript, TypeScript, C#, Java, Python, Ruby, etc.)

      +

      The insanely kindness API reference is available.

      + +

      List of Virtual Hubs

      +
        + +

        Create new Virtual Hub

        + Virtual Hub Name:
        + + +

        VPN Server Information

        +
          + +

          VPN Server Status

          +
            + +
            + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/default/out_webpack/bundle.js 2019-07-23 21:37:12.000000000 +0000 @@ -0,0 +1,2144 @@ +var JS = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/ts/main.ts"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/base64-js/index.js": +/*!*****************************************!*\ + !*** ./node_modules/base64-js/index.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n for (var i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzPzFmYjUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayhcbiAgICAgIHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aClcbiAgICApKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/base64-js/index.js\n"); + +/***/ }), + +/***/ "./node_modules/buffer/index.js": +/*!**************************************!*\ + !*** ./node_modules/buffer/index.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("/* WEBPACK VAR INJECTION */(function(global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n\n\nvar base64 = __webpack_require__(/*! base64-js */ \"./node_modules/base64-js/index.js\")\nvar ieee754 = __webpack_require__(/*! ieee754 */ \"./node_modules/ieee754/index.js\")\nvar isArray = __webpack_require__(/*! isarray */ \"./node_modules/isarray/index.js\")\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzP2I2MzkiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/buffer/index.js\n"); + +/***/ }), + +/***/ "./node_modules/builtin-status-codes/browser.js": +/*!******************************************************!*\ + !*** ./node_modules/builtin-status-codes/browser.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = {\n \"100\": \"Continue\",\n \"101\": \"Switching Protocols\",\n \"102\": \"Processing\",\n \"200\": \"OK\",\n \"201\": \"Created\",\n \"202\": \"Accepted\",\n \"203\": \"Non-Authoritative Information\",\n \"204\": \"No Content\",\n \"205\": \"Reset Content\",\n \"206\": \"Partial Content\",\n \"207\": \"Multi-Status\",\n \"208\": \"Already Reported\",\n \"226\": \"IM Used\",\n \"300\": \"Multiple Choices\",\n \"301\": \"Moved Permanently\",\n \"302\": \"Found\",\n \"303\": \"See Other\",\n \"304\": \"Not Modified\",\n \"305\": \"Use Proxy\",\n \"307\": \"Temporary Redirect\",\n \"308\": \"Permanent Redirect\",\n \"400\": \"Bad Request\",\n \"401\": \"Unauthorized\",\n \"402\": \"Payment Required\",\n \"403\": \"Forbidden\",\n \"404\": \"Not Found\",\n \"405\": \"Method Not Allowed\",\n \"406\": \"Not Acceptable\",\n \"407\": \"Proxy Authentication Required\",\n \"408\": \"Request Timeout\",\n \"409\": \"Conflict\",\n \"410\": \"Gone\",\n \"411\": \"Length Required\",\n \"412\": \"Precondition Failed\",\n \"413\": \"Payload Too Large\",\n \"414\": \"URI Too Long\",\n \"415\": \"Unsupported Media Type\",\n \"416\": \"Range Not Satisfiable\",\n \"417\": \"Expectation Failed\",\n \"418\": \"I'm a teapot\",\n \"421\": \"Misdirected Request\",\n \"422\": \"Unprocessable Entity\",\n \"423\": \"Locked\",\n \"424\": \"Failed Dependency\",\n \"425\": \"Unordered Collection\",\n \"426\": \"Upgrade Required\",\n \"428\": \"Precondition Required\",\n \"429\": \"Too Many Requests\",\n \"431\": \"Request Header Fields Too Large\",\n \"451\": \"Unavailable For Legal Reasons\",\n \"500\": \"Internal Server Error\",\n \"501\": \"Not Implemented\",\n \"502\": \"Bad Gateway\",\n \"503\": \"Service Unavailable\",\n \"504\": \"Gateway Timeout\",\n \"505\": \"HTTP Version Not Supported\",\n \"506\": \"Variant Also Negotiates\",\n \"507\": \"Insufficient Storage\",\n \"508\": \"Loop Detected\",\n \"509\": \"Bandwidth Limit Exceeded\",\n \"510\": \"Not Extended\",\n \"511\": \"Network Authentication Required\"\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYnVpbHRpbi1zdGF0dXMtY29kZXMvYnJvd3Nlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2J1aWx0aW4tc3RhdHVzLWNvZGVzL2Jyb3dzZXIuanM/OGMwNSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCIxMDBcIjogXCJDb250aW51ZVwiLFxuICBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgXCIxMDJcIjogXCJQcm9jZXNzaW5nXCIsXG4gIFwiMjAwXCI6IFwiT0tcIixcbiAgXCIyMDFcIjogXCJDcmVhdGVkXCIsXG4gIFwiMjAyXCI6IFwiQWNjZXB0ZWRcIixcbiAgXCIyMDNcIjogXCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICBcIjIwNFwiOiBcIk5vIENvbnRlbnRcIixcbiAgXCIyMDVcIjogXCJSZXNldCBDb250ZW50XCIsXG4gIFwiMjA2XCI6IFwiUGFydGlhbCBDb250ZW50XCIsXG4gIFwiMjA3XCI6IFwiTXVsdGktU3RhdHVzXCIsXG4gIFwiMjA4XCI6IFwiQWxyZWFkeSBSZXBvcnRlZFwiLFxuICBcIjIyNlwiOiBcIklNIFVzZWRcIixcbiAgXCIzMDBcIjogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gIFwiMzAxXCI6IFwiTW92ZWQgUGVybWFuZW50bHlcIixcbiAgXCIzMDJcIjogXCJGb3VuZFwiLFxuICBcIjMwM1wiOiBcIlNlZSBPdGhlclwiLFxuICBcIjMwNFwiOiBcIk5vdCBNb2RpZmllZFwiLFxuICBcIjMwNVwiOiBcIlVzZSBQcm94eVwiLFxuICBcIjMwN1wiOiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICBcIjMwOFwiOiBcIlBlcm1hbmVudCBSZWRpcmVjdFwiLFxuICBcIjQwMFwiOiBcIkJhZCBSZXF1ZXN0XCIsXG4gIFwiNDAxXCI6IFwiVW5hdXRob3JpemVkXCIsXG4gIFwiNDAyXCI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLFxuICBcIjQwM1wiOiBcIkZvcmJpZGRlblwiLFxuICBcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLFxuICBcIjQwNVwiOiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLFxuICBcIjQwNlwiOiBcIk5vdCBBY2NlcHRhYmxlXCIsXG4gIFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MDhcIjogXCJSZXF1ZXN0IFRpbWVvdXRcIixcbiAgXCI0MDlcIjogXCJDb25mbGljdFwiLFxuICBcIjQxMFwiOiBcIkdvbmVcIixcbiAgXCI0MTFcIjogXCJMZW5ndGggUmVxdWlyZWRcIixcbiAgXCI0MTJcIjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG4gIFwiNDEzXCI6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgXCI0MTRcIjogXCJVUkkgVG9vIExvbmdcIixcbiAgXCI0MTVcIjogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG4gIFwiNDE2XCI6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gIFwiNDE3XCI6IFwiRXhwZWN0YXRpb24gRmFpbGVkXCIsXG4gIFwiNDE4XCI6IFwiSSdtIGEgdGVhcG90XCIsXG4gIFwiNDIxXCI6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICBcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG4gIFwiNDIzXCI6IFwiTG9ja2VkXCIsXG4gIFwiNDI0XCI6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgXCI0MjVcIjogXCJVbm9yZGVyZWQgQ29sbGVjdGlvblwiLFxuICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcbiAgXCI0MjhcIjogXCJQcmVjb25kaXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MjlcIjogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICBcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgXCI0NTFcIjogXCJVbmF2YWlsYWJsZSBGb3IgTGVnYWwgUmVhc29uc1wiLFxuICBcIjUwMFwiOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICBcIjUwMVwiOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuICBcIjUwMlwiOiBcIkJhZCBHYXRld2F5XCIsXG4gIFwiNTAzXCI6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICBcIjUwNFwiOiBcIkdhdGV3YXkgVGltZW91dFwiLFxuICBcIjUwNVwiOiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCIsXG4gIFwiNTA2XCI6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcbiAgXCI1MDdcIjogXCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiLFxuICBcIjUwOFwiOiBcIkxvb3AgRGV0ZWN0ZWRcIixcbiAgXCI1MDlcIjogXCJCYW5kd2lkdGggTGltaXQgRXhjZWVkZWRcIixcbiAgXCI1MTBcIjogXCJOb3QgRXh0ZW5kZWRcIixcbiAgXCI1MTFcIjogXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCJcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/builtin-status-codes/browser.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/es/promise/index.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/es/promise/index.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("__webpack_require__(/*! ../../modules/es.object.to-string */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n__webpack_require__(/*! ../../modules/es.string.iterator */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n__webpack_require__(/*! ../../modules/web.dom-collections.iterator */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n__webpack_require__(/*! ../../modules/es.promise */ \"./node_modules/core-js/modules/es.promise.js\");\n__webpack_require__(/*! ../../modules/es.promise.finally */ \"./node_modules/core-js/modules/es.promise.finally.js\");\nvar path = __webpack_require__(/*! ../../internals/path */ \"./node_modules/core-js/internals/path.js\");\n\nmodule.exports = path.Promise;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzPzM5ODAiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5Qcm9taXNlO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/es/promise/index.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/es/string/index.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/es/string/index.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("__webpack_require__(/*! ../../modules/es.string.from-code-point */ \"./node_modules/core-js/modules/es.string.from-code-point.js\");\n__webpack_require__(/*! ../../modules/es.string.raw */ \"./node_modules/core-js/modules/es.string.raw.js\");\n__webpack_require__(/*! ../../modules/es.string.code-point-at */ \"./node_modules/core-js/modules/es.string.code-point-at.js\");\n__webpack_require__(/*! ../../modules/es.string.ends-with */ \"./node_modules/core-js/modules/es.string.ends-with.js\");\n__webpack_require__(/*! ../../modules/es.string.includes */ \"./node_modules/core-js/modules/es.string.includes.js\");\n__webpack_require__(/*! ../../modules/es.string.match */ \"./node_modules/core-js/modules/es.string.match.js\");\n__webpack_require__(/*! ../../modules/es.string.match-all */ \"./node_modules/core-js/modules/es.string.match-all.js\");\n__webpack_require__(/*! ../../modules/es.string.pad-end */ \"./node_modules/core-js/modules/es.string.pad-end.js\");\n__webpack_require__(/*! ../../modules/es.string.pad-start */ \"./node_modules/core-js/modules/es.string.pad-start.js\");\n__webpack_require__(/*! ../../modules/es.string.repeat */ \"./node_modules/core-js/modules/es.string.repeat.js\");\n__webpack_require__(/*! ../../modules/es.string.replace */ \"./node_modules/core-js/modules/es.string.replace.js\");\n__webpack_require__(/*! ../../modules/es.string.search */ \"./node_modules/core-js/modules/es.string.search.js\");\n__webpack_require__(/*! ../../modules/es.string.split */ \"./node_modules/core-js/modules/es.string.split.js\");\n__webpack_require__(/*! ../../modules/es.string.starts-with */ \"./node_modules/core-js/modules/es.string.starts-with.js\");\n__webpack_require__(/*! ../../modules/es.string.trim */ \"./node_modules/core-js/modules/es.string.trim.js\");\n__webpack_require__(/*! ../../modules/es.string.trim-start */ \"./node_modules/core-js/modules/es.string.trim-start.js\");\n__webpack_require__(/*! ../../modules/es.string.trim-end */ \"./node_modules/core-js/modules/es.string.trim-end.js\");\n__webpack_require__(/*! ../../modules/es.string.iterator */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n__webpack_require__(/*! ../../modules/es.string.anchor */ \"./node_modules/core-js/modules/es.string.anchor.js\");\n__webpack_require__(/*! ../../modules/es.string.big */ \"./node_modules/core-js/modules/es.string.big.js\");\n__webpack_require__(/*! ../../modules/es.string.blink */ \"./node_modules/core-js/modules/es.string.blink.js\");\n__webpack_require__(/*! ../../modules/es.string.bold */ \"./node_modules/core-js/modules/es.string.bold.js\");\n__webpack_require__(/*! ../../modules/es.string.fixed */ \"./node_modules/core-js/modules/es.string.fixed.js\");\n__webpack_require__(/*! ../../modules/es.string.fontcolor */ \"./node_modules/core-js/modules/es.string.fontcolor.js\");\n__webpack_require__(/*! ../../modules/es.string.fontsize */ \"./node_modules/core-js/modules/es.string.fontsize.js\");\n__webpack_require__(/*! ../../modules/es.string.italics */ \"./node_modules/core-js/modules/es.string.italics.js\");\n__webpack_require__(/*! ../../modules/es.string.link */ \"./node_modules/core-js/modules/es.string.link.js\");\n__webpack_require__(/*! ../../modules/es.string.small */ \"./node_modules/core-js/modules/es.string.small.js\");\n__webpack_require__(/*! ../../modules/es.string.strike */ \"./node_modules/core-js/modules/es.string.strike.js\");\n__webpack_require__(/*! ../../modules/es.string.sub */ \"./node_modules/core-js/modules/es.string.sub.js\");\n__webpack_require__(/*! ../../modules/es.string.sup */ \"./node_modules/core-js/modules/es.string.sup.js\");\nvar path = __webpack_require__(/*! ../../internals/path */ \"./node_modules/core-js/internals/path.js\");\n\nmodule.exports = path.String;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9zdHJpbmcvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3N0cmluZy9pbmRleC5qcz85ODI1Il0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcucmF3Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGgnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnJlcGVhdCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tc3RhcnQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5iaWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmJsaW5rJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5maXhlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuZm9udGNvbG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRhbGljcycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcubGluaycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3ViJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5zdXAnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN0cmluZztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/es/string/index.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/a-function.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/a-function.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanM/MWMwYiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/a-function.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/add-to-unscopables.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/internals/add-to-unscopables.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar create = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n hide(ArrayPrototype, UNSCOPABLES, create(null));\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzPzQ0ZDIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgaGlkZShBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIGNyZWF0ZShudWxsKSk7XG59XG5cbi8vIGFkZCBhIGtleSB0byBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/add-to-unscopables.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/advance-string-index.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/advance-string-index.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar codePointAt = __webpack_require__(/*! ../internals/string-at */ \"./node_modules/core-js/internals/string-at.js\");\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? codePointAt(S, index, true).length : 1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qcz84YWE1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcblxuLy8gYEFkdmFuY2VTdHJpbmdJbmRleGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gY29kZVBvaW50QXQoUywgaW5kZXgsIHRydWUpLmxlbmd0aCA6IDEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/advance-string-index.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/an-instance.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/an-instance.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcz8xOWFhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/an-instance.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/an-object.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/an-object.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzPzgyNWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/an-object.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/array-includes.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/array-includes.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ \"./node_modules/core-js/internals/to-absolute-index.js\");\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\n// false -> Array#indexOf\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n// true -> Array#includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcz80ZDY0Il0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/array-includes.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/bind-context.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/internals/bind-context.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzP2Y4YzIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCk7XG4gICAgfTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/bind-context.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js": +/*!****************************************************************************!*\ + !*** ./node_modules/core-js/internals/call-with-safe-iteration-closing.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n throw error;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcz85YmRkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuICB0cnkge1xuICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/call-with-safe-iteration-closing.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/check-correctness-of-iteration.js": +/*!**************************************************************************!*\ + !*** ./node_modules/core-js/internals/check-correctness-of-iteration.js ***! + \**************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzPzFjN2UiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/check-correctness-of-iteration.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/classof-raw.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/classof-raw.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcz9jNmI2Il0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/classof-raw.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/classof.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/internals/classof.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanM/ZjVkZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/classof.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/copy-constructor-properties.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/internals/copy-constructor-properties.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar ownKeys = __webpack_require__(/*! ../internals/own-keys */ \"./node_modules/core-js/internals/own-keys.js\");\nvar getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzP2U4OTMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/copy-constructor-properties.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/correct-is-regexp-logic.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/internals/correct-is-regexp-logic.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (e) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (f) { /* empty */ }\n } return false;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qcz9hYjEzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICB2YXIgcmVnZXhwID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChmKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/correct-is-regexp-logic.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/correct-prototype-getter.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzP2UxNzciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/correct-prototype-getter.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/create-html.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/create-html.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nvar quot = /\"/g;\n\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\n// https://tc39.github.io/ecma262/#sec-createhtml\nmodule.exports = function (string, tag, attribute, value) {\n var S = String(requireObjectCoercible(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '"') + '\"';\n return p1 + '>' + S + '';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcz84NTdhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgcXVvdCA9IC9cIi9nO1xuXG4vLyBCLjIuMy4yLjEgQ3JlYXRlSFRNTChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWh0bWxcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoc3RyaW5nKSk7XG4gIHZhciBwMSA9ICc8JyArIHRhZztcbiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHF1b3QsICcmcXVvdDsnKSArICdcIic7XG4gIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/create-html.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/create-iterator-constructor.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/internals/create-iterator-constructor.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ \"./node_modules/core-js/internals/iterators-core.js\").IteratorPrototype;\nvar create = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzPzllZDMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/create-iterator-constructor.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/create-property-descriptor.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/internals/create-property-descriptor.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcz81YzZjIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/create-property-descriptor.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/define-iterator.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/internals/define-iterator.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ \"./node_modules/core-js/internals/create-iterator-constructor.js\");\nvar getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ \"./node_modules/core-js/internals/object-get-prototype-of.js\");\nvar setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ \"./node_modules/core-js/internals/object-set-prototype-of.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\nvar IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ \"./node_modules/core-js/internals/iterators-core.js\");\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n hide(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n hide(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzPzdkZDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBoaWRlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGhpZGUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/define-iterator.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/descriptors.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/descriptors.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcz84M2FiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/descriptors.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/document-create-element.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/internals/document-create-element.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar exist = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return exist ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcz9jYzEyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGV4aXN0ID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gZXhpc3QgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/document-create-element.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/dom-iterables.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/dom-iterables.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanM/ZmRiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/dom-iterables.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/enum-bug-keys.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/enum-bug-keys.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanM/NzgzOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/enum-bug-keys.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/export.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/internals/export.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\").f;\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\nvar setGlobal = __webpack_require__(/*! ../internals/set-global */ \"./node_modules/core-js/internals/set-global.js\");\nvar copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ \"./node_modules/core-js/internals/copy-constructor-properties.js\");\nvar isForced = __webpack_require__(/*! ../internals/is-forced */ \"./node_modules/core-js/internals/is-forced.js\");\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n hide(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzPzIzZTciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgaGlkZShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/export.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/fails.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/internals/fails.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcz9kMDM5Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/fails.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js": +/*!******************************************************************************!*\ + !*** ./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return regexMethod.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return regexMethod.call(string, this); }\n );\n if (sham) hide(RegExp.prototype[SYMBOL], 'sham', true);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanM/ZDc4NCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gI3JlcGxhY2UgbmVlZHMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbmFtZWQgZ3JvdXBzLlxuICAvLyAjbWF0Y2ggd29ya3MgZmluZSBiZWNhdXNlIGl0IGp1c3QgcmV0dXJuIHRoZSBleGVjIHJlc3VsdHMsIGV2ZW4gaWYgaXQgaGFzXG4gIC8vIGEgXCJncm9wc1wiIHByb3BlcnR5LlxuICB2YXIgcmUgPSAvLi87XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7XG59KTtcblxuLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4vLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXJcbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUgPSAvKD86KS87XG4gIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3JpZ2luYWxFeGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gIHZhciByZXN1bHQgPSAnYWInLnNwbGl0KHJlKTtcbiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggIT09IDIgfHwgcmVzdWx0WzBdICE9PSAnYScgfHwgcmVzdWx0WzFdICE9PSAnYic7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMsIHNoYW0pIHtcbiAgdmFyIFNZTUJPTCA9IHdlbGxLbm93blN5bWJvbChLRVkpO1xuXG4gIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdHJpbmcgbWV0aG9kcyBjYWxsIHN5bWJvbC1uYW1lZCBSZWdFcCBtZXRob2RzXG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pO1xuXG4gIHZhciBERUxFR0FURVNfVE9fRVhFQyA9IERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTeW1ib2wtbmFtZWQgUmVnRXhwIG1ldGhvZHMgY2FsbCAuZXhlY1xuICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gICAgdmFyIHJlID0gL2EvO1xuICAgIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IGV4ZWNDYWxsZWQgPSB0cnVlOyByZXR1cm4gbnVsbDsgfTtcblxuICAgIGlmIChLRVkgPT09ICdzcGxpdCcpIHtcbiAgICAgIC8vIFJlZ0V4cFtAQHNwbGl0XSBkb2Vzbid0IGNhbGwgdGhlIHJlZ2V4J3MgZXhlYyBtZXRob2QsIGJ1dCBmaXJzdCBjcmVhdGVzXG4gICAgICAvLyBhIG5ldyBvbmUuIFdlIG5lZWQgdG8gcmV0dXJuIHRoZSBwYXRjaGVkIHJlZ2V4IHdoZW4gY3JlYXRpbmcgdGhlIG5ldyBvbmUuXG4gICAgICByZS5jb25zdHJ1Y3RvciA9IHt9O1xuICAgICAgcmUuY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZTsgfTtcbiAgICB9XG5cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIChLRVkgPT09ICdyZXBsYWNlJyAmJiAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMpIHx8XG4gICAgKEtFWSA9PT0gJ3NwbGl0JyAmJiAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDKVxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIG1ldGhvZHMgPSBleGVjKFNZTUJPTCwgJydbS0VZXSwgZnVuY3Rpb24gKG5hdGl2ZU1ldGhvZCwgcmVnZXhwLCBzdHIsIGFyZzIsIGZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHtcbiAgICAgICAgaWYgKERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgICAgLy8gVGhlIG5hdGl2ZSBTdHJpbmcgbWV0aG9kIGFscmVhZHkgZGVsZWdhdGVzIHRvIEBAbWV0aG9kICh0aGlzXG4gICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgIC8vIFdlIGF2b2lkIGl0IGJ5IGRpcmVjdGx5IGNhbGxpbmcgdGhlIG5hdGl2ZSBAQG1ldGhvZCBtZXRob2QuXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZVJlZ0V4cE1ldGhvZC5jYWxsKHJlZ2V4cCwgc3RyLCBhcmcyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVNZXRob2QuY2FsbChzdHIsIHJlZ2V4cCwgYXJnMikgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07XG4gICAgfSk7XG4gICAgdmFyIHN0cmluZ01ldGhvZCA9IG1ldGhvZHNbMF07XG4gICAgdmFyIHJlZ2V4TWV0aG9kID0gbWV0aG9kc1sxXTtcblxuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyaW5nTWV0aG9kKTtcbiAgICByZWRlZmluZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJlZ2V4TWV0aG9kLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcmVnZXhNZXRob2QuY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgICBpZiAoc2hhbSkgaGlkZShSZWdFeHAucHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/forced-string-html-method.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/internals/forced-string-html-method.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\n// check the existence of a method, lowercase\n// of a tag and escaping quotes in arguments\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n var test = ''[METHOD_NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanM/ZWFlOSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiBhIG1ldGhvZCwgbG93ZXJjYXNlXG4vLyBvZiBhIHRhZyBhbmQgZXNjYXBpbmcgcXVvdGVzIGluIGFyZ3VtZW50c1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgcmV0dXJuIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGVzdCA9ICcnW01FVEhPRF9OQU1FXSgnXCInKTtcbiAgICByZXR1cm4gdGVzdCAhPT0gdGVzdC50b0xvd2VyQ2FzZSgpIHx8IHRlc3Quc3BsaXQoJ1wiJykubGVuZ3RoID4gMztcbiAgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/forced-string-html-method.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/forced-string-trim-method.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/internals/forced-string-trim-method.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar whitespaces = __webpack_require__(/*! ../internals/whitespaces */ \"./node_modules/core-js/internals/whitespaces.js\");\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy10cmltLW1ldGhvZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QuanM/ZTA3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgbm9uID0gJ1xcdTIwMEJcXHUwMDg1XFx1MTgwRSc7XG5cbi8vIGNoZWNrIHRoYXQgYSBtZXRob2Qgd29ya3Mgd2l0aCB0aGUgY29ycmVjdCBsaXN0XG4vLyBvZiB3aGl0ZXNwYWNlcyBhbmQgaGFzIGEgY29ycmVjdCBuYW1lXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICByZXR1cm4gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXSgpIHx8IG5vbltNRVRIT0RfTkFNRV0oKSAhPSBub24gfHwgd2hpdGVzcGFjZXNbTUVUSE9EX05BTUVdLm5hbWUgIT09IE1FVEhPRF9OQU1FO1xuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/forced-string-trim-method.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-to-string.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/internals/function-to-string.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\n\nmodule.exports = shared('native-function-to-string', Function.toString);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nLmpzPzllODEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzaGFyZWQoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/function-to-string.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/get-built-in.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/internals/get-built-in.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var path = __webpack_require__(/*! ../internals/path */ \"./node_modules/core-js/internals/path.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzP2QwNjYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlID09ICdmdW5jdGlvbicgPyB2YXJpYWJsZSA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSlcbiAgICA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/get-built-in.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/get-iterator-method.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/internals/get-iterator-method.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanM/MzVhMSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/get-iterator-method.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/global.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/internals/global.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("/* WEBPACK VAR INJECTION */(function(global) {var O = 'object';\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == O && globalThis) ||\n check(typeof window == O && window) ||\n check(typeof self == O && self) ||\n check(typeof global == O && global) ||\n // eslint-disable-next-line no-new-func\n Function('return this')();\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzP2RhODQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIE8gPSAnb2JqZWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09IE8gJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSBPICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gTyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09IE8gJiYgZ2xvYmFsKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/global.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/has.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/internals/has.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzPzUxMzUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/has.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/hidden-keys.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/hidden-keys.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcz9kMDEyIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge307XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/hidden-keys.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/hide.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/internals/hide.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGUuanM/NWY2NSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/hide.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/host-report-errors.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/internals/host-report-errors.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzPzQ0ZGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGNvbnNvbGUuZXJyb3IoYSkgOiBjb25zb2xlLmVycm9yKGEsIGIpO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/host-report-errors.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/html.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/internals/html.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nvar document = global.document;\n\nmodule.exports = document && document.documentElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanM/MWJlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/html.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/ie8-dom-define.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/ie8-dom-define.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar createElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcz8wY2ZiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/ie8-dom-define.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/indexed-object.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/indexed-object.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\n\nvar split = ''.split;\n\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcz80NGFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbnZhciBzcGxpdCA9ICcnLnNwbGl0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/indexed-object.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/internal-state.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/internal-state.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ \"./node_modules/core-js/internals/native-weak-map.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar objectHas = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n hide(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcz82OWYzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVApIHtcbiAgdmFyIHN0b3JlID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIHdtZ2V0ID0gc3RvcmUuZ2V0O1xuICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7XG4gIHZhciB3bXNldCA9IHN0b3JlLnNldDtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSwgaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21oYXMuY2FsbChzdG9yZSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBoaWRlKGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/internal-state.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-array-iterator-method.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/is-array-iterator-method.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzP2U5NWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-array-iterator-method.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-forced.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/is-forced.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzPzk0Y2EiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-forced.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-object.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/is-object.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzPzg2MWQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-object.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-pure.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/internals/is-pure.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanM/YzQzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-pure.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-regexp.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/is-regexp.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzPzQ0ZTciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG4vLyBgSXNSZWdFeHBgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNyZWdleHBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNsYXNzb2YoaXQpID09ICdSZWdFeHAnKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/is-regexp.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/iterate.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/internals/iterate.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ \"./node_modules/core-js/internals/is-array-iterator-method.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar bind = __webpack_require__(/*! ../internals/bind-context */ \"./node_modules/core-js/internals/bind-context.js\");\nvar getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ \"./node_modules/core-js/internals/get-iterator-method.js\");\nvar callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ \"./node_modules/core-js/internals/call-with-safe-iteration-closing.js\");\n\nvar BREAK = {};\n\nvar exports = module.exports = function (iterable, fn, that, ENTRIES, ITERATOR) {\n var boundFunction = bind(fn, that, ENTRIES ? 2 : 1);\n var iterator, iterFn, index, length, result, step;\n\n if (ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]);\n if (result === BREAK) return BREAK;\n } return;\n }\n iterator = iterFn.call(iterable);\n }\n\n while (!(step = iterator.next()).done) {\n if (callWithSafeIterationClosing(iterator, boundFunction, step.value, ENTRIES) === BREAK) return BREAK;\n }\n};\n\nexports.BREAK = BREAK;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanM/MjI2NiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcblxudmFyIEJSRUFLID0ge307XG5cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGZuLCB0aGF0LCBFTlRSSUVTLCBJVEVSQVRPUikge1xuICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoZm4sIHRoYXQsIEVOVFJJRVMgPyAyIDogMSk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIHN0ZXA7XG5cbiAgaWYgKElURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBhcnJheSBpdGVyYXRvcnNcbiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBFTlRSSUVTID8gYm91bmRGdW5jdGlvbihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBib3VuZEZ1bmN0aW9uKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IEJSRUFLKSByZXR1cm4gQlJFQUs7XG4gICAgICB9IHJldHVybjtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7XG4gIH1cblxuICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgaWYgKGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIGJvdW5kRnVuY3Rpb24sIHN0ZXAudmFsdWUsIEVOVFJJRVMpID09PSBCUkVBSykgcmV0dXJuIEJSRUFLO1xuICB9XG59O1xuXG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/iterate.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/iterators-core.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/iterators-core.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ \"./node_modules/core-js/internals/object-get-prototype-of.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcz9hZTkzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxuaWYgKEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbmlmICghSVNfUFVSRSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIGhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/iterators-core.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/iterators.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/iterators.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzPzNmOGMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/iterators.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/microtask.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/microtask.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\").f;\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar macrotask = __webpack_require__(/*! ../internals/task */ \"./node_modules/core-js/internals/task.js\").set;\nvar userAgent = __webpack_require__(/*! ../internals/user-agent */ \"./node_modules/core-js/internals/user-agent.js\");\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar IS_NODE = classof(process) == 'process';\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n } else if (MutationObserver && !/(iphone|ipod|ipad).*applewebkit/i.test(userAgent)) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzP2I1NzUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2VyLWFnZW50Jyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBJU19OT0RFID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlO1xuXG52YXIgZmx1c2gsIGhlYWQsIGxhc3QsIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFxdWV1ZU1pY3JvdGFzaykge1xuICBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoSVNfTk9ERSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChNdXRhdGlvbk9ic2VydmVyICYmICEvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KSkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/microtask.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/native-symbol.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/native-symbol.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wuanM/NDkzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/native-symbol.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/native-weak-map.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/internals/native-weak-map.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ \"./node_modules/core-js/internals/function-to-string.js\");\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzPzdmOWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoV2Vha01hcCkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/native-weak-map.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/new-promise-capability.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/internals/new-promise-capability.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanM/ZjA2OSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG5cbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/new-promise-capability.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-create.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/object-create.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ \"./node_modules/core-js/internals/object-define-properties.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\nvar html = __webpack_require__(/*! ../internals/html */ \"./node_modules/core-js/internals/html.js\");\nvar documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar PROTOTYPE = 'prototype';\nvar Empty = function () { /* empty */ };\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var length = enumBugKeys.length;\n var lt = '<';\n var script = 'script';\n var gt = '>';\n var js = 'java' + script + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n iframe.src = String(js);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];\n return createDict();\n};\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\nhiddenKeys[IE_PROTO] = true;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanM/N2M3MyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBzY3JpcHQgPSAnc2NyaXB0JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhqcyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyBzY3JpcHQgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvJyArIHNjcmlwdCArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-create.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-define-properties.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/object-define-properties.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar objectKeys = __webpack_require__(/*! ../internals/object-keys */ \"./node_modules/core-js/internals/object-keys.js\");\n\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var i = 0;\n var key;\n while (length > i) definePropertyModule.f(O, key = keys[i++], Properties[key]);\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzPzM3ZTgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2krK10sIFByb3BlcnRpZXNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-define-properties.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-define-property.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/internals/object-define-property.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ \"./node_modules/core-js/internals/ie8-dom-define.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ \"./node_modules/core-js/internals/to-primitive.js\");\n\nvar nativeDefineProperty = Object.defineProperty;\n\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanM/OWJmMiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-define-property.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-own-property-descriptor.js": +/*!******************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ \"./node_modules/core-js/internals/object-property-is-enumerable.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ \"./node_modules/core-js/internals/to-primitive.js\");\nvar has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ \"./node_modules/core-js/internals/ie8-dom-define.js\");\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanM/MDZjZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-get-own-property-descriptor.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-own-property-names.js": +/*!*************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-own-property-names.js ***! + \*************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ \"./node_modules/core-js/internals/object-keys-internal.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcz8yNDFjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-get-own-property-names.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-own-property-symbols.js": +/*!***************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("exports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanM/NzQxOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-get-own-property-symbols.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-prototype-of.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ \"./node_modules/core-js/internals/correct-prototype-getter.js\");\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcz9lMTYzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-get-prototype-of.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-keys-internal.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/object-keys-internal.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar arrayIncludes = __webpack_require__(/*! ../internals/array-includes */ \"./node_modules/core-js/internals/array-includes.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\n\nvar arrayIndexOf = arrayIncludes(false);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcz9jYTg0Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIGFycmF5SW5kZXhPZiA9IGFycmF5SW5jbHVkZXMoZmFsc2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-keys-internal.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-keys.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/object-keys.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ \"./node_modules/core-js/internals/object-keys-internal.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcz9kZjc1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-keys.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-property-is-enumerable.js": +/*!*************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***! + \*************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcz9kMWU3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-property-is-enumerable.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-set-prototype-of.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var validateSetPrototypeOfArguments = __webpack_require__(/*! ../internals/validate-set-prototype-of-arguments */ \"./node_modules/core-js/internals/validate-set-prototype-of-arguments.js\");\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var correctSetter = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n correctSetter = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n validateSetPrototypeOfArguments(O, proto);\n if (correctSetter) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcz9kMmJiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB2YWxpZGF0ZVNldFByb3RvdHlwZU9mQXJndW1lbnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLXNldC1wcm90b3R5cGUtb2YtYXJndW1lbnRzJyk7XG5cbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvcnJlY3RTZXR0ZXIgPSBmYWxzZTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdmFyIHNldHRlcjtcbiAgdHJ5IHtcbiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7XG4gICAgc2V0dGVyLmNhbGwodGVzdCwgW10pO1xuICAgIGNvcnJlY3RTZXR0ZXIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyhPLCBwcm90byk7XG4gICAgaWYgKGNvcnJlY3RTZXR0ZXIpIHNldHRlci5jYWxsKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-set-prototype-of.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-to-string.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/internals/object-to-string.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = String(test) !== '[object z]' ? function toString() {\n return '[object ' + classof(this) + ']';\n} : test.toString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcuanM/YjA0MSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgIT09ICdbb2JqZWN0IHpdJyA/IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG59IDogdGVzdC50b1N0cmluZztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/object-to-string.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/own-keys.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/internals/own-keys.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ \"./node_modules/core-js/internals/object-get-own-property-names.js\");\nvar getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ \"./node_modules/core-js/internals/object-get-own-property-symbols.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\nvar Reflect = global.Reflect;\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcz81NmVmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbnZhciBSZWZsZWN0ID0gZ2xvYmFsLlJlZmxlY3Q7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/own-keys.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/path.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/internals/path.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("module.exports = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanM/NDI4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/path.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/perform.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/internals/perform.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanM/ZTY2NyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCB2YWx1ZTogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9O1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/perform.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/promise-resolve.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/internals/promise-resolve.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ \"./node_modules/core-js/internals/new-promise-capability.js\");\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzP2NkZjkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/promise-resolve.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/redefine-all.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/internals/redefine-all.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzP2UyY2MiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/redefine-all.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/redefine.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/internals/redefine.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar setGlobal = __webpack_require__(/*! ../internals/set-global */ \"./node_modules/core-js/internals/set-global.js\");\nvar nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ \"./node_modules/core-js/internals/function-to-string.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(nativeFunctionToString).split('toString');\n\nshared('inspectSource', function (it) {\n return nativeFunctionToString.call(it);\n});\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else hide(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcz82ZWViIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcpLnNwbGl0KCd0b1N0cmluZycpO1xuXG5zaGFyZWQoJ2luc3BlY3RTb3VyY2UnLCBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7XG59KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiAhaGFzKHZhbHVlLCAnbmFtZScpKSBoaWRlKHZhbHVlLCAnbmFtZScsIGtleSk7XG4gICAgZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpLnNvdXJjZSA9IFRFTVBMQVRFLmpvaW4odHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/IGtleSA6ICcnKTtcbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGhpZGUoTywga2V5LCB2YWx1ZSk7XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/redefine.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/regexp-exec-abstract.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/regexp-exec-abstract.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var classof = __webpack_require__(/*! ./classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar regexpExec = __webpack_require__(/*! ./regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdC5qcz8xNGMzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9jbGFzc29mLXJhdycpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL3JlZ2V4cC1leGVjJyk7XG5cbi8vIGBSZWdFeHBFeGVjYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cGV4ZWNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIsIFMpIHtcbiAgdmFyIGV4ZWMgPSBSLmV4ZWM7XG4gIGlmICh0eXBlb2YgZXhlYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZ0V4cCBleGVjIG1ldGhvZCByZXR1cm5lZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBPYmplY3Qgb3IgbnVsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKGNsYXNzb2YoUikgIT09ICdSZWdFeHAnKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7XG4gIH1cblxuICByZXR1cm4gcmVnZXhwRXhlYy5jYWxsKFIsIFMpO1xufTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/regexp-exec-abstract.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/regexp-exec.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/regexp-exec.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar regexpFlags = __webpack_require__(/*! ./regexp-flags */ \"./node_modules/core-js/internals/regexp-flags.js\");\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcz85MjYzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciByZWdleHBGbGFncyA9IHJlcXVpcmUoJy4vcmVnZXhwLWZsYWdzJyk7XG5cbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuLy8gVGhpcyBhbHdheXMgcmVmZXJzIHRvIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJlY2F1c2UgdGhlXG4vLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyxcbi8vIHdoaWNoIGxvYWRzIHRoaXMgZmlsZSBiZWZvcmUgcGF0Y2hpbmcgdGhlIG1ldGhvZC5cbnZhciBuYXRpdmVSZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xuXG52YXIgcGF0Y2hlZEV4ZWMgPSBuYXRpdmVFeGVjO1xuXG52YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlMSA9IC9hLztcbiAgdmFyIHJlMiA9IC9iKi9nO1xuICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpO1xuICBuYXRpdmVFeGVjLmNhbGwocmUyLCAnYScpO1xuICByZXR1cm4gcmUxLmxhc3RJbmRleCAhPT0gMCB8fCByZTIubGFzdEluZGV4ICE9PSAwO1xufSkoKTtcblxuLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXAsIGNvcGllZCBmcm9tIGVzNS1zaGltJ3MgU3RyaW5nI3NwbGl0IHBhdGNoLlxudmFyIE5QQ0dfSU5DTFVERUQgPSAvKCk/Py8uZXhlYygnJylbMV0gIT09IHVuZGVmaW5lZDtcblxudmFyIFBBVENIID0gVVBEQVRFU19MQVNUX0lOREVYX1dST05HIHx8IE5QQ0dfSU5DTFVERUQ7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4LCByZUNvcHksIG1hdGNoLCBpO1xuXG4gICAgaWYgKE5QQ0dfSU5DTFVERUQpIHtcbiAgICAgIHJlQ29weSA9IG5ldyBSZWdFeHAoJ14nICsgcmUuc291cmNlICsgJyQoPyFcXFxccyknLCByZWdleHBGbGFncy5jYWxsKHJlKSk7XG4gICAgfVxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcpIGxhc3RJbmRleCA9IHJlLmxhc3RJbmRleDtcblxuICAgIG1hdGNoID0gbmF0aXZlRXhlYy5jYWxsKHJlLCBzdHIpO1xuXG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkge1xuICAgICAgcmUubGFzdEluZGV4ID0gcmUuZ2xvYmFsID8gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggOiBsYXN0SW5kZXg7XG4gICAgfVxuICAgIGlmIChOUENHX0lOQ0xVREVEICYmIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgXG4gICAgICAvLyBmb3IgTlBDRywgbGlrZSBJRTguIE5PVEU6IFRoaXMgZG9lc24nIHdvcmsgZm9yIC8oLj8pPy9cbiAgICAgIG5hdGl2ZVJlcGxhY2UuY2FsbChtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoZWRFeGVjO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/regexp-exec.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/regexp-flags.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/internals/regexp-flags.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzP2FkNmQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXQtcmVnZXhwLnByb3RvdHlwZS5mbGFnc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKHRoYXQuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuICBpZiAodGhhdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnN0aWNreSkgcmVzdWx0ICs9ICd5JztcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/regexp-flags.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/require-object-coercible.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/require-object-coercible.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzPzFkODAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/require-object-coercible.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/same-value.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/same-value.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUuanM/MTI5ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBgU2FtZVZhbHVlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNhbWV2YWx1ZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB4ID09PSB5ID8geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9IHggJiYgeSAhPSB5O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/same-value.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/set-global.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/set-global.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\n\nmodule.exports = function (key, value) {\n try {\n hide(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LWdsb2JhbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanM/Y2U0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgaGlkZShnbG9iYWwsIGtleSwgdmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/set-global.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/set-species.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/set-species.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var C = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n if (DESCRIPTORS && C && !C[SPECIES]) defineProperty(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcz8yNjI2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7XG4gIHZhciBDID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRlZmluZVByb3BlcnR5KEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/set-species.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/set-to-string-tag.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/set-to-string-tag.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f;\nvar has = __webpack_require__(/*! ../internals/has */ \"./node_modules/core-js/internals/has.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcz9kNDRlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/set-to-string-tag.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/shared-key.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/shared-key.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar uid = __webpack_require__(/*! ../internals/uid */ \"./node_modules/core-js/internals/uid.js\");\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanM/Zjc3MiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/shared-key.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/shared.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/internals/shared.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar setGlobal = __webpack_require__(/*! ../internals/set-global */ \"./node_modules/core-js/internals/set-global.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.1.3',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzPzU2OTIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4xLjMnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/shared.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/species-constructor.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/internals/species-constructor.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanM/NDg0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29uc3RydWN0b3IgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/species-constructor.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/string-at.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/string-at.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\n// CONVERT_TO_STRING: true -> String#at\n// CONVERT_TO_STRING: false -> String#codePointAt\nmodule.exports = function (that, pos, CONVERT_TO_STRING) {\n var S = String(requireObjectCoercible(that));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLWF0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLWF0LmpzP2U1ZDUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gQ09OVkVSVF9UT19TVFJJTkc6IHRydWUgIC0+IFN0cmluZyNhdFxuLy8gQ09OVkVSVF9UT19TVFJJTkc6IGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgcG9zLCBDT05WRVJUX1RPX1NUUklORykge1xuICB2YXIgUyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoYXQpKTtcbiAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7XG4gIHZhciBzaXplID0gUy5sZW5ndGg7XG4gIHZhciBmaXJzdCwgc2Vjb25kO1xuICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpIHJldHVybiBDT05WRVJUX1RPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICBmaXJzdCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbik7XG4gIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICB8fCAoc2Vjb25kID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgPyBDT05WRVJUX1RPX1NUUklORyA/IFMuY2hhckF0KHBvc2l0aW9uKSA6IGZpcnN0XG4gICAgICA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/string-at.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/string-pad.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/string-pad.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar repeat = __webpack_require__(/*! ../internals/string-repeat */ \"./node_modules/core-js/internals/string-repeat.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(requireObjectCoercible(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n var fillLen, stringFiller;\n if (intMaxLength <= stringLength || fillStr == '') return S;\n fillLen = intMaxLength - stringLength;\n stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXBhZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQuanM/MGNjYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nLCBsZWZ0KSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpO1xuICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgdmFyIGZpbGxMZW4sIHN0cmluZ0ZpbGxlcjtcbiAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7XG4gIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGg7XG4gIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIE1hdGguY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKSBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gIHJldHVybiBsZWZ0ID8gc3RyaW5nRmlsbGVyICsgUyA6IFMgKyBzdHJpbmdGaWxsZXI7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/string-pad.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/string-repeat.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/string-repeat.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanM/MTE0OCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcbm1vZHVsZS5leHBvcnRzID0gJycucmVwZWF0IHx8IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpO1xuICBmb3IgKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpIGlmIChuICYgMSkgcmVzdWx0ICs9IHN0cjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/string-repeat.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/string-trim.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/string-trim.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar whitespaces = __webpack_require__(/*! ../internals/whitespaces */ \"./node_modules/core-js/internals/whitespaces.js\");\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// 1 -> String#trimStart\n// 2 -> String#trimEnd\n// 3 -> String#trim\nmodule.exports = function (string, TYPE) {\n string = String(requireObjectCoercible(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcz81OGE4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciB3aGl0ZXNwYWNlID0gJ1snICsgd2hpdGVzcGFjZXMgKyAnXSc7XG52YXIgbHRyaW0gPSBSZWdFeHAoJ14nICsgd2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyokJyk7XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1TdGFydFxuLy8gMiAtPiBTdHJpbmcjdHJpbUVuZFxuLy8gMyAtPiBTdHJpbmcjdHJpbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/string-trim.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/task.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/internals/task.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar bind = __webpack_require__(/*! ../internals/bind-context */ \"./node_modules/core-js/internals/bind-context.js\");\nvar html = __webpack_require__(/*! ../internals/html */ \"./node_modules/core-js/internals/html.js\");\nvar createElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (classof(process) == 'process') {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanM/MmNmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG52YXIgbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247XG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4oZXZlbnQuZGF0YSk7XG59O1xuXG52YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW5cbiAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsIGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiYgIWZhaWxzKHBvc3QpKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/task.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-absolute-index.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/to-absolute-index.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcz8yM2NiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4obGVuZ3RoLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-absolute-index.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-indexed-object.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/to-indexed-object.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ \"./node_modules/core-js/internals/indexed-object.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcz9mYzZhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-indexed-object.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-integer.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/to-integer.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanM/YTY5MSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9pbnRlZ2VyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-integer.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-length.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/to-length.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzPzUwYzQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlcihhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-length.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-object.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/to-object.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzPzdiMGIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-object.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-primitive.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/internals/to-primitive.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzP2MwNGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG4vLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/to-primitive.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/uid.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/internals/uid.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + postfix).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzPzkwZTMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcG9zdGZpeCkudG9TdHJpbmcoMzYpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/uid.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/user-agent.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/user-agent.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlci1hZ2VudC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZXItYWdlbnQuanM/YjM5YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/user-agent.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/validate-set-prototype-of-arguments.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/core-js/internals/validate-set-prototype-of-arguments.js ***! + \*******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\nmodule.exports = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) {\n throw TypeError(\"Can't set \" + String(proto) + ' as a prototype');\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtc2V0LXByb3RvdHlwZS1vZi1hcmd1bWVudHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cy5qcz8yZTFhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKHByb3RvKSArICcgYXMgYSBwcm90b3R5cGUnKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/validate-set-prototype-of-arguments.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/validate-string-method-arguments.js": +/*!****************************************************************************!*\ + !*** ./node_modules/core-js/internals/validate-string-method-arguments.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(/*! ../internals/is-regexp */ \"./node_modules/core-js/internals/is-regexp.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) {\n throw TypeError('String.prototype.' + NAME + \" doesn't accept regex\");\n } return String(requireObjectCoercible(that));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtc3RyaW5nLW1ldGhvZC1hcmd1bWVudHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cy5qcz8zNDBlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGhlbHBlciBmb3IgU3RyaW5nI3tzdGFydHNXaXRoLCBlbmRzV2l0aCwgaW5jbHVkZXN9XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKSB7XG4gIGlmIChpc1JlZ0V4cChzZWFyY2hTdHJpbmcpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmcucHJvdG90eXBlLicgKyBOQU1FICsgXCIgZG9lc24ndCBhY2NlcHQgcmVnZXhcIik7XG4gIH0gcmV0dXJuIFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoYXQpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/validate-string-method-arguments.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/webkit-string-pad-bug.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/internals/webkit-string-pad-bug.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// https://github.com/zloirock/core-js/issues/280\nvar userAgent = __webpack_require__(/*! ../internals/user-agent */ \"./node_modules/core-js/internals/user-agent.js\");\n\n// eslint-disable-next-line unicorn/no-unsafe-regex\nmodule.exports = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnLmpzPzY5OWMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2VyLWFnZW50Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXVuc2FmZS1yZWdleFxubW9kdWxlLmV4cG9ydHMgPSAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8oIE1vYmlsZVxcL1xcdyspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/webkit-string-pad-bug.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/well-known-symbol.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/well-known-symbol.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar uid = __webpack_require__(/*! ../internals/uid */ \"./node_modules/core-js/internals/uid.js\");\nvar NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ \"./node_modules/core-js/internals/native-symbol.js\");\n\nvar Symbol = global.Symbol;\nvar store = shared('wks');\n\nmodule.exports = function (name) {\n return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name]\n || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcz9iNjIyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgc3RvcmUgPSBzaGFyZWQoJ3drcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIFN5bWJvbFtuYW1lXVxuICAgIHx8IChOQVRJVkVfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/well-known-symbol.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/internals/whitespaces.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/whitespaces.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcz81ODk5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxubW9kdWxlLmV4cG9ydHMgPSAnXFx1MDAwOVxcdTAwMEFcXHUwMDBCXFx1MDAwQ1xcdTAwMERcXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/internals/whitespaces.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.array.iterator.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es.array.iterator.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ \"./node_modules/core-js/internals/add-to-unscopables.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar defineIterator = __webpack_require__(/*! ../internals/define-iterator */ \"./node_modules/core-js/internals/define-iterator.js\");\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzP2UyNjAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.array.iterator.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.object.to-string.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es.object.to-string.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var redefine = __webpack_require__(/*! ../internals/redefine */ \"./node_modules/core-js/internals/redefine.js\");\nvar toString = __webpack_require__(/*! ../internals/object-to-string */ \"./node_modules/core-js/internals/object-to-string.js\");\n\nvar ObjectPrototype = Object.prototype;\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (toString !== ObjectPrototype.toString) {\n redefine(ObjectPrototype, 'toString', toString, { unsafe: true });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcz9kM2I3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcblxudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICh0b1N0cmluZyAhPT0gT2JqZWN0UHJvdG90eXBlLnRvU3RyaW5nKSB7XG4gIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3RvU3RyaW5nJywgdG9TdHJpbmcsIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.object.to-string.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.promise.finally.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es.promise.finally.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ \"./node_modules/core-js/internals/promise-resolve.js\");\n\n// `Promise.prototype.finally` method\n// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanM/YTc5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.promise.finally.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.promise.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/es.promise.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar path = __webpack_require__(/*! ../internals/path */ \"./node_modules/core-js/internals/path.js\");\nvar redefineAll = __webpack_require__(/*! ../internals/redefine-all */ \"./node_modules/core-js/internals/redefine-all.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar setSpecies = __webpack_require__(/*! ../internals/set-species */ \"./node_modules/core-js/internals/set-species.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\nvar anInstance = __webpack_require__(/*! ../internals/an-instance */ \"./node_modules/core-js/internals/an-instance.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar iterate = __webpack_require__(/*! ../internals/iterate */ \"./node_modules/core-js/internals/iterate.js\");\nvar checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ \"./node_modules/core-js/internals/check-correctness-of-iteration.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar task = __webpack_require__(/*! ../internals/task */ \"./node_modules/core-js/internals/task.js\").set;\nvar microtask = __webpack_require__(/*! ../internals/microtask */ \"./node_modules/core-js/internals/microtask.js\");\nvar promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ \"./node_modules/core-js/internals/promise-resolve.js\");\nvar hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ \"./node_modules/core-js/internals/host-report-errors.js\");\nvar newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ \"./node_modules/core-js/internals/new-promise-capability.js\");\nvar perform = __webpack_require__(/*! ../internals/perform */ \"./node_modules/core-js/internals/perform.js\");\nvar userAgent = __webpack_require__(/*! ../internals/user-agent */ \"./node_modules/core-js/internals/user-agent.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar isForced = __webpack_require__(/*! ../internals/is-forced */ \"./node_modules/core-js/internals/is-forced.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = global[PROMISE];\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = global.fetch;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar IS_NODE = classof(process) == 'process';\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper;\n\nvar FORCED = isForced(PROMISE, function () {\n // correct subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var empty = function () { /* empty */ };\n var FakePromise = (promise.constructor = {})[SPECIES] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return !((IS_NODE || typeof PromiseRejectionEvent == 'function')\n && (!IS_PURE || promise['finally'])\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (promise, state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(promise, state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (handler = global['on' + name]) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (promise, state) {\n task.call(global, function () {\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (promise, state) {\n task.call(global, function () {\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, promise, state, unwrap) {\n return function (value) {\n fn(promise, state, value, unwrap);\n };\n};\n\nvar internalReject = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(promise, state, true);\n};\n\nvar internalResolve = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, promise, wrapper, state),\n bind(internalReject, promise, wrapper, state)\n );\n } catch (error) {\n internalReject(promise, wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(promise, state, false);\n }\n } catch (error) {\n internalReject(promise, { done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n } catch (error) {\n internalReject(this, state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(this, state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, promise, state);\n this.reject = bind(internalReject, promise, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n // wrap fetch result\n if (!IS_PURE && typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = path[PROMISE];\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcz9lNmNmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlci1hZ2VudCcpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJGZldGNoID0gZ2xvYmFsLmZldGNoO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xudmFyIElTX05PREUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbC5kaXNwYXRjaEV2ZW50KTtcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyO1xuXG52YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkge1xuICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlQ29uc3RydWN0b3IucmVzb2x2ZSgxKTtcbiAgdmFyIGVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtTUEVDSUVTXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICB9O1xuICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gIHJldHVybiAhKChJU19OT0RFIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJylcbiAgICAmJiAoIUlTX1BVUkUgfHwgcHJvbWlzZVsnZmluYWxseSddKVxuICAgICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZVxuICAgIC8vIHY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAvLyB3ZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICAgICYmIHY4LmluZGV4T2YoJzYuNicpICE9PSAwXG4gICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMSk7XG59KTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcblxudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgaXNSZWplY3QpIHtcbiAgaWYgKHN0YXRlLm5vdGlmaWVkKSByZXR1cm47XG4gIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gc3RhdGUucmVhY3Rpb25zO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBvayA9IHN0YXRlLnN0YXRlID09IEZVTEZJTExFRDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UsIHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIG1heSB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpKSBydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmIChoYW5kbGVyID0gZ2xvYmFsWydvbicgKyBuYW1lXSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoSVNfVU5IQU5ETEVEKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKElTX05PREUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50O1xufTtcblxudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoUkVKRUNUSU9OX0hBTkRMRUQsIHByb21pc2UsIHN0YXRlLnZhbHVlKTtcbiAgfSk7XG59O1xuXG52YXIgYmluZCA9IGZ1bmN0aW9uIChmbiwgcHJvbWlzZSwgc3RhdGUsIHVud3JhcCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm4ocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApO1xuICB9O1xufTtcblxudmFyIGludGVybmFsUmVqZWN0ID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgc3RhdGUuc3RhdGUgPSBSRUpFQ1RFRDtcbiAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCB0cnVlKTtcbn07XG5cbnZhciBpbnRlcm5hbFJlc29sdmUgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgdmFyIHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKTtcbiAgICBpZiAodGhlbikge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IGRvbmU6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHdyYXBwZXIsIHN0YXRlKSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHdyYXBwZXIsIHN0YXRlKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaW50ZXJuYWxSZWplY3QocHJvbWlzZSwgd3JhcHBlciwgZXJyb3IsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgICBzdGF0ZS5zdGF0ZSA9IEZVTEZJTExFRDtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBzdGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7XG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoRk9SQ0VEKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gIFByb21pc2VDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB0aGlzLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHRoaXMsIHN0YXRlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHRoaXMsIHN0YXRlLCBlcnJvcik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBbXSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZSwge1xuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWFjdGlvbnMucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHRoaXMsIHN0YXRlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBwcm9taXNlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBwcm9taXNlLCBzdGF0ZSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIC8vIHdyYXAgZmV0Y2ggcmVzdWx0XG4gIGlmICghSVNfUFVSRSAmJiB0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicpICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0KSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoUHJvbWlzZUNvbnN0cnVjdG9yLCAkZmV0Y2guYXBwbHkoZ2xvYmFsLCBhcmd1bWVudHMpKTtcbiAgICB9XG4gIH0pO1xufVxuXG4kKHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvclxufSk7XG5cbnNldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpO1xuc2V0U3BlY2llcyhQUk9NSVNFKTtcblxuUHJvbWlzZVdyYXBwZXIgPSBwYXRoW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIGNhcGFiaWxpdHkucmVqZWN0LmNhbGwodW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIC8vIGBQcm9taXNlLmFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyBgUHJvbWlzZS5yYWNlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.promise.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.anchor.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.anchor.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.anchor` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.anchor\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('anchor') }, {\n anchor: function anchor(name) {\n return createHTML(this, 'a', 'name', name);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hbmNob3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmFuY2hvci5qcz8xOGE1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuYW5jaG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYW5jaG9yXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYW5jaG9yJykgfSwge1xuICBhbmNob3I6IGZ1bmN0aW9uIGFuY2hvcihuYW1lKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnbmFtZScsIG5hbWUpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.anchor.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.big.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.big.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.big` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.big\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('big') }, {\n big: function big() {\n return createHTML(this, 'big', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5iaWcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJpZy5qcz8xMzkzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuYmlnYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYmlnXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYmlnJykgfSwge1xuICBiaWc6IGZ1bmN0aW9uIGJpZygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYmlnJywgJycsICcnKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.big.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.blink.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.blink.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.blink` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.blink\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('blink') }, {\n blink: function blink() {\n return createHTML(this, 'blink', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ibGluay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYmxpbmsuanM/MDRkMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmJsaW5rYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYmxpbmtcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdibGluaycpIH0sIHtcbiAgYmxpbms6IGZ1bmN0aW9uIGJsaW5rKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdibGluaycsICcnLCAnJyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.blink.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.bold.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.bold.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.bold` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.bold\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('bold') }, {\n bold: function bold() {\n return createHTML(this, 'b', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ib2xkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ib2xkLmpzP2NjNzEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5ib2xkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYm9sZFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2JvbGQnKSB9LCB7XG4gIGJvbGQ6IGZ1bmN0aW9uIGJvbGQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2InLCAnJywgJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.bold.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.code-point-at.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.code-point-at.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalCodePointAt = __webpack_require__(/*! ../internals/string-at */ \"./node_modules/core-js/internals/string-at.js\");\n\n// `String.prototype.codePointAt` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n$({ target: 'String', proto: true }, {\n codePointAt: function codePointAt(pos) {\n return internalCodePointAt(this, pos);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0LmpzP2Y1YjIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaW50ZXJuYWxDb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcykge1xuICAgIHJldHVybiBpbnRlcm5hbENvZGVQb2ludEF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.code-point-at.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.ends-with.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.ends-with.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ \"./node_modules/core-js/internals/validate-string-method-arguments.js\");\nvar correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ \"./node_modules/core-js/internals/correct-is-regexp-logic.js\");\n\nvar ENDS_WITH = 'endsWith';\nvar nativeEndsWith = ''[ENDS_WITH];\nvar min = Math.min;\n\n// `String.prototype.endsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.endswith\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic(ENDS_WITH) }, {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = validateArguments(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : min(toLength(endPosition), len);\n var search = String(searchString);\n return nativeEndsWith\n ? nativeEndsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcz84YTc5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLXN0cmluZy1tZXRob2QtYXJndW1lbnRzJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcblxudmFyIEVORFNfV0lUSCA9ICdlbmRzV2l0aCc7XG52YXIgbmF0aXZlRW5kc1dpdGggPSAnJ1tFTkRTX1dJVEhdO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmVuZHN3aXRoXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKEVORFNfV0lUSCkgfSwge1xuICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7XG4gICAgdmFyIHRoYXQgPSB2YWxpZGF0ZUFyZ3VtZW50cyh0aGlzLCBzZWFyY2hTdHJpbmcsIEVORFNfV0lUSCk7XG4gICAgdmFyIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTtcbiAgICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IG1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVFbmRzV2l0aFxuICAgICAgPyBuYXRpdmVFbmRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgZW5kKVxuICAgICAgOiB0aGF0LnNsaWNlKGVuZCAtIHNlYXJjaC5sZW5ndGgsIGVuZCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.ends-with.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.fixed.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.fixed.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.fixed` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fixed\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fixed') }, {\n fixed: function fixed() {\n return createHTML(this, 'tt', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5maXhlZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZml4ZWQuanM/YzdjZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmZpeGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZml4ZWRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdmaXhlZCcpIH0sIHtcbiAgZml4ZWQ6IGZ1bmN0aW9uIGZpeGVkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICd0dCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.fixed.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.fontcolor.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.fontcolor.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.fontcolor` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fontcolor\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontcolor') }, {\n fontcolor: function fontcolor(color) {\n return createHTML(this, 'font', 'color', color);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250Y29sb3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZvbnRjb2xvci5qcz85NzY3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuZm9udGNvbG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udGNvbG9yXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnZm9udGNvbG9yJykgfSwge1xuICBmb250Y29sb3I6IGZ1bmN0aW9uIGZvbnRjb2xvcihjb2xvcikge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ2NvbG9yJywgY29sb3IpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.fontcolor.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.fontsize.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.fontsize.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.fontsize` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fontsize\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontsize') }, {\n fontsize: function fontsize(size) {\n return createHTML(this, 'font', 'size', size);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZm9udHNpemUuanM/MTkxMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmZvbnRzaXplYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udHNpemVcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdmb250c2l6ZScpIH0sIHtcbiAgZm9udHNpemU6IGZ1bmN0aW9uIGZvbnRzaXplKHNpemUpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.fontsize.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.from-code-point.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.from-code-point.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ \"./node_modules/core-js/internals/to-absolute-index.js\");\n\nvar fromCharCode = String.fromCharCode;\nvar nativeFromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\nvar INCORRECT_LENGTH = !!nativeFromCodePoint && nativeFromCodePoint.length != 1;\n\n// `String.fromCodePoint` method\n// https://tc39.github.io/ecma262/#sec-string.fromcodepoint\n$({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, {\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var elements = [];\n var length = arguments.length;\n var i = 0;\n var code;\n while (length > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError(code + ' is not a valid code point');\n elements.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00)\n );\n } return elements.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcz9mNmQ2Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBuYXRpdmVGcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbnZhciBJTkNPUlJFQ1RfTEVOR1RIID0gISFuYXRpdmVGcm9tQ29kZVBvaW50ICYmIG5hdGl2ZUZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDE7XG5cbi8vIGBTdHJpbmcuZnJvbUNvZGVQb2ludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcuZnJvbWNvZGVwb2ludFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0xFTkdUSCB9LCB7XG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYgKHRvQWJzb2x1dGVJbmRleChjb2RlLCAweDEwRkZGRikgIT09IGNvZGUpIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgZWxlbWVudHMucHVzaChjb2RlIDwgMHgxMDAwMFxuICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgICA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLCBjb2RlICUgMHg0MDAgKyAweERDMDApXG4gICAgICApO1xuICAgIH0gcmV0dXJuIGVsZW1lbnRzLmpvaW4oJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.from-code-point.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.includes.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.includes.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ \"./node_modules/core-js/internals/validate-string-method-arguments.js\");\nvar correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ \"./node_modules/core-js/internals/correct-is-regexp-logic.js\");\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~validateArguments(this, searchString, 'includes')\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanM/MjUzMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cycpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykgfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgcmV0dXJuICEhfnZhbGlkYXRlQXJndW1lbnRzKHRoaXMsIHNlYXJjaFN0cmluZywgJ2luY2x1ZGVzJylcbiAgICAgIC5pbmRleE9mKHNlYXJjaFN0cmluZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.includes.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.italics.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.italics.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.italics` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.italics\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('italics') }, {\n italics: function italics() {\n return createHTML(this, 'i', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzLmpzP2M1ZDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5pdGFsaWNzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuaXRhbGljc1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2l0YWxpY3MnKSB9LCB7XG4gIGl0YWxpY3M6IGZ1bmN0aW9uIGl0YWxpY3MoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2knLCAnJywgJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.italics.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.iterator.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.iterator.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar codePointAt = __webpack_require__(/*! ../internals/string-at */ \"./node_modules/core-js/internals/string-at.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar defineIterator = __webpack_require__(/*! ../internals/define-iterator */ \"./node_modules/core-js/internals/define-iterator.js\");\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = codePointAt(string, index, true);\n state.index += point.length;\n return { value: point, done: false };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanM/M2NhMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgY29kZVBvaW50QXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWF0Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiBTdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gY29kZVBvaW50QXQoc3RyaW5nLCBpbmRleCwgdHJ1ZSk7XG4gIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.iterator.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.link.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.link.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.link` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.link\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, {\n link: function link(url) {\n return createHTML(this, 'a', 'href', url);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rLmpzPzk5MTEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5saW5rYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubGlua1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2xpbmsnKSB9LCB7XG4gIGxpbms6IGZ1bmN0aW9uIGxpbmsodXJsKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnaHJlZicsIHVybCk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.link.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.match-all.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.match-all.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ \"./node_modules/core-js/internals/create-iterator-constructor.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar aFunction = __webpack_require__(/*! ../internals/a-function */ \"./node_modules/core-js/internals/a-function.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\nvar getFlags = __webpack_require__(/*! ../internals/regexp-flags */ \"./node_modules/core-js/internals/regexp-flags.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar MATCH_ALL = wellKnownSymbol('matchAll');\nvar REGEXP_STRING = 'RegExp String';\nvar REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);\nvar RegExpPrototype = RegExp.prototype;\nvar regExpBuiltinExec = RegExpPrototype.exec;\n\nvar regExpExec = function (R, S) {\n var exec = R.exec;\n var result;\n if (typeof exec == 'function') {\n result = exec.call(R, S);\n if (typeof result != 'object') throw TypeError('Incorrect exec result');\n return result;\n } return regExpBuiltinExec.call(R, S);\n};\n\n// eslint-disable-next-line max-len\nvar $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, global, fullUnicode) {\n setInternalState(this, {\n type: REGEXP_STRING_ITERATOR,\n regexp: regexp,\n string: string,\n global: global,\n unicode: fullUnicode,\n done: false\n });\n}, REGEXP_STRING, function next() {\n var state = getInternalState(this);\n if (state.done) return { value: undefined, done: true };\n var R = state.regexp;\n var S = state.string;\n var match = regExpExec(R, S);\n if (match === null) return { value: undefined, done: state.done = true };\n if (state.global) {\n if (String(match[0]) == '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);\n return { value: match, done: false };\n }\n state.done = true;\n return { value: match, done: false };\n});\n\nvar $matchAll = function (string) {\n var R = anObject(this);\n var S = String(string);\n var C, flagsValue, flags, matcher, global, fullUnicode;\n C = speciesConstructor(R, RegExp);\n flagsValue = R.flags;\n if (flagsValue === undefined && R instanceof RegExp && !('flags' in RegExpPrototype)) {\n flagsValue = getFlags.call(R);\n }\n flags = flagsValue === undefined ? '' : String(flagsValue);\n matcher = new C(C === RegExp ? R.source : R, flags);\n global = !!~flags.indexOf('g');\n fullUnicode = !!~flags.indexOf('u');\n matcher.lastIndex = toLength(R.lastIndex);\n return new $RegExpStringIterator(matcher, S, global, fullUnicode);\n};\n\n// `String.prototype.matchAll` method\n// https://github.com/tc39/proposal-string-matchall\n$({ target: 'String', proto: true }, {\n matchAll: function matchAll(regexp) {\n var O = requireObjectCoercible(this);\n var S, matcher, rx;\n if (regexp != null) {\n matcher = regexp[MATCH_ALL];\n if (matcher === undefined && IS_PURE && classof(regexp) == 'RegExp') matcher = $matchAll;\n if (matcher != null) return aFunction(matcher).call(regexp, O);\n }\n S = String(O);\n rx = new RegExp(regexp, 'g');\n return IS_PURE ? $matchAll.call(rx, S) : rx[MATCH_ALL](S);\n }\n});\n\nIS_PURE || MATCH_ALL in RegExpPrototype || hide(RegExpPrototype, MATCH_ALL, $matchAll);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLWFsbC5qcz9hMWYwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGdldEZsYWdzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1mbGFncycpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgTUFUQ0hfQUxMID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaEFsbCcpO1xudmFyIFJFR0VYUF9TVFJJTkcgPSAnUmVnRXhwIFN0cmluZyc7XG52YXIgUkVHRVhQX1NUUklOR19JVEVSQVRPUiA9IFJFR0VYUF9TVFJJTkcgKyAnIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFJFR0VYUF9TVFJJTkdfSVRFUkFUT1IpO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgcmVnRXhwQnVpbHRpbkV4ZWMgPSBSZWdFeHBQcm90b3R5cGUuZXhlYztcblxudmFyIHJlZ0V4cEV4ZWMgPSBmdW5jdGlvbiAoUiwgUykge1xuICB2YXIgZXhlYyA9IFIuZXhlYztcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBleGVjID09ICdmdW5jdGlvbicpIHtcbiAgICByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ29iamVjdCcpIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGV4ZWMgcmVzdWx0Jyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gcmVnRXhwQnVpbHRpbkV4ZWMuY2FsbChSLCBTKTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG52YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBSZWdFeHBTdHJpbmdJdGVyYXRvcihyZWdleHAsIHN0cmluZywgZ2xvYmFsLCBmdWxsVW5pY29kZSkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBSRUdFWFBfU1RSSU5HX0lURVJBVE9SLFxuICAgIHJlZ2V4cDogcmVnZXhwLFxuICAgIHN0cmluZzogc3RyaW5nLFxuICAgIGdsb2JhbDogZ2xvYmFsLFxuICAgIHVuaWNvZGU6IGZ1bGxVbmljb2RlLFxuICAgIGRvbmU6IGZhbHNlXG4gIH0pO1xufSwgUkVHRVhQX1NUUklORywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgdmFyIFIgPSBzdGF0ZS5yZWdleHA7XG4gIHZhciBTID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgbWF0Y2ggPSByZWdFeHBFeGVjKFIsIFMpO1xuICBpZiAobWF0Y2ggPT09IG51bGwpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHN0YXRlLmRvbmUgPSB0cnVlIH07XG4gIGlmIChzdGF0ZS5nbG9iYWwpIHtcbiAgICBpZiAoU3RyaW5nKG1hdGNoWzBdKSA9PSAnJykgUi5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgoUi5sYXN0SW5kZXgpLCBzdGF0ZS51bmljb2RlKTtcbiAgICByZXR1cm4geyB2YWx1ZTogbWF0Y2gsIGRvbmU6IGZhbHNlIH07XG4gIH1cbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIHJldHVybiB7IHZhbHVlOiBtYXRjaCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG52YXIgJG1hdGNoQWxsID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgUyA9IFN0cmluZyhzdHJpbmcpO1xuICB2YXIgQywgZmxhZ3NWYWx1ZSwgZmxhZ3MsIG1hdGNoZXIsIGdsb2JhbCwgZnVsbFVuaWNvZGU7XG4gIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IoUiwgUmVnRXhwKTtcbiAgZmxhZ3NWYWx1ZSA9IFIuZmxhZ3M7XG4gIGlmIChmbGFnc1ZhbHVlID09PSB1bmRlZmluZWQgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlKSkge1xuICAgIGZsYWdzVmFsdWUgPSBnZXRGbGFncy5jYWxsKFIpO1xuICB9XG4gIGZsYWdzID0gZmxhZ3NWYWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcoZmxhZ3NWYWx1ZSk7XG4gIG1hdGNoZXIgPSBuZXcgQyhDID09PSBSZWdFeHAgPyBSLnNvdXJjZSA6IFIsIGZsYWdzKTtcbiAgZ2xvYmFsID0gISF+ZmxhZ3MuaW5kZXhPZignZycpO1xuICBmdWxsVW5pY29kZSA9ICEhfmZsYWdzLmluZGV4T2YoJ3UnKTtcbiAgbWF0Y2hlci5sYXN0SW5kZXggPSB0b0xlbmd0aChSLmxhc3RJbmRleCk7XG4gIHJldHVybiBuZXcgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKG1hdGNoZXIsIFMsIGdsb2JhbCwgZnVsbFVuaWNvZGUpO1xufTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUubWF0Y2hBbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLW1hdGNoYWxsXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUgfSwge1xuICBtYXRjaEFsbDogZnVuY3Rpb24gbWF0Y2hBbGwocmVnZXhwKSB7XG4gICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgIHZhciBTLCBtYXRjaGVyLCByeDtcbiAgICBpZiAocmVnZXhwICE9IG51bGwpIHtcbiAgICAgIG1hdGNoZXIgPSByZWdleHBbTUFUQ0hfQUxMXTtcbiAgICAgIGlmIChtYXRjaGVyID09PSB1bmRlZmluZWQgJiYgSVNfUFVSRSAmJiBjbGFzc29mKHJlZ2V4cCkgPT0gJ1JlZ0V4cCcpIG1hdGNoZXIgPSAkbWF0Y2hBbGw7XG4gICAgICBpZiAobWF0Y2hlciAhPSBudWxsKSByZXR1cm4gYUZ1bmN0aW9uKG1hdGNoZXIpLmNhbGwocmVnZXhwLCBPKTtcbiAgICB9XG4gICAgUyA9IFN0cmluZyhPKTtcbiAgICByeCA9IG5ldyBSZWdFeHAocmVnZXhwLCAnZycpO1xuICAgIHJldHVybiBJU19QVVJFID8gJG1hdGNoQWxsLmNhbGwocngsIFMpIDogcnhbTUFUQ0hfQUxMXShTKTtcbiAgfVxufSk7XG5cbklTX1BVUkUgfHwgTUFUQ0hfQUxMIGluIFJlZ0V4cFByb3RvdHlwZSB8fCBoaWRlKFJlZ0V4cFByb3RvdHlwZSwgTUFUQ0hfQUxMLCAkbWF0Y2hBbGwpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.match-all.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.match.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.match.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanM/NDY2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG4vLyBAQG1hdGNoIGxvZ2ljXG5maXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYygnbWF0Y2gnLCAxLCBmdW5jdGlvbiAoTUFUQ0gsIG5hdGl2ZU1hdGNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5tYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5tYXRjaFxuICAgIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIG1hdGNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICAgIHJldHVybiBtYXRjaGVyICE9PSB1bmRlZmluZWQgPyBtYXRjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZU1hdGNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG5cbiAgICAgIGlmICghcnguZ2xvYmFsKSByZXR1cm4gcmVnRXhwRXhlYyhyeCwgUyk7XG5cbiAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHZhciBuID0gMDtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpKSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.match.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.pad-end.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.pad-end.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringPad = __webpack_require__(/*! ../internals/string-pad */ \"./node_modules/core-js/internals/string-pad.js\");\nvar WEBKIT_BUG = __webpack_require__(/*! ../internals/webkit-string-pad-bug */ \"./node_modules/core-js/internals/webkit-string-pad-bug.js\");\n\n// `String.prototype.padEnd` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.padend\n$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return internalStringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kLmpzPzg0M2MiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaW50ZXJuYWxTdHJpbmdQYWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCcpO1xudmFyIFdFQktJVF9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZGVuZFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFdFQktJVF9CVUcgfSwge1xuICBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuIGludGVybmFsU3RyaW5nUGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.pad-end.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.pad-start.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.pad-start.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringPad = __webpack_require__(/*! ../internals/string-pad */ \"./node_modules/core-js/internals/string-pad.js\");\nvar WEBKIT_BUG = __webpack_require__(/*! ../internals/webkit-string-pad-bug */ \"./node_modules/core-js/internals/webkit-string-pad-bug.js\");\n\n// `String.prototype.padStart` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.padstart\n$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return internalStringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1zdGFydC5qcz80ZDkwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGludGVybmFsU3RyaW5nUGFkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQnKTtcbnZhciBXRUJLSVRfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlYmtpdC1zdHJpbmctcGFkLWJ1ZycpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0XG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogV0VCS0lUX0JVRyB9LCB7XG4gIHBhZFN0YXJ0OiBmdW5jdGlvbiBwYWRTdGFydChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuIGludGVybmFsU3RyaW5nUGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRydWUpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.pad-start.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.raw.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.raw.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\n\n// `String.raw` method\n// https://tc39.github.io/ecma262/#sec-string.raw\n$({ target: 'String', stat: true }, {\n raw: function raw(template) {\n var rawTemplate = toIndexedObject(template.raw);\n var literalSegments = toLength(rawTemplate.length);\n var argumentsLength = arguments.length;\n var elements = [];\n var i = 0;\n while (literalSegments > i) {\n elements.push(String(rawTemplate[i++]));\n if (i < argumentsLength) elements.push(String(arguments[i]));\n } return elements.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yYXcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJhdy5qcz9kODBmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xuXG4vLyBgU3RyaW5nLnJhd2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucmF3XG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgc3RhdDogdHJ1ZSB9LCB7XG4gIHJhdzogZnVuY3Rpb24gcmF3KHRlbXBsYXRlKSB7XG4gICAgdmFyIHJhd1RlbXBsYXRlID0gdG9JbmRleGVkT2JqZWN0KHRlbXBsYXRlLnJhdyk7XG4gICAgdmFyIGxpdGVyYWxTZWdtZW50cyA9IHRvTGVuZ3RoKHJhd1RlbXBsYXRlLmxlbmd0aCk7XG4gICAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChsaXRlcmFsU2VnbWVudHMgPiBpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKFN0cmluZyhyYXdUZW1wbGF0ZVtpKytdKSk7XG4gICAgICBpZiAoaSA8IGFyZ3VtZW50c0xlbmd0aCkgZWxlbWVudHMucHVzaChTdHJpbmcoYXJndW1lbnRzW2ldKSk7XG4gICAgfSByZXR1cm4gZWxlbWVudHMuam9pbignJyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.raw.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.repeat.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.repeat.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar repeat = __webpack_require__(/*! ../internals/string-repeat */ \"./node_modules/core-js/internals/string-repeat.js\");\n\n// `String.prototype.repeat` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n$({ target: 'String', proto: true }, {\n repeat: repeat\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBlYXQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGVhdC5qcz8zOGNmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0Jyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGVhdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGVhdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgcmVwZWF0OiByZXBlYXRcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.repeat.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.replace.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.replace.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar toInteger = __webpack_require__(/*! ../internals/to-integer */ \"./node_modules/core-js/internals/to-integer.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzPzUzMTkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTID0gL1xcJChbJCYnYF18XFxkXFxkP3w8W14+XSo+KS9nO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEID0gL1xcJChbJCYnYF18XFxkXFxkPykvZztcblxudmFyIG1heWJlVG9TdHJpbmcgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xuXG4vLyBAQHJlcGxhY2UgbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKFJFUExBQ0UsIG5hdGl2ZVJlcGxhY2UsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZVxuICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIHJlcGxhY2VyID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgICByZXR1cm4gcmVwbGFjZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHJlcGxhY2VyLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiBuYXRpdmVSZXBsYWNlLmNhbGwoU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEByZXBsYWNlXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZVJlcGxhY2UsIHJlZ2V4cCwgdGhpcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuXG4gICAgICB2YXIgZnVuY3Rpb25hbFJlcGxhY2UgPSB0eXBlb2YgcmVwbGFjZVZhbHVlID09PSAnZnVuY3Rpb24nO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG5cbiAgICAgIHZhciBnbG9iYWwgPSByeC5nbG9iYWw7XG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICAgIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSBicmVhaztcblxuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuXG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWNjdW11bGF0ZWRSZXN1bHQgPSAnJztcbiAgICAgIHZhciBuZXh0U291cmNlUG9zaXRpb24gPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbaV07XG5cbiAgICAgICAgdmFyIG1hdGNoZWQgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTtcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgcmVwbGFjZXJBcmdzLnB1c2gobmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gU3RyaW5nKHJlcGxhY2VWYWx1ZS5hcHBseSh1bmRlZmluZWQsIHJlcGxhY2VyQXJncykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIFMsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRSZXN1bHQgKz0gUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0c3Vic3RpdHV0aW9uXG4gIGZ1bmN0aW9uIGdldFN1YnN0aXR1dGlvbihtYXRjaGVkLCBzdHIsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZW1lbnQpIHtcbiAgICB2YXIgdGFpbFBvcyA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgdmFyIG0gPSBjYXB0dXJlcy5sZW5ndGg7XG4gICAgdmFyIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRDtcbiAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuYW1lZENhcHR1cmVzID0gdG9PYmplY3QobmFtZWRDYXB0dXJlcyk7XG4gICAgICBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFM7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVSZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHtcbiAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgc3dpdGNoIChjaC5jaGFyQXQoMCkpIHtcbiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICAgIGNhc2UgJyYnOiByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgY2FzZSAnYCc6IHJldHVybiBzdHIuc2xpY2UoMCwgcG9zaXRpb24pO1xuICAgICAgICBjYXNlIFwiJ1wiOiByZXR1cm4gc3RyLnNsaWNlKHRhaWxQb3MpO1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICBjYXB0dXJlID0gbmFtZWRDYXB0dXJlc1tjaC5zbGljZSgxLCAtMSldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBcXGRcXGQ/XG4gICAgICAgICAgdmFyIG4gPSArY2g7XG4gICAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBpZiAobiA+IG0pIHtcbiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTtcbiAgICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICBpZiAoZiA8PSBtKSByZXR1cm4gY2FwdHVyZXNbZiAtIDFdID09PSB1bmRlZmluZWQgPyBjaC5jaGFyQXQoMSkgOiBjYXB0dXJlc1tmIC0gMV0gKyBjaC5jaGFyQXQoMSk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FwdHVyZSA9PT0gdW5kZWZpbmVkID8gJycgOiBjYXB0dXJlO1xuICAgIH0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.replace.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.search.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.search.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar sameValue = __webpack_require__(/*! ../internals/same-value */ \"./node_modules/core-js/internals/same-value.js\");\nvar regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zZWFyY2guanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcz84NDFjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBzYW1lVmFsdWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2FtZS12YWx1ZScpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxuLy8gQEBzZWFyY2ggbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzZWFyY2gnLCAxLCBmdW5jdGlvbiAoU0VBUkNILCBuYXRpdmVTZWFyY2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNlYXJjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zZWFyY2hcbiAgICBmdW5jdGlvbiBzZWFyY2gocmVnZXhwKSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgc2VhcmNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07XG4gICAgICByZXR1cm4gc2VhcmNoZXIgIT09IHVuZGVmaW5lZCA/IHNlYXJjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzZWFyY2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZVNlYXJjaCwgcmVnZXhwLCB0aGlzKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuXG4gICAgICB2YXIgcHJldmlvdXNMYXN0SW5kZXggPSByeC5sYXN0SW5kZXg7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShwcmV2aW91c0xhc3RJbmRleCwgMCkpIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShyeC5sYXN0SW5kZXgsIHByZXZpb3VzTGFzdEluZGV4KSkgcngubGFzdEluZGV4ID0gcHJldmlvdXNMYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSBudWxsID8gLTEgOiByZXN1bHQuaW5kZXg7XG4gICAgfVxuICBdO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.search.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.small.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.small.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.small` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.small\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('small') }, {\n small: function small() {\n return createHTML(this, 'small', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zbWFsbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc21hbGwuanM/Yzk2YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnNtYWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc21hbGxcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdzbWFsbCcpIH0sIHtcbiAgc21hbGw6IGZ1bmN0aW9uIHNtYWxsKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzbWFsbCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.small.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.split.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.split.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar isRegExp = __webpack_require__(/*! ../internals/is-regexp */ \"./node_modules/core-js/internals/is-regexp.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar callRegExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\nvar regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output.length > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQuanM/MTI3NiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjYWxsUmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgYXJyYXlQdXNoID0gW10ucHVzaDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBNQVhfVUlOVDMyID0gMHhGRkZGRkZGRjtcblxuLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBTVVBQT1JUU19ZID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsgcmV0dXJuICFSZWdFeHAoTUFYX1VJTlQzMiwgJ3knKTsgfSk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChTUExJVCwgbmF0aXZlU3BsaXQsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICB2YXIgaW50ZXJuYWxTcGxpdDtcbiAgaWYgKFxuICAgICdhYmJjJy5zcGxpdCgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0Jy5zcGxpdCgvKD86KS8sIC0xKS5sZW5ndGggIT0gNCB8fFxuICAgICdhYicuc3BsaXQoLyg/OmFiKSovKS5sZW5ndGggIT0gMiB8fFxuICAgICcuJy5zcGxpdCgvKC4/KSguPykvKS5sZW5ndGggIT0gNCB8fFxuICAgICcuJy5zcGxpdCgvKCkoKS8pLmxlbmd0aCA+IDEgfHxcbiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHJldHVybiBbc3RyaW5nXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVNwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbSk7XG4gICAgICB9XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHkubGFzdEluZGV4O1xuICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nLmxlbmd0aCkgYXJyYXlQdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBsaW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXQubGVuZ3RoID4gbGltID8gb3V0cHV0LnNsaWNlKDAsIGxpbSkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJy5zcGxpdCh1bmRlZmluZWQsIDApLmxlbmd0aCkge1xuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBuYXRpdmVTcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH0gZWxzZSBpbnRlcm5hbFNwbGl0ID0gbmF0aXZlU3BsaXQ7XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zcGxpdFxuICAgIGZ1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBzcGxpdHRlciA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgICAgcmV0dXJuIHNwbGl0dGVyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzcGxpdHRlci5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpXG4gICAgICAgIDogaW50ZXJuYWxTcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNwbGl0XG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIGVuZ2luZXMgdGhhdCBkb24ndCBzdXBwb3J0XG4gICAgLy8gdGhlICd5JyBmbGFnLlxuICAgIGZ1bmN0aW9uIChyZWdleHAsIGxpbWl0KSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJlZ2V4cCwgdGhpcywgbGltaXQsIGludGVybmFsU3BsaXQgIT09IG5hdGl2ZVNwbGl0KTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgIHZhciB1bmljb2RlTWF0Y2hpbmcgPSByeC51bmljb2RlO1xuICAgICAgdmFyIGZsYWdzID0gKHJ4Lmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoU1VQUE9SVFNfWSA/ICd5JyA6ICdnJyk7XG5cbiAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKGxpbSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgcSA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICBzcGxpdHRlci5sYXN0SW5kZXggPSBTVVBQT1JUU19ZID8gcSA6IDA7XG4gICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA9PT0gbnVsbCB8fFxuICAgICAgICAgIChlID0gbWluKHRvTGVuZ3RoKHNwbGl0dGVyLmxhc3RJbmRleCArIChTVVBQT1JUU19ZID8gMCA6IHEpKSwgUy5sZW5ndGgpKSA9PT0gcFxuICAgICAgICApIHtcbiAgICAgICAgICBxID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHEsIHVuaWNvZGVNYXRjaGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQS5wdXNoKFMuc2xpY2UocCwgcSkpO1xuICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSB6Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgQS5wdXNoKHpbaV0pO1xuICAgICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxID0gcCA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEEucHVzaChTLnNsaWNlKHApKTtcbiAgICAgIHJldHVybiBBO1xuICAgIH1cbiAgXTtcbn0sICFTVVBQT1JUU19ZKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.split.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.starts-with.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.starts-with.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ \"./node_modules/core-js/internals/validate-string-method-arguments.js\");\nvar correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ \"./node_modules/core-js/internals/correct-is-regexp-logic.js\");\n\nvar STARTS_WITH = 'startsWith';\nvar nativeStartsWith = ''[STARTS_WITH];\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic(STARTS_WITH) }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = validateArguments(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanM/MmNhMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cycpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbnZhciBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJztcbnZhciBuYXRpdmVTdGFydHNXaXRoID0gJydbU1RBUlRTX1dJVEhdO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RhcnRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFjb3JyZWN0SXNSZWdFeHBMb2dpYyhTVEFSVFNfV0lUSCkgfSwge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gdmFsaWRhdGVBcmd1bWVudHModGhpcywgc2VhcmNoU3RyaW5nLCBTVEFSVFNfV0lUSCk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgoTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.starts-with.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.strike.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.strike.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.strike` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.strike\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('strike') }, {\n strike: function strike() {\n return createHTML(this, 'strike', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdHJpa2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZS5qcz8yMzE1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RyaWtlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RyaWtlXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnc3RyaWtlJykgfSwge1xuICBzdHJpa2U6IGZ1bmN0aW9uIHN0cmlrZSgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3RyaWtlJywgJycsICcnKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.strike.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.sub.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.sub.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.sub` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.sub\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sub') }, {\n sub: function sub() {\n return createHTML(this, 'sub', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdWIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1Yi5qcz80YzUzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3ViYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3ViXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnc3ViJykgfSwge1xuICBzdWI6IGZ1bmN0aW9uIHN1YigpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3ViJywgJycsICcnKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.sub.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.sup.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.sup.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar createHTML = __webpack_require__(/*! ../internals/create-html */ \"./node_modules/core-js/internals/create-html.js\");\nvar forcedStringHTMLMethod = __webpack_require__(/*! ../internals/forced-string-html-method */ \"./node_modules/core-js/internals/forced-string-html-method.js\");\n\n// `String.prototype.sup` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.sup\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sup') }, {\n sup: function sup() {\n return createHTML(this, 'sup', '', '');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdXAuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1cC5qcz82NjRmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3VwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3VwXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnc3VwJykgfSwge1xuICBzdXA6IGZ1bmN0aW9uIHN1cCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3VwJywgJycsICcnKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.sup.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.trim-end.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.trim-end.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ \"./node_modules/core-js/internals/string-trim.js\");\nvar forcedStringTrimMethod = __webpack_require__(/*! ../internals/forced-string-trim-method */ \"./node_modules/core-js/internals/forced-string-trim-method.js\");\n\nvar FORCED = forcedStringTrimMethod('trimEnd');\n\nvar trimEnd = FORCED ? function trimEnd() {\n return internalStringTrim(this, 2);\n} : ''.trimEnd;\n\n// `String.prototype.{ trimEnd, trimRight }` methods\n// https://github.com/tc39/ecmascript-string-left-right-trim\n$({ target: 'String', proto: true, forced: FORCED }, {\n trimEnd: trimEnd,\n trimRight: trimEnd\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1lbmQuanM/MWUyNSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpbnRlcm5hbFN0cmluZ1RyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKTtcbnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QnKTtcblxudmFyIEZPUkNFRCA9IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW1FbmQnKTtcblxudmFyIHRyaW1FbmQgPSBGT1JDRUQgPyBmdW5jdGlvbiB0cmltRW5kKCkge1xuICByZXR1cm4gaW50ZXJuYWxTdHJpbmdUcmltKHRoaXMsIDIpO1xufSA6ICcnLnRyaW1FbmQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUVuZCwgdHJpbVJpZ2h0IH1gIG1ldGhvZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHRyaW1FbmQ6IHRyaW1FbmQsXG4gIHRyaW1SaWdodDogdHJpbUVuZFxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.trim-end.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.trim-start.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.trim-start.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ \"./node_modules/core-js/internals/string-trim.js\");\nvar forcedStringTrimMethod = __webpack_require__(/*! ../internals/forced-string-trim-method */ \"./node_modules/core-js/internals/forced-string-trim-method.js\");\n\nvar FORCED = forcedStringTrimMethod('trimStart');\n\nvar trimStart = FORCED ? function trimStart() {\n return internalStringTrim(this, 1);\n} : ''.trimStart;\n\n// `String.prototype.{ trimStart, trimLeft }` methods\n// https://github.com/tc39/ecmascript-string-left-right-trim\n$({ target: 'String', proto: true, forced: FORCED }, {\n trimStart: trimStart,\n trimLeft: trimStart\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXN0YXJ0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXN0YXJ0LmpzP2VlZTciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaW50ZXJuYWxTdHJpbmdUcmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJyk7XG52YXIgZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kJyk7XG5cbnZhciBGT1JDRUQgPSBmb3JjZWRTdHJpbmdUcmltTWV0aG9kKCd0cmltU3RhcnQnKTtcblxudmFyIHRyaW1TdGFydCA9IEZPUkNFRCA/IGZ1bmN0aW9uIHRyaW1TdGFydCgpIHtcbiAgcmV0dXJuIGludGVybmFsU3RyaW5nVHJpbSh0aGlzLCAxKTtcbn0gOiAnJy50cmltU3RhcnQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVN0YXJ0LCB0cmltTGVmdCB9YCBtZXRob2RzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICB0cmltU3RhcnQ6IHRyaW1TdGFydCxcbiAgdHJpbUxlZnQ6IHRyaW1TdGFydFxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.trim-start.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.trim.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.trim.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ \"./node_modules/core-js/internals/string-trim.js\");\nvar forcedStringTrimMethod = __webpack_require__(/*! ../internals/forced-string-trim-method */ \"./node_modules/core-js/internals/forced-string-trim-method.js\");\n\nvar FORCED = forcedStringTrimMethod('trim');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: FORCED }, {\n trim: function trim() {\n return internalStringTrim(this, 3);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzPzQ5OGEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaW50ZXJuYWxTdHJpbmdUcmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJyk7XG52YXIgZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kJyk7XG5cbnZhciBGT1JDRUQgPSBmb3JjZWRTdHJpbmdUcmltTWV0aG9kKCd0cmltJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgdHJpbTogZnVuY3Rpb24gdHJpbSgpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxTdHJpbmdUcmltKHRoaXMsIDMpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/es.string.trim.js\n"); + +/***/ }), + +/***/ "./node_modules/core-js/modules/web.dom-collections.iterator.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ \"./node_modules/core-js/internals/dom-iterables.js\");\nvar ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ \"./node_modules/core-js/modules/es.array.iterator.js\");\nvar hide = __webpack_require__(/*! ../internals/hide */ \"./node_modules/core-js/internals/hide.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n hide(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) hide(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n hide(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9KUy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcz9kZGIwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTtcbiAgdmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBoaWRlKENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7XG4gICAgfVxuICAgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkgaGlkZShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpO1xuICAgIGlmIChET01JdGVyYWJsZXNbQ09MTEVDVElPTl9OQU1FXSkgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHtcbiAgICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdICE9PSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pIHRyeSB7XG4gICAgICAgIGhpZGUoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-js/modules/web.dom-collections.iterator.js\n"); + +/***/ }), + +/***/ "./node_modules/core-util-is/lib/util.js": +/*!***********************************************!*\ + !*** ./node_modules/core-util-is/lib/util.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("/* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vSlMvLi9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzPzNhN2MiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcjtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/core-util-is/lib/util.js\n"); + +/***/ }), + +/***/ "./node_modules/events/events.js": +/*!***************************************!*\ + !*** ./node_modules/events/events.js ***! + \***************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = $getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n ReflectApply(this.listener, this.target, args);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanM/ZmFhMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gJGdldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gJGdldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9ICRnZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBSZWZsZWN0QXBwbHkodGhpcy5saXN0ZW5lciwgdGhpcy50YXJnZXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/events/events.js\n"); + +/***/ }), + +/***/ "./node_modules/https-browserify/index.js": +/*!************************************************!*\ + !*** ./node_modules/https-browserify/index.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var http = __webpack_require__(/*! http */ \"./node_modules/stream-http/index.js\")\nvar url = __webpack_require__(/*! url */ \"./node_modules/url/url.js\")\n\nvar https = module.exports\n\nfor (var key in http) {\n if (http.hasOwnProperty(key)) https[key] = http[key]\n}\n\nhttps.request = function (params, cb) {\n params = validateParams(params)\n return http.request.call(this, params, cb)\n}\n\nhttps.get = function (params, cb) {\n params = validateParams(params)\n return http.get.call(this, params, cb)\n}\n\nfunction validateParams (params) {\n if (typeof params === 'string') {\n params = url.parse(params)\n }\n if (!params.protocol) {\n params.protocol = 'https:'\n }\n if (params.protocol !== 'https:') {\n throw new Error('Protocol \"' + params.protocol + '\" not supported. Expected \"https:\"')\n }\n return params\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaHR0cHMtYnJvd3NlcmlmeS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2h0dHBzLWJyb3dzZXJpZnkvaW5kZXguanM/MjRmOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKVxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG5cbnZhciBodHRwcyA9IG1vZHVsZS5leHBvcnRzXG5cbmZvciAodmFyIGtleSBpbiBodHRwKSB7XG4gIGlmIChodHRwLmhhc093blByb3BlcnR5KGtleSkpIGh0dHBzW2tleV0gPSBodHRwW2tleV1cbn1cblxuaHR0cHMucmVxdWVzdCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNiKSB7XG4gIHBhcmFtcyA9IHZhbGlkYXRlUGFyYW1zKHBhcmFtcylcbiAgcmV0dXJuIGh0dHAucmVxdWVzdC5jYWxsKHRoaXMsIHBhcmFtcywgY2IpXG59XG5cbmh0dHBzLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNiKSB7XG4gIHBhcmFtcyA9IHZhbGlkYXRlUGFyYW1zKHBhcmFtcylcbiAgcmV0dXJuIGh0dHAuZ2V0LmNhbGwodGhpcywgcGFyYW1zLCBjYilcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbXMgKHBhcmFtcykge1xuICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJhbXMgPSB1cmwucGFyc2UocGFyYW1zKVxuICB9XG4gIGlmICghcGFyYW1zLnByb3RvY29sKSB7XG4gICAgcGFyYW1zLnByb3RvY29sID0gJ2h0dHBzOidcbiAgfVxuICBpZiAocGFyYW1zLnByb3RvY29sICE9PSAnaHR0cHM6Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdG9jb2wgXCInICsgcGFyYW1zLnByb3RvY29sICsgJ1wiIG5vdCBzdXBwb3J0ZWQuIEV4cGVjdGVkIFwiaHR0cHM6XCInKVxuICB9XG4gIHJldHVybiBwYXJhbXNcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/https-browserify/index.js\n"); + +/***/ }), + +/***/ "./node_modules/ieee754/index.js": +/*!***************************************!*\ + !*** ./node_modules/ieee754/index.js ***! + \***************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanM/OTE1MiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/ieee754/index.js\n"); + +/***/ }), + +/***/ "./node_modules/inherits/inherits_browser.js": +/*!***************************************************!*\ + !*** ./node_modules/inherits/inherits_browser.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanM/M2ZiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/inherits/inherits_browser.js\n"); + +/***/ }), + +/***/ "./node_modules/isarray/index.js": +/*!***************************************!*\ + !*** ./node_modules/isarray/index.js ***! + \***************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0pTLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanM/ZTNkYiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/isarray/index.js\n"); + +/***/ }), + +/***/ "./node_modules/jquery/dist/jquery.js": +/*!********************************************!*\ + !*** ./node_modules/jquery/dist/jquery.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v3.4.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2019-05-01T21:04Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( true && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.4.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code, options ) {\n\t\tDOMEval( code, { nonce: options && options.nonce } );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.4\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2019-04-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t(nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\") ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 && rdescend.test( selector ) ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = (elem.ownerDocument || elem).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"\" +\n\t\t\t\t\"\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"\" +\n\t\t\t\t\"\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: ) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( typeof elem.contentDocument !== \"undefined\" ) {\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, \"\", \"
            \" ],\n\tcol: [ 2, \"\", \"
            \" ],\n\ttr: [ 2, \"\", \"
            \" ],\n\ttd: [ 3, \"\", \"
            \" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t// Support: IE 9-11 only\n\t// Also use offsetWidth/offsetHeight for when box sizing is unreliable\n\t// We use getClientRects() to check for hidden/disconnected.\n\t// In those cases, the computed value can be trusted to be border-box\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\t\tval === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url, options ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \" +Redirecting + + +

            Redirecting

            +

            Redirecting...
            +

            Click here

            + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/README.md softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/README.md --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/README.md 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/bin/hamcore/wwwroot/admin/README.md 2019-07-23 21:37:12.000000000 +0000 @@ -0,0 +1,22 @@ +# About "admin" directory (for developers) +This `bin/hamcore/wwwroot/admin/` directory is the web contents root of the embedded HTML5 web administration console: `http://:/admin/`. + +Currently there is only the `default/` sub directory. It is corresponding to `http://:/admin/default/`. + + +The `/admin/index.html` file always redirects all clients to the `/admin/default/`. + + +If you are willing to develop the web-based administration console you have two choices: + +1. Modify and improve the `/admin/default/` project. + + +2. Create your entirely new web project in the `/admin/NEW_PATH_HERE/` directory. You can choose the unique directory name instead of `NEW_PATH_HERE` on the above directory path. + + +If you want to create an independent new web project, the choice #2 is the best way. You can do anything freely in your new directory. In such a case, please edit the `/admin/index.html` not to redirect to the `/admin/default/index.html` automatically. Instead, put the list of the systems for each of sub directories in the `/admin/index.html` so that the user can choose which system to use. + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/BUILD_UNIX.md softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/BUILD_UNIX.md --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/BUILD_UNIX.md 2019-04-21 08:03:28.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/BUILD_UNIX.md 2019-07-23 21:37:11.000000000 +0000 @@ -1,4 +1,4 @@ -This document describes how to build SoftEtherVPN for Unix based Operating systems +This document describes how to build SoftEtherVPN for UNIX based Operating systems - [Requirements](#requirements) * [Install requirements on Centos/RedHat](#install-requirements-on-centosredhat) @@ -9,6 +9,9 @@ * [Start/Stop SoftEther VPN Server](#startstop-softether-vpn-server) * [Start/Stop SoftEther VPN Bridge](#startstop-softether-vpn-bridge) * [Start/Stop SoftEther VPN Client](#startstop-softether-vpn-client) +- [About HTML5-based Modern Admin Console and JSON-RPC API Suite](#about-html5-based-modern-admin-console-and-json-rpc-api-suite) + * [Built-in SoftEther VPN Server HTML5 Ajax-based Web Administration Console](#built-in-softether-vpn-server-html5-ajax-based-web-administration-console) + * [Built-in SoftEther Server VPN JSON-RPC API Suite](#built-in-softether-server-vpn-json-rpc-api-suite) - [Using SoftEther without installation.](#using-softether-without-installation) # Requirements @@ -107,6 +110,8 @@ from http://www.softether-download.com/. + + ## Start/Stop SoftEther VPN Bridge To start the SoftEther VPN Bridge background service, run the following: @@ -159,7 +164,39 @@ from http://www.softether-download.com/. -# Using SoftEther without installation. +# About HTML5-based Modern Admin Console and JSON-RPC API Suite + +## Built-in SoftEther VPN Server HTML5 Ajax-based Web Administration Console +We are developing the HTML5 Ajax-based Web Administration Console (currently very limited, under construction) in the embedded HTTPS server on the SoftEther VPN Server. + +Access to the following URL from your favorite web browser. + +``` +https://:/admin/ +``` + +For example if your VPN Server is running as the port 5555 on the host at 192.168.0.1, you can access to the web console by: + +``` +https://192.168.0.1:5555/admin/ +``` + +Note: Your HTML5 development contribution is very appreciated. The current HTML5 pages are written by Daiyuu Nobori (the core developer of SoftEther VPN). He is obviously lack of HTML5 development ability. Please kindly consider to contribute for SoftEther VPN's development on GitHub. Your code will help every people running SoftEther VPN Server. + + +## Built-in SoftEther Server VPN JSON-RPC API Suite +The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions). + +You can access to the [latest SoftEther VPN Server JSON-RPC Document on GitHub.](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/) + +- Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API. +You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.) +- If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server. +- No need to use any specific API client library since all APIs are provided on the JSON-RPC 2.0 Specification. You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment. +- Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. The Node.js Client Library for VPN Server RPC (vpnrpc) package is also available. + + +# Using SoftEther without installation You can use any SoftEtherVPN component (server, client, bridge) without installing it, if you wish so. diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Admin.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Admin.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Admin.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Admin.c 2019-07-23 21:37:12.000000000 +0000 @@ -274,6 +274,1157 @@ return t; } + + +// Process server side include +BUF *AdminWebProcessServerSideInclude(BUF *src_txt, char *filename, UINT depth) +{ + char *src_str; + UINT src_str_size; + UINT i, len; + BUF *ret = NULL; + UINT pos = 0; + char dirname[MAX_PATH]; + if (src_txt == NULL || filename == NULL || depth >= 4) + { + return CloneBuf(src_txt); + } + if (EndWith(filename, ".html") == false) + { + // We process only .html files + return CloneBuf(src_txt); + } + + GetDirNameFromFilePath(dirname, sizeof(dirname), filename); + + src_str_size = src_txt->Size + 1; + src_str = ZeroMalloc(src_str_size); + + Copy(src_str, src_txt->Buf, src_txt->Size); + + len = StrLen(src_str); + + ret = NewBuf(); + + for (i = 0;i < len;i++) + { + char *start_tag = ""; + UINT x; + + Zero(inc_filename, sizeof(inc_filename)); + + StrCpy(inc_filename, sizeof(inc_filename), src_str + i + StrLen(start_tag) + 1); + inc_filename[b - (i + StrLen(start_tag) + 1)] = 0; + + x = SearchStrEx(src_str, end_tag, b + 1, true); + + if ((x != INFINITE) && (x >= (b + 1))) + { + BUF *inc_buf; + char full_inc_filename[MAX_PATH]; + + if (StartWith(inc_filename, "/")) + { + Format(full_inc_filename, sizeof(full_inc_filename), "|wwwroot/%s", inc_filename + 1); + } + else + { + StrCpy(full_inc_filename, sizeof(full_inc_filename), dirname); + StrCat(full_inc_filename, sizeof(full_inc_filename), "/"); + StrCat(full_inc_filename, sizeof(full_inc_filename), inc_filename); + } + + Debug("dirname = %s, full_inc_filename (src) = %s\n\n", dirname, full_inc_filename); + NormalizePath(full_inc_filename, sizeof(full_inc_filename), full_inc_filename); + + if (StartWith(full_inc_filename, "|wwwroot/") == false + && StartWith(full_inc_filename, "|wwwroot\\") == false) + { + char tmp[MAX_PATH]; + Format(tmp, sizeof(tmp), "|wwwroot/%s", full_inc_filename); + StrCpy(full_inc_filename, sizeof(full_inc_filename), tmp); + } + + Debug("inc_filename = %s\nfull_inc_filename = %s\n\n", inc_filename, full_inc_filename); + + inc_buf = ReadDump(full_inc_filename); + + if (inc_buf != NULL) + { + BUF *inc_buf2; + + inc_buf2 = AdminWebProcessServerSideInclude(inc_buf, full_inc_filename, depth + 1); + + BufSkipUtf8Bom(inc_buf2); + WriteBufBufWithOffset(ret, inc_buf2); + + FreeBuf(inc_buf); + FreeBuf(inc_buf2); + } + else + { + Debug("Loading SSI '%s' error.\n", inc_buf); + } + + i = (x + StrLen(end_tag) - 1); + + is_ssi = true; + } + } + } + } + + if (is_ssi == false) + { + WriteBufChar(ret, src_str[i]); + } + } + + Free(src_str); + + return ret; +} + +// Handle the file request +bool AdminWebHandleFileRequest(ADMIN *a, CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_src, char *query_string, char *virtual_root_dir, char *physical_root_dir) +{ + bool ret = false; + char url[MAX_PATH]; + UINT i, len; + if (a == NULL || c == NULL || s == NULL || h == NULL || query_string == NULL || + virtual_root_dir == NULL || physical_root_dir == NULL) + { + return false; + } + + StrCpy(url, sizeof(url), url_src); + + len = StrLen(url); + for (i = 0;i < len;i++) + { + if (url[i] == '\\') + { + url[i] = '/'; + } + } + + // Is dangerous URL? + if (InStr(url, "..") || InStr(url, "//") || InStr(url, "\\\\") || InStr(url, "/\\") || InStr(url, "\\/")) + { + ret = AdminWebSend404Error(s, h); + } + else + { + char filename[MAX_PATH]; + bool is_index_file = false; + + BUF *b = AdminWebTryFindAndReadFile(virtual_root_dir, physical_root_dir, url, + filename, sizeof(filename), &is_index_file); + + if (b == NULL) + { + ret = AdminWebSend404Error(s, h); + } + else + { + if (is_index_file && EndWith(url, "/") == false) + { + char url2[MAX_PATH]; + StrCpy(url2, sizeof(url2), url); + StrCat(url2, sizeof(url2), "/"); + ret = AdminWebSend302Redirect(s, url2, query_string, h); + } + else if (is_index_file == false && EndWith(url, "/")) + { + char url2[MAX_PATH]; + TrimEndWith(url2, sizeof(url2), url, "/"); + ret = AdminWebSend302Redirect(s, url2, query_string, h); + } + else + { + BUF *b2 = AdminWebProcessServerSideInclude(b, filename, 0); + char *mime = GetMimeTypeFromFileName(filename); + + if (mime == NULL) + { + mime = "application/octet-stream"; + } + + ret = AdminWebSendBody(s, 200, "OK", b2->Buf, b2->Size, mime, NULL, NULL, h); + + FreeBuf(b2); + } + FreeBuf(b); + } + } + + return ret; +} + +// Try to find a file, and if exists return the file contents +BUF *AdminWebTryFindAndReadFile(char *vroot, char *proot, char *url, char *ret_filename, UINT ret_filename_size, bool *is_index_html) +{ + char tmp[MAX_PATH]; + char tmp2[MAX_PATH]; + UINT vroot_len; + UINT url_len; + char relative_path[MAX_PATH]; + BUF *b; + if (vroot == NULL || proot == NULL || url == NULL || ret_filename == NULL || is_index_html == NULL) + { + return NULL; + } + + *is_index_html = false; + + if (StartWith(url, vroot) == false) + { + return NULL; + } + + vroot_len = StrLen(vroot); + url_len = StrLen(url); + + StrCpy(relative_path, sizeof(relative_path), url + vroot_len); + + if (StartWith(relative_path, "/")) + { + char tmp3[MAX_PATH]; + + StrCpy(tmp3, sizeof(tmp3), relative_path + 1); + StrCpy(relative_path, sizeof(relative_path), tmp3); + } + + CombinePath(tmp, sizeof(tmp), proot, relative_path); + + // index.html + CombinePath(tmp2, sizeof(tmp2), tmp, "index.html"); + b = AdminWebTryOneFile(tmp2, ret_filename, ret_filename_size); + if (b != NULL) + { + *is_index_html = true; + return b; + } + + // dirname/filename + StrCpy(tmp2, sizeof(tmp2), tmp); + b = AdminWebTryOneFile(tmp2, ret_filename, ret_filename_size); + if (b != NULL) + { + return b; + } + + return NULL; +} +BUF *AdminWebTryOneFile(char *filename, char *ret_filename, UINT ret_filename_size) +{ + BUF *b; + if (filename == NULL || ret_filename == NULL) + { + return NULL; + } + + b = ReadDump(filename); + if (b == NULL) + { + return NULL; + } + + StrCpy(ret_filename, ret_filename_size, filename); + + return b; +} + +// Send a 401 Unauthorized error +bool AdminWebSendUnauthorized(SOCK *s, HTTP_HEADER *http_request_headers) +{ + char *http_401_str = "\r\n\r\n401 Unauthorized\r\n\r\n

            " CEDAR_SERVER_STR ": Administrative authentication required.

            \r\n

            This VPN Server could not verify that you are authorized to access to the \r\nserver in administrative mode.

            \r\n

            For web browser logins:
            You must supply the HTTP basic \r\nauthentication credential as following.

            \r\n
              \r\n\t
            • To login to the VPN server as the entire server administrator, specify empty or "administrator" as the username field, and specify the server administrative \r\n\tpassword as the password field.
            • \r\n\t
            • To login to a particular Virtual Hub as the hub administrator, specify \r\n\tthe hub name as the username field, and specify the hub administrative \r\n\tpassword as the password field.
            • \r\n
            \r\n

            For JSON-RPC client logins:
            Instead to HTTP basic \r\nauthentication, you can also specify the HTTP header parameters as following.

            \r\n
              \r\n\t
            • X-VPNADMIN-HUBNAME: Empty to login to the VPN Server as the entire \r\n\tserver administrator, or specify the target Virtual Hub name as the hub \r\n\tadministrator.
            • \r\n\t
            • X-VPNADMIN-PASSWORD: Specify the administrative password.
            • \r\n
            \r\n\r\n"; + bool ret; + // Validate arguments + if (s == NULL || http_request_headers == NULL) + { + return false; + } + + // Creating a Data + ret = AdminWebSendBody(s, 401, "Unauthorized", http_401_str, StrLen(http_401_str), HTTP_CONTENT_TYPE, + "WWW-Authenticate", + "Basic realm=\"Username 'administrator' for entire VPN Server privilege, or specify Virtual Hub name as the username for specified Virtual Hub administrative privilege.\"", + http_request_headers); + + return ret; +} + +// Send reply +bool AdminWebSendBody(SOCK *s, UINT status_code, char *status_string, UCHAR *data, UINT data_size, char *content_type, char *add_header_name, char *add_header_value, + HTTP_HEADER *request_headers) +{ + HTTP_HEADER *h; + char date_str[MAX_SIZE]; + char error_code_str[16]; + bool ret = false; + HTTP_VALUE *origin; + if (s == NULL || status_string == NULL || (data_size != 0 && data == NULL) || request_headers == NULL) + { + return false; + } + if (content_type == NULL) + { + content_type = "text/html; charset=utf-8"; + } + + ToStr(error_code_str, status_code); + GetHttpDateStr(date_str, sizeof(date_str), SystemTime64()); + + h = NewHttpHeader("HTTP/1.1", error_code_str, status_string); + + if (StrCmpi(request_headers->Method, "OPTIONS") == 0) + { + AddHttpValue(h, NewHttpValue("Allow", "OPTIONS, GET, POST")); + } + + AddHttpValue(h, NewHttpValue("Cache-Control", "no-cache")); + AddHttpValue(h, NewHttpValue("Content-Type", content_type)); + AddHttpValue(h, NewHttpValue("Date", date_str)); + AddHttpValue(h, NewHttpValue("Connection", "Keep-Alive")); + AddHttpValue(h, NewHttpValue("Access-Control-Allow-Methods", "OPTIONS,GET,POST")); + AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "X-VPNADMIN-HUBNAME,X-VPNADMIN-PASSWORD")); + AddHttpValue(h, NewHttpValue("Access-Control-Allow-Credentials", "true")); + + origin = GetHttpValue(request_headers, "Origin"); + if (origin != NULL) + { + AddHttpValue(h, NewHttpValue("Access-Control-Allow-Origin", origin->Data)); + } + + if (add_header_name != NULL && add_header_value != NULL) + { + AddHttpValue(h, NewHttpValue(add_header_name, add_header_value)); + } + + ret = PostHttp(s, h, data, data_size); + + FreeHttpHeader(h); + + return ret; +} + +// Send 404 error +bool AdminWebSend404Error(SOCK *s, HTTP_HEADER *request_headers) +{ + char *body = "\r\n404 Not Found

            Not Found

            The requested URL was not found on this server.

            \r\n"; + if (s == NULL || request_headers == NULL) + { + return false; + } + + return AdminWebSendBody(s, 404, "Not Found", body, StrLen(body), NULL, NULL, NULL, request_headers); +} + +// Send 302 redirect +bool AdminWebSend302Redirect(SOCK *s, char *url, char *query_string, HTTP_HEADER *request_headers) +{ + bool ret = false; + char *txt; + UINT txt_size; + char *url2; + UINT url2_size; + char *body = "Object moved\r\n

            Object moved to here.

            \r\n"; + if (s == NULL || url == NULL || request_headers == NULL) + { + return false; + } + + url2_size = (StrSize(url) + StrSize(query_string) + MAX_SIZE) * 2; + url2 = ZeroMalloc(url2_size); + + StrCpy(url2, url2_size, url); + if (IsEmptyStr(query_string) == false) + { + StrCat(url2, url2_size, "?"); + StrCat(url2, url2_size, query_string); + } + + txt_size = (StrSize(body) + StrSize(url2) + MAX_SIZE) * 2; + txt = ZeroMalloc(txt_size); + + ReplaceStrEx(txt, txt_size, body, "$URL$", url2, false); + + ret = AdminWebSendBody(s, 302, "Found", txt, StrLen(txt), NULL, "Location", url2, request_headers); + + Free(txt); + + Free(url2); + + return ret; +} + +// "/admin" web page POST handler +void AdminWebProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size, char *url_target) +{ + ADMIN *a; + UCHAR *data; + char url[MAX_PATH]; + char query_string[MAX_SIZE]; + UINT i; + if (c == NULL || s == NULL || h == NULL || url_target == NULL) + { + return; + } + + a = JsonRpcAuthLogin(c->Cedar, s, h); + if (a == NULL) + { + RecvAllWithDiscard(s, post_data_size, s->SecureMode); + AdminWebSendUnauthorized(s, h); + return; + } + + if (post_data_size > a->MaxJsonRpcRecvSize) + { + Disconnect(s); + return; + } + + data = ZeroMalloc(post_data_size + 1); + + if (RecvAll(s, data, post_data_size, s->SecureMode)) + { + c->JsonRpcAuthed = true; +#ifndef GC_SOFTETHER_OSS + RemoveDosEntry(c->Listener, s); +#endif // GC_SOFTETHER_OSS + + // Divide url_target into URL and query string + StrCpy(url, sizeof(url), url_target); + Zero(query_string, sizeof(query_string)); + i = SearchStr(url, "?", 0); + if (i != INFINITE) + { + StrCpy(query_string, sizeof(query_string), url + i + 1); + url[i] = 0; + } + + AdminWebHandleFileRequest(a, c, s, h, url, query_string, "/admin", "|wwwroot/admin"); + } + + Free(data); + Free(a); +} + +// "/admin" web page GET handler +void AdminWebProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target) +{ + ADMIN *a; + char url[MAX_PATH]; + char query_string[MAX_SIZE]; + UINT i; + if (c == NULL || s == NULL || h == NULL || url_target == NULL) + { + return; + } + + a = JsonRpcAuthLogin(c->Cedar, s, h); + if (a == NULL) + { + AdminWebSendUnauthorized(s, h); + return; + } + + c->JsonRpcAuthed = true; +#ifndef GC_SOFTETHER_OSS + RemoveDosEntry(c->Listener, s); +#endif // GC_SOFTETHER_OSS + + // Divide url_target into URL and query string + StrCpy(url, sizeof(url), url_target); + Zero(query_string, sizeof(query_string)); + i = SearchStr(url, "?", 0); + if (i != INFINITE) + { + StrCpy(query_string, sizeof(query_string), url + i + 1); + url[i] = 0; + } + + AdminWebHandleFileRequest(a, c, s, h, url, query_string, "/admin", "|wwwroot/admin"); + + Free(a); +} + +// New JSON-RPC Result +JSON_VALUE *JsonRpcNewResponse(PACK *p) +{ + JSON_VALUE *jv; + JSON_OBJECT *jo; + JSON_VALUE *jv2; + + if (p == NULL) + { + return NULL; + } + + jv = JsonNewObject(); + jo = JsonValueGetObject(jv); + + jv2 = PackToJson(p); + + JsonSet(jo, "result", jv2); + + return jv; +} + +// New JSON-RPC Error +JSON_VALUE *JsonRpcNewError(int code, wchar_t *message) +{ + wchar_t msg[MAX_PATH]; + JSON_VALUE *jv; + JSON_OBJECT *jo; + JSON_VALUE *jv2; + JSON_OBJECT *jo2; + + if (UniIsEmptyStr(message)) + { + UniFormat(msg, sizeof(msg), L"Error code %u", code); + } + else + { + UniFormat(msg, sizeof(msg), L"Error code %u: %s", code, message); + } + + jv = JsonNewObject(); + jo = JsonValueGetObject(jv); + + jv2 = JsonNewObject(); + jo2 = JsonValueGetObject(jv2); + + JsonSet(jo, "error", jv2); + + JsonSetNumber(jo2, "code", (UINT64)code); + JsonSetUniStr(jo2, "message", msg); + + return jv; +} + +// JSON-RPC process request object +JSON_VALUE *JsonRpcProcRequestObject(ADMIN *admin, CONNECTION *c, SOCK *s, JSON_VALUE *json_req, char *method_name) +{ + PACK *pack_request; + JSON_VALUE *ret = NULL; + if (c == NULL || s == NULL || json_req == NULL || admin == NULL) + { + return NULL; + } + + pack_request = JsonToPack(json_req); + + PackAddStr(pack_request, "function_name", method_name); + + if (pack_request != NULL) + { + RPC *rpc; + PACK *pack_response; + UINT err; + + // RPC Server + rpc = StartRpcServer(s, AdminDispatch, admin); + + admin->Rpc = rpc; + + pack_response = CallRpcDispatcher(rpc, pack_request); + + if (pack_response == NULL) + { + pack_response = PackError(ERR_NOT_SUPPORTED); + } + + RpcFreeEx(rpc, true); + + FreePack(pack_request); + + // Construct response object + err = GetErrorFromPack(pack_response); + if (err != 0) + { + // Return the error + ret = JsonRpcNewError(err, _E(err)); + } + else + { + // Return the PACK + ret = JsonRpcNewResponse(pack_response); + } + + SLog(admin->Server->Cedar, "LS_API_RPC_CALL", + &s->RemoteIP, s->RemotePort, s->RemoteHostname, + method_name, err, _E(err)); + + FreePack(pack_response); + } + + return ret; +} + +// JSON-RPC HTTP user authentication +bool HttpParseBasicAuthHeader(HTTP_HEADER *h, char *username, UINT username_size, char *password, UINT password_size) +{ + bool ret = false; + HTTP_VALUE *auth_value; + HTTP_VALUE *vpnadmin_hubname; + HTTP_VALUE *vpnadmin_password; + if (h == NULL || username == NULL || password == NULL) + { + return false; + } + + auth_value = GetHttpValue(h, "Authorization"); + vpnadmin_hubname = GetHttpValue(h, "X-VPNADMIN-HUBNAME"); + vpnadmin_password = GetHttpValue(h, "X-VPNADMIN-PASSWORD"); + + if (vpnadmin_password != NULL) + { + if (vpnadmin_hubname == NULL) + { + StrCpy(username, username_size, ""); + } + else + { + StrCpy(username, username_size, vpnadmin_hubname->Data); + } + + StrCpy(password, password_size, vpnadmin_password->Data); + + ret = true; + } + + if (ret == false && auth_value != NULL) + { + char key[32], value[MAX_SIZE]; + + if (GetKeyAndValue(auth_value->Data, key, sizeof(key), value, sizeof(value), " \t")) + { + if (StrCmpi(key, "Basic") == 0 && IsEmptyStr(value) == false) + { + UINT b64_dest_size = StrSize(value) * 2 + 256; + char *b64_dest = ZeroMalloc(b64_dest_size); + + Decode64(b64_dest, value); + + if (IsEmptyStr(b64_dest) == false) + { + if (b64_dest[0] == ':') + { + // Empty username + StrCpy(username, username_size, ""); + StrCpy(password, password_size, b64_dest + 1); + ret = true; + } + else + { + if (GetKeyAndValue(b64_dest, username, username_size, password, password_size, ":")) + { + ret = true; + } + } + } + + Free(b64_dest); + } + } + } + + return ret; +} + +// JSON-RPC Login +ADMIN *JsonRpcAuthLogin(CEDAR *c, SOCK *sock, HTTP_HEADER *h) +{ + ADMIN *a = NULL; + char username[MAX_HUBNAME_LEN + 1]; + char password[MAX_PASSWORD_LEN + 1]; + SERVER *s; + char empty_pw_hash[SHA1_SIZE]; + + if (c == NULL || h == NULL || sock == NULL) + { + return NULL; + } + + s = c->Server; + + HashAdminPassword(empty_pw_hash, ""); + + Zero(username, sizeof(username)); + Zero(password, sizeof(password)); + + if (HttpParseBasicAuthHeader(h, username, sizeof(username), password, sizeof(password))) + { + char pw_hash[SHA1_SIZE]; + bool is_server_admin = false; + bool is_hub_admin = false; + char hub_name[MAX_HUBNAME_LEN + 1]; + + HashAdminPassword(pw_hash, password); + + Zero(hub_name, sizeof(hub_name)); + + // Check if the server administrator password is empty. If yes, login always success. + if (Cmp(s->HashedPassword, empty_pw_hash, SHA1_SIZE) == 0) + { + is_server_admin = true; + } + else + { + if (IsEmptyStr(username) || StrCmpi(username, ADMINISTRATOR_USERNAME) == 0) + { + // If the username is empty or 'administrator', verify with the server admin password. + if (Cmp(s->HashedPassword, pw_hash, SHA1_SIZE) == 0) + { + is_server_admin = true; + } + } + } + + if (is_server_admin == false) + { + HUB *h; + // Hub admin mode + LockHubList(c); + { + h = GetHub(c, username); + } + UnlockHubList(c); + + if (h != NULL) + { + Lock(h->lock); + { + if (Cmp(pw_hash, h->HashedPassword, SHA1_SIZE) == 0) + { + is_hub_admin = true; + + StrCpy(hub_name, sizeof(hub_name), h->Name); + } + } + Unlock(h->lock); + + ReleaseHub(h); + } + } + + if (is_server_admin || is_hub_admin) + { + if (CheckAdminSourceAddress(sock, hub_name)) + { + a = ZeroMalloc(sizeof(ADMIN)); + + a->Server = s; + a->ServerAdmin = is_server_admin; + a->ClientBuild = c->Build; + + if (is_hub_admin) + { + StrCpy(a->dummy1, sizeof(a->dummy1), hub_name); + a->HubName = a->dummy1; + } + } + } + } + + if (a != NULL) + { + char admin_mode[256]; + if (a->ServerAdmin) + { + a->MaxJsonRpcRecvSize = ADMIN_RPC_MAX_POST_SIZE_BY_SERVER_ADMIN; + } + else + { + a->MaxJsonRpcRecvSize = ADMIN_RPC_MAX_POST_SIZE_BY_HUB_ADMIN; + } + + if (IsEmptyStr(a->HubName)) + { + StrCpy(admin_mode, sizeof(admin_mode), + "Entire VPN Server Admin Mode"); + } + else + { + Format(admin_mode, sizeof(admin_mode), + "Virtual Hub Admin Mode for '%s'", + a->HubName); + } + + SLog(s->Cedar, "LS_API_AUTH_OK", + &sock->RemoteIP, sock->RemotePort, sock->RemoteHostname, + admin_mode, username, h->Method, h->Target); + } + else + { + SLog(s->Cedar, "LS_API_AUTH_ERROR", + &sock->RemoteIP, sock->RemotePort, sock->RemoteHostname, + username, h->Method, h->Target); + } + + + return a; +} + +// Query string to JSON list value +JSON_VALUE *QueryStringToJsonListValue(char *qs) +{ + TOKEN_LIST *t; + UINT i; + LIST *distinct_list = NULL; + JSON_VALUE *v = NULL; + JSON_OBJECT *o = NULL; + if (qs == NULL) + { + return NULL; + } + + t = ParseTokenWithoutNullStr(qs, "&"); + if (t == NULL) + { + return NULL; + } + + distinct_list = NewStrList(); + + v = JsonNewObject(); + o = JsonValueGetObject(v); + + for (i = 0;i < t->NumTokens;i++) + { + char *token = t->Token[i]; + UINT pos; + + pos = SearchStr(token, "=", 0); + if (pos != INFINITE) + { + char *key_decoded; + char *value_decoded; + char *key = CopyStr(token); + char *value = CopyStr(token + pos + 1); + + key[pos] = 0; + key_decoded = UrlDecode(key); + value_decoded = UrlDecode(value); + + if (key_decoded != NULL && value_decoded != NULL) + { + if (AddStrToStrListDistinct(distinct_list, key_decoded)) + { + JsonSetStr(o, key_decoded, value_decoded); + } + } + + Free(value_decoded); + Free(key_decoded); + Free(key); + Free(value); + } + } + + FreeToken(t); + + FreeStrList(distinct_list); + + return v; +} + +// Construct new JSON-RPC dummy request +JSON_VALUE *ConstructDummyJsonRpcRequest(char *method_name, JSON_VALUE *p) +{ + JSON_VALUE *ret; + JSON_OBJECT *ret_object; + UCHAR rand[16]; + char id_str[64]; + + Rand(rand, sizeof(rand)); + + BinToStr(id_str, sizeof(id_str), rand, sizeof(rand)); + + ret = JsonNewObject(); + ret_object = JsonObject(ret); + + JsonSetStr(ret_object, "jsonrpc", "2.0"); + JsonSetStr(ret_object, "method", method_name); + JsonSet(ret_object, "params", p); + JsonSetStr(ret_object, "id", id_str); + + return ret; +} + +// JSON-RPC Options Dispatch +void JsonRpcProcOptions(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target) +{ + if (c == NULL || s == NULL || h == NULL || url_target == NULL) + { + return; + } + + c->JsonRpcAuthed = true; + +#ifndef GC_SOFTETHER_OSS + RemoveDosEntry(c->Listener, s); +#endif // GC_SOFTETHER_OSS + + AdminWebSendBody(s, 200, "OK", NULL, 0, NULL, NULL, NULL, h); +} + +// JSON-RPC GET Dispatch +void JsonRpcProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target) +{ + ADMIN *a; + char url[MAX_PATH]; + char query_string[MAX_SIZE]; + UINT i; + bool reply_sent = false; + if (c == NULL || s == NULL || h == NULL || url_target == NULL) + { + return; + } + + a = JsonRpcAuthLogin(c->Cedar, s, h); + if (a == NULL) + { + AdminWebSendUnauthorized(s, h); + return; + } + + c->JsonRpcAuthed = true; + +#ifndef GC_SOFTETHER_OSS + RemoveDosEntry(c->Listener, s); +#endif // GC_SOFTETHER_OSS + + // Divide url_target into URL and query string + StrCpy(url, sizeof(url), url_target); + Zero(query_string, sizeof(query_string)); + i = SearchStr(url, "?", 0); + if (i != INFINITE) + { + StrCpy(query_string, sizeof(query_string), url + i + 1); + url[i] = 0; + } + + if (StartWith(url, "/api/")) + { + // Call a method + JSON_VALUE *params_value = NULL; + JSON_OBJECT *params_object = NULL; + UINT i; + char method_name[MAX_PATH]; + + StrCpy(method_name, sizeof(method_name), url + 5); + + i = SearchStr(method_name, "/", 0); + if (i != INFINITE) + { + method_name[i] = 0; + } + + if (IsEmptyStr(method_name) == false) + { + // Call a method + params_value = QueryStringToJsonListValue(query_string); + + if (params_value != NULL) + { + JSON_VALUE *json_ret = NULL; + char id[96]; + char *ret_str = NULL; + + GetDateTimeStrMilli64(id, sizeof(id), LocalTime64()); + + params_object = JsonObject(params_value); + + // Process the request + json_ret = JsonRpcProcRequestObject(a, c, s, params_value, method_name); + + if (json_ret == NULL) + { + json_ret = JsonRpcNewError(ERR_INTERNAL_ERROR, L"Internal error"); + } + + JsonSetStr(JsonObject(json_ret), "jsonrpc", "2.0"); + JsonSetStr(JsonObject(json_ret), "id", id); + + ret_str = JsonToStr(json_ret); + + AdminWebSendBody(s, 200, "OK", ret_str, StrLen(ret_str), "text/plain; charset=UTF-8", NULL, NULL, h); + + Free(ret_str); + JsonFree(json_ret); + JsonFree(params_value); + } + } + } + + + if (reply_sent == false) + { + BUF *html_buf = ReadDump("|vpnserver_api_doc.html"); + + if (html_buf != NULL) + { + AdminWebSendBody(s, 200, "OK", html_buf->Buf, html_buf->Size, "text/html; charset=UTF-8", NULL, NULL, h); + + FreeBuf(html_buf); + } + else + { + AdminWebSend404Error(s, h); + } + } + + if (a->LogFileList != NULL) + { + FreeEnumLogFile(a->LogFileList); + } + Free(a); +} + +// JSON-RPC POST Dispatch +void JsonRpcProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size) +{ + ADMIN *a; + UCHAR *data; + if (c == NULL || s == NULL || h == NULL) + { + return; + } + + a = JsonRpcAuthLogin(c->Cedar, s, h); + if (a == NULL) + { + RecvAllWithDiscard(s, post_data_size, s->SecureMode); + AdminWebSendUnauthorized(s, h); + return; + } + + if (post_data_size > a->MaxJsonRpcRecvSize) + { + Disconnect(s); + return; + } + + data = ZeroMalloc(post_data_size + 1); + + if (RecvAll(s, data, post_data_size, s->SecureMode)) + { + // Parse JSON + JSON_VALUE *json_req = StrToJson(data); + JSON_OBJECT *json_req_object = JsonObject(json_req); + JSON_VALUE *json_ret = NULL; + char *res = NULL; + char *request_id = NULL; + char *method_name = NULL; + + c->JsonRpcAuthed = true; + +#ifndef GC_SOFTETHER_OSS + RemoveDosEntry(c->Listener, s); +#endif // GC_SOFTETHER_OSS + + if (json_req == NULL || json_req_object == NULL) + { + // Parse error + json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"Parameter is invalid: JSON-RPC Parse Error"); + } + else + { + // check the JSON-RPC version + char *ver_str = JsonGetStr(json_req_object, "jsonrpc"); + if (StrCmpi(ver_str, "2.0") != 0) + { + // Invalid version + json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC version is invalid"); + } + else + { + JSON_VALUE *params_value = NULL; + JSON_OBJECT *params_object = NULL; + + // Get Request ID + request_id = JsonGetStr(json_req_object, "id"); + + // Get method name + method_name = JsonGetStr(json_req_object, "method"); + + // Get parameters + params_value = JsonGet(json_req_object, "params"); + params_object = JsonObject(params_value); + + if (IsEmptyStr(method_name)) + { + // method is empty + json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC method name is empty"); + } + else if (params_value == NULL || params_object == NULL) + { + // params is empty + json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC parameter is empty"); + } + else + { + // Process the request + json_ret = JsonRpcProcRequestObject(a, c, s, params_value, method_name); + } + } + } + + if (json_ret == NULL) + { + json_ret = JsonRpcNewError(ERR_INTERNAL_ERROR, L"Internal error"); + } + + JsonSetStr(JsonObject(json_ret), "jsonrpc", "2.0"); + if (request_id == NULL) + { + request_id = "0"; + } + JsonSetStr(JsonObject(json_ret), "id", request_id); + + res = JsonToStr(json_ret); + + AdminWebSendBody(s, 200, "OK", res, StrLen(res), "application/json", NULL, NULL, h); + + Free(res); + + JsonFree(json_ret); + JsonFree(json_req); + } + + Free(data); + + if (a->LogFileList != NULL) + { + FreeEnumLogFile(a->LogFileList); + } + Free(a); +} + // Dispatch routine for Administration RPC PACK *AdminDispatch(RPC *rpc, char *name, PACK *p) { @@ -1794,8 +2945,20 @@ // Check the permission to read the log file if (a->LogFileList == NULL) { - // Cache not found - return ERR_OBJECT_NOT_FOUND; + // Enum the log files first + RPC_ENUM_LOG_FILE elf; + UINT elf_ret; + + Zero(&elf, sizeof(elf)); + + elf_ret = StEnumLogFile(a, &elf); + + FreeRpcEnumLogFile(&elf); + + if (elf_ret != ERR_NO_ERROR) + { + return elf_ret; + } } if (CheckLogFileNameFromEnumList(a->LogFileList, logfilename, servername) == false) { @@ -1860,6 +3023,10 @@ ALog(a, NULL, "LA_READ_LOG_FILE", servername, logfilename); } + StrCpy(t->FilePath, sizeof(t->FilePath), logfilename); + StrCpy(t->ServerName, sizeof(t->ServerName), servername); + t->Offset = offset; + return ERR_NO_ERROR; } @@ -2150,7 +3317,7 @@ if (crl == NULL) { - ret = ERR_INTERNAL_ERROR; + ret = ERR_OBJECT_NOT_FOUND; } else { @@ -2219,7 +3386,7 @@ if (crl == NULL) { - ret = ERR_INTERNAL_ERROR; + ret = ERR_OBJECT_NOT_FOUND; } else { @@ -2279,7 +3446,7 @@ if (crl == NULL) { - ret = ERR_INTERNAL_ERROR; + ret = ERR_OBJECT_NOT_FOUND; } else { @@ -3176,6 +4343,7 @@ StrCpy(e->Name, sizeof(e->Name), a->Name); e->Value = a->Value; + UniStrCpy(e->Descrption, sizeof(e->Descrption), GetHubAdminOptionHelpString(e->Name)); } } UnlockList(h->AdminOptionList); @@ -3208,6 +4376,7 @@ StrCpy(a->Name, sizeof(a->Name), admin_options[i].Name); a->Value = admin_options[i].Value; + UniStrCpy(a->Descrption, sizeof(a->Descrption), GetHubAdminOptionHelpString(a->Name)); } return ERR_NO_ERROR; @@ -3712,6 +4881,7 @@ StrCpy(e->SessionName, sizeof(e->SessionName), table->Session->Name); e->Ip = IPToUINT(&table->Ip); Copy(&e->IpV6, &table->Ip, sizeof(IP)); + Copy(&e->IpAddress, &table->Ip, sizeof(IP)); e->DhcpAllocated = table->DhcpAllocated; e->CreatedTime = TickToTime(table->CreatedTime); e->UpdatedTime = TickToTime(table->UpdatedTime); @@ -4163,6 +5333,8 @@ Copy(&t->ClientIp6, &s->Connection->ClientIp.ipv6_addr, sizeof(t->ClientIp6)); } + CopyIP(&t->ClientIpAddress, &s->Connection->ClientIp); + StrCpy(t->ClientHostName, sizeof(t->ClientHostName), s->Connection->ClientHostname); } } @@ -5324,31 +6496,34 @@ { UINT i; - // Confirm whether the access list of form which cannot handle by the old client already exists - if (a->ClientBuild < 6560) + if (a->ClientBuild != 0) { - for (i = 0;i < LIST_NUM(h->AccessList);i++) + // Confirm whether the access list of form which cannot handle by the old client already exists + if (a->ClientBuild < 6560) { - ACCESS *access = LIST_DATA(h->AccessList, i); - if (access->IsIPv6 || - access->Jitter != 0 || access->Loss != 0 || access->Delay != 0) + for (i = 0;i < LIST_NUM(h->AccessList);i++) { - ret = ERR_VERSION_INVALID; - break; + ACCESS *access = LIST_DATA(h->AccessList, i); + if (access->IsIPv6 || + access->Jitter != 0 || access->Loss != 0 || access->Delay != 0) + { + ret = ERR_VERSION_INVALID; + break; + } } } - } - if (a->ClientBuild < 8234) - { - for (i = 0;i < LIST_NUM(h->AccessList);i++) + if (a->ClientBuild < 8234) { - ACCESS *access = LIST_DATA(h->AccessList, i); - - if (IsEmptyStr(access->RedirectUrl) == false) + for (i = 0;i < LIST_NUM(h->AccessList);i++) { - ret = ERR_VERSION_INVALID; - break; + ACCESS *access = LIST_DATA(h->AccessList, i); + + if (IsEmptyStr(access->RedirectUrl) == false) + { + ret = ERR_VERSION_INVALID; + break; + } } } } @@ -6449,6 +7624,7 @@ FreeRpcHubGetCa(t); Zero(t, sizeof(RPC_HUB_GET_CA)); + t->Key = key; StrCpy(t->HubName, sizeof(t->HubName), hubname); CHECK_RIGHT; @@ -7044,6 +8220,7 @@ ReleaseHub(h); + StrCpy(t->HubName, sizeof(t->HubName), hubname); ret = ERR_NO_ERROR; return ret; @@ -7895,6 +9072,13 @@ return ERR_NOT_SUPPORTED; } + // For JSON-RPC + if (StrLen(t->AdminPasswordPlainText) != 0) + { + Sha0(t->HashedPassword, t->AdminPasswordPlainText, StrLen(t->AdminPasswordPlainText)); + HashPassword(t->SecurePassword, ADMINISTRATOR_USERNAME, t->AdminPasswordPlainText); + } + if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)) == false && IsZero(t->SecurePassword, sizeof(t->SecurePassword)) == false) { @@ -8065,6 +9249,15 @@ ALog(a, NULL, "LA_CREATE_HUB", t->HubName); + // For JSON-RPC + if ((IsZero(t->HashedPassword, sizeof(t->HashedPassword)) && + IsZero(t->SecurePassword, sizeof(t->SecurePassword))) || + StrLen(t->AdminPasswordPlainText) != 0) + { + Sha0(t->HashedPassword, t->AdminPasswordPlainText, StrLen(t->AdminPasswordPlainText)); + HashPassword(t->SecurePassword, ADMINISTRATOR_USERNAME, t->AdminPasswordPlainText); + } + h = NewHub(c, t->HubName, &o); Copy(h->HashedPassword, t->HashedPassword, SHA1_SIZE); Copy(h->SecurePassword, t->SecurePassword, SHA1_SIZE); @@ -8518,6 +9711,11 @@ { SERVER_ADMIN_ONLY; + if (IsZero(t->HashedPassword, sizeof(t->HashedPassword))) + { + // For JSON-RPC + HashAdminPassword(t->HashedPassword, t->PlainTextPassword); + } Copy(a->Server->HashedPassword, t->HashedPassword, SHA1_SIZE); @@ -8887,6 +10085,8 @@ PackGetStr(p, "DnsSuffix", t->DnsSuffix, sizeof(t->DnsSuffix)); PackGetStr(p, "CurrentIPv4", t->CurrentIPv4, sizeof(t->CurrentIPv4)); PackGetStr(p, "CurrentIPv6", t->CurrentIPv6, sizeof(t->CurrentIPv6)); + PackGetUniStr(p, "ErrStr_IPv4", t->ErrStr_IPv4, sizeof(t->ErrStr_IPv4)); + PackGetUniStr(p, "ErrStr_IPv6", t->ErrStr_IPv6, sizeof(t->ErrStr_IPv6)); } void OutDDnsClientStatus(PACK *p, DDNS_CLIENT_STATUS *t) { @@ -8903,6 +10103,8 @@ PackAddStr(p, "DnsSuffix", t->DnsSuffix); PackAddStr(p, "CurrentIPv4", t->CurrentIPv4); PackAddStr(p, "CurrentIPv6", t->CurrentIPv6); + PackAddUniStr(p, "ErrStr_IPv4", t->ErrStr_IPv4); + PackAddUniStr(p, "ErrStr_IPv6", t->ErrStr_IPv6); } // INTERNET_SETTING @@ -9056,6 +10258,7 @@ PackAddInt(p, "NumItem", t->NumItem); + PackSetCurrentJsonGroupName(p, "Settings"); for (i = 0;i < t->NumItem;i++) { ETHERIP_ID *e = &t->IdList[i]; @@ -9065,6 +10268,7 @@ PackAddStrEx(p, "UserName", e->UserName, i, t->NumItem); PackAddStrEx(p, "Password", e->Password, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumEtherIpId(RPC_ENUM_ETHERIP_ID *t) { @@ -9235,6 +10439,7 @@ return; } + PackSetCurrentJsonGroupName(p, "Devices"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_ETH_VLAN_ITEM *e = &t->Items[i]; @@ -9247,6 +10452,7 @@ PackAddBoolEx(p, "Support", e->Support, i, t->NumItem); PackAddBoolEx(p, "Enabled", e->Enabled, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumEthVLan(RPC_ENUM_ETH_VLAN *t) { @@ -9294,6 +10500,7 @@ PackAddInt(p, "NumItem", t->NumItem); + PackSetCurrentJsonGroupName(p, "LogFiles"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i]; @@ -9301,8 +10508,9 @@ PackAddStrEx(p, "FilePath", e->FilePath, i, t->NumItem); PackAddStrEx(p, "ServerName", e->ServerName, i, t->NumItem); PackAddIntEx(p, "FileSize", e->FileSize, i, t->NumItem); - PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumItem); + PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumLogFile(RPC_ENUM_LOG_FILE *t) { @@ -9437,12 +10645,13 @@ o = NewAcList(); PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName)); - num = PackGetInt(p, "NumItem"); + num = PackGetIndexCount(p, "IpAddress"); for (i = 0;i < num;i++) { AC *ac = ZeroMalloc(sizeof(AC)); + ac->Id = PackGetIntEx(p, "Id", i); ac->Deny = PackGetBoolEx(p, "Deny", i); PackGetIpEx(p, "IpAddress", &ac->IpAddress, i); ac->Masked = PackGetBoolEx(p, "Masked", i); @@ -9478,10 +10687,12 @@ PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "ACList"); for (i = 0;i < num;i++) { AC *ac = LIST_DATA(o, i); + PackAddIntEx(p, "Id", ac->Id, i, num); PackAddBoolEx(p, "Deny", ac->Deny, i, num); PackAddIpEx(p, "IpAddress", &ac->IpAddress, i, num); PackAddBoolEx(p, "Masked", ac->Masked, i, num); @@ -9490,6 +10701,7 @@ PackAddIntEx(p, "Priority", ac->Priority, i, num); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcAcList(RPC_AC_LIST *t) { @@ -9560,6 +10772,7 @@ PackAddStr(p, "HubName", t->HubName); PackAddInt(p, "NumItem", t->NumItem); + PackSetCurrentJsonGroupName(p, "CRLList"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_CRL_ITEM *e = &t->Items[i]; @@ -9567,6 +10780,7 @@ PackAddIntEx(p, "Key", e->Key, i, t->NumItem); PackAddUniStrEx(p, "CrlInfo", e->CrlInfo, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumCrl(RPC_ENUM_CRL *t) { @@ -9739,6 +10953,7 @@ PackAddInt(p, "NumItem", t->NumItem); PackAddStr(p, "Name", t->Name); + PackSetCurrentJsonGroupName(p, "L3Table"); for (i = 0;i < t->NumItem;i++) { RPC_L3TABLE *e = &t->Items[i]; @@ -9748,6 +10963,7 @@ PackAddIp32Ex(p, "GatewayAddress", e->GatewayAddress, i, t->NumItem); PackAddIntEx(p, "Metric", e->Metric, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumL3Table(RPC_ENUM_L3TABLE *t) { @@ -9821,6 +11037,7 @@ PackAddInt(p, "NumItem", t->NumItem); PackAddStr(p, "Name", t->Name); + PackSetCurrentJsonGroupName(p, "L3IFList"); for (i = 0;i < t->NumItem;i++) { RPC_L3IF *f = &t->Items[i]; @@ -9829,6 +11046,7 @@ PackAddIp32Ex(p, "IpAddress", f->IpAddress, i, t->NumItem); PackAddIp32Ex(p, "SubnetMask", f->SubnetMask, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumL3If(RPC_ENUM_L3IF *t) { @@ -9929,6 +11147,7 @@ PackAddInt(p, "NumItem", t->NumItem); + PackSetCurrentJsonGroupName(p, "L3SWList"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_L3SW_ITEM *s = &t->Items[i]; @@ -9939,6 +11158,7 @@ PackAddBoolEx(p, "Active", s->Active, i, t->NumItem); PackAddBoolEx(p, "Online", s->Online, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumL3Sw(RPC_ENUM_L3SW *t) { @@ -9983,12 +11203,14 @@ PackAddInt(p, "NumItem", t->NumItem); + PackSetCurrentJsonGroupName(p, "EthList"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_ETH_ITEM *e = &t->Items[i]; PackAddStrEx(p, "DeviceName", e->DeviceName, i, t->NumItem); PackAddUniStrEx(p, "NetworkConnectionName", e->NetworkConnectionName, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumEth(RPC_ENUM_ETH *t) { @@ -10064,6 +11286,7 @@ PackAddInt(p, "NumItem", t->NumItem); + PackSetCurrentJsonGroupName(p, "LocalBridgeList"); for (i = 0;i < t->NumItem;i++) { RPC_LOCALBRIDGE *e = &t->Items[i]; @@ -10074,6 +11297,7 @@ PackAddBoolEx(p, "Active", e->Active, i, t->NumItem); PackAddBoolEx(p, "TapMode", e->TapMode, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumLocalBridge(RPC_ENUM_LOCALBRIDGE *t) { @@ -10303,8 +11527,11 @@ StrCpy(e->Name, sizeof(e->Name), s->Name); StrCpy(e->Username, sizeof(e->Username), s->Username); e->Ip = IPToUINT(&s->Connection->ClientIp); + CopyIP(&e->ClientIP, &s->Connection->ClientIp); StrCpy(e->Hostname, sizeof(e->Hostname), s->Connection->ClientHostname); e->MaxNumTcp = s->MaxConnection; + e->CreatedTime = Tick64ToTime64(s->CreatedTime); + e->LastCommTime = Tick64ToTime64(s->LastCommTime); e->LinkMode = s->LinkModeServer; e->SecureNATMode = s->SecureNATMode; e->BridgeMode = s->BridgeMode; @@ -10400,6 +11627,8 @@ } PackAddInt(p, "NumItem", t->NumItem); + + PackSetCurrentJsonGroupName(p, "LicenseKeyList"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_LICENSE_KEY_ITEM *e = &t->Items[i]; @@ -10408,12 +11637,13 @@ PackAddStrEx(p, "LicenseKey", e->LicenseKey, i, t->NumItem); PackAddStrEx(p, "LicenseId", e->LicenseId, i, t->NumItem); PackAddStrEx(p, "LicenseName", e->LicenseName, i, t->NumItem); - PackAddInt64Ex(p, "Expires", e->Expires, i, t->NumItem); + PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumItem); PackAddIntEx(p, "Status", e->Status, i, t->NumItem); PackAddIntEx(p, "ProductId", e->ProductId, i, t->NumItem); PackAddInt64Ex(p, "SystemId", e->SystemId, i, t->NumItem); PackAddIntEx(p, "SerialId", e->SerialId, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumLicenseKey(RPC_ENUM_LICENSE_KEY *t) { @@ -10463,17 +11693,17 @@ PackAddInt(p, "EditionId", t->EditionId); PackAddStr(p, "EditionStr", t->EditionStr); PackAddInt64(p, "SystemId", t->SystemId); - PackAddInt64(p, "SystemExpires", t->SystemExpires); + PackAddTime64(p, "SystemExpires", t->SystemExpires); PackAddInt(p, "NumClientConnectLicense", t->NumClientConnectLicense); PackAddInt(p, "NumBridgeConnectLicense", t->NumBridgeConnectLicense); // v3.0 PackAddBool(p, "NeedSubscription", t->NeedSubscription); PackAddBool(p, "AllowEnterpriseFunction", t->AllowEnterpriseFunction); - PackAddInt64(p, "SubscriptionExpires", t->SubscriptionExpires); + PackAddTime64(p, "SubscriptionExpires", t->SubscriptionExpires); PackAddBool(p, "IsSubscriptionExpired", t->IsSubscriptionExpired); PackAddInt(p, "NumUserCreationLicense", t->NumUserCreationLicense); - PackAddInt64(p, "ReleaseDate", t->ReleaseDate); + PackAddTime64(p, "ReleaseDate", t->ReleaseDate); } // RPC_ADMIN_OPTION @@ -10487,7 +11717,7 @@ } Zero(t, sizeof(RPC_ADMIN_OPTION)); - t->NumItem = PackGetInt(p, "NumItem"); + t->NumItem = PackGetIndexCount(p, "Name"); t->Items = ZeroMalloc(sizeof(ADMIN_OPTION) * t->NumItem); PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName)); @@ -10498,6 +11728,7 @@ PackGetStrEx(p, "Name", o->Name, sizeof(o->Name), i); o->Value = PackGetIntEx(p, "Value", i); + PackGetUniStrEx(p, "Descrption", o->Descrption, sizeof(o->Descrption), i); } } void OutRpcAdminOption(PACK *p, RPC_ADMIN_OPTION *t) @@ -10513,13 +11744,16 @@ PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "AdminOptionList"); for (i = 0;i < t->NumItem;i++) { ADMIN_OPTION *o = &t->Items[i]; PackAddStrEx(p, "Name", o->Name, i, t->NumItem); PackAddIntEx(p, "Value", o->Value, i, t->NumItem); + PackAddUniStrEx(p, "Descrption", o->Descrption, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcAdminOption(RPC_ADMIN_OPTION *t) { @@ -10686,7 +11920,7 @@ PackAddInt(p, "ServerBuildInt", t->ServerBuildInt); PackAddStr(p, "ServerHostName", t->ServerHostName); PackAddInt(p, "ServerType", t->ServerType); - PackAddInt64(p, "ServerBuildDate", t->ServerBuildDate); + PackAddTime64(p, "ServerBuildDate", t->ServerBuildDate); PackAddStr(p, "ServerFamilyName", t->ServerFamilyName); OutRpcOsInfo(p, &t->OsInfo); } @@ -10761,13 +11995,13 @@ PackAddInt(p, "NumIpTables", t->NumIpTables); PackAddInt(p, "NumUsers", t->NumUsers); PackAddInt(p, "NumGroups", t->NumGroups); - PackAddInt64(p, "CurrentTime", t->CurrentTime); + PackAddTime64(p, "CurrentTime", t->CurrentTime); PackAddInt64(p, "CurrentTick", t->CurrentTick); PackAddInt(p, "AssignedBridgeLicenses", t->AssignedBridgeLicenses); PackAddInt(p, "AssignedClientLicenses", t->AssignedClientLicenses); PackAddInt(p, "AssignedBridgeLicensesTotal", t->AssignedBridgeLicensesTotal); PackAddInt(p, "AssignedClientLicensesTotal", t->AssignedClientLicensesTotal); - PackAddInt64(p, "StartTime", t->StartTime); + PackAddTime64(p, "StartTime", t->StartTime); OutRpcTraffic(p, &t->Traffic); @@ -10830,12 +12064,14 @@ return; } + PackSetCurrentJsonGroupName(p, "ListenerList"); for (i = 0;i < t->NumPort;i++) { PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort); PackAddBoolEx(p, "Enables", t->Enables[i], i, t->NumPort); PackAddBoolEx(p, "Errors", t->Errors[i], i, t->NumPort); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcListenerList(RPC_LISTENER_LIST *t) { @@ -10904,6 +12140,7 @@ Zero(t, sizeof(RPC_SET_PASSWORD)); PackGetData2(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword)); + PackGetStr(p, "PlainTextPassword", t->PlainTextPassword, sizeof(t->PlainTextPassword)); } void OutRpcSetPassword(PACK *p, RPC_SET_PASSWORD *t) { @@ -10914,6 +12151,7 @@ } PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword)); + PackAddStr(p, "PlainTextPassword", t->PlainTextPassword); } // RPC_FARM @@ -10938,6 +12176,7 @@ PackGetStr(p, "ControllerName", t->ControllerName, sizeof(t->ControllerName)); t->ControllerPort = PackGetInt(p, "ControllerPort"); PackGetData2(p, "MemberPassword", t->MemberPassword, sizeof(t->MemberPassword)); + PackGetStr(p, "MemberPasswordPlaintext", t->MemberPasswordPlaintext, sizeof(t->MemberPasswordPlaintext)); t->Weight = PackGetInt(p, "Weight"); t->ControllerOnly = PackGetBool(p, "ControllerOnly"); } @@ -10959,6 +12198,7 @@ PackAddStr(p, "ControllerName", t->ControllerName); PackAddInt(p, "ControllerPort", t->ControllerPort); PackAddData(p, "MemberPassword", t->MemberPassword, sizeof(t->MemberPassword)); + PackAddStr(p, "MemberPasswordPlaintext", t->MemberPasswordPlaintext); PackAddInt(p, "Weight", t->Weight); PackAddBool(p, "ControllerOnly", t->ControllerOnly); } @@ -11044,7 +12284,7 @@ PackAddInt(p, "Id", t->Id); PackAddBool(p, "Controller", t->Controller); - PackAddInt64(p, "ConnectedTime", t->ConnectedTime); + PackAddTime64(p, "ConnectedTime", t->ConnectedTime); PackAddIp32(p, "Ip", t->Ip); PackAddStr(p, "Hostname", t->Hostname); PackAddInt(p, "Point", t->Point); @@ -11053,11 +12293,15 @@ PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort); } PackAddX(p, "ServerCert", t->ServerCert); + + PackSetCurrentJsonGroupName(p, "HubsList"); for (i = 0;i < t->NumFarmHub;i++) { PackAddStrEx(p, "HubName", t->FarmHubs[i].HubName, i, t->NumFarmHub); PackAddBoolEx(p, "DynamicHub", t->FarmHubs[i].DynamicHub, i, t->NumFarmHub); } + PackSetCurrentJsonGroupName(p, NULL); + PackAddInt(p, "NumSessions", t->NumSessions); PackAddInt(p, "NumTcpConnections", t->NumTcpConnections); PackAddInt(p, "Weight", t->Weight); @@ -11114,13 +12358,14 @@ return; } + PackSetCurrentJsonGroupName(p, "FarmMemberList"); for (i = 0;i < t->NumFarm;i++) { RPC_ENUM_FARM_ITEM *e = &t->Farms[i]; PackAddIntEx(p, "Id", e->Id, i, t->NumFarm); PackAddBoolEx(p, "Controller", e->Controller, i, t->NumFarm); - PackAddInt64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumFarm); + PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumFarm); PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumFarm); PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumFarm); PackAddIntEx(p, "Point", e->Point, i, t->NumFarm); @@ -11130,6 +12375,7 @@ PackAddIntEx(p, "AssignedClientLicense", e->AssignedClientLicense, i, t->NumFarm); PackAddIntEx(p, "AssignedBridgeLicense", e->AssignedBridgeLicense, i, t->NumFarm); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumFarm(RPC_ENUM_FARM *t) { @@ -11175,9 +12421,9 @@ PackAddInt(p, "Port", t->Port); PackAddBool(p, "Online", t->Online); PackAddInt(p, "LastError", t->LastError); - PackAddInt64(p, "StartedTime", t->StartedTime); - PackAddInt64(p, "CurrentConnectedTime", t->CurrentConnectedTime); - PackAddInt64(p, "FirstConnectedTime", t->FirstConnectedTime); + PackAddTime64(p, "StartedTime", t->StartedTime); + PackAddTime64(p, "CurrentConnectedTime", t->CurrentConnectedTime); + PackAddTime64(p, "FirstConnectedTime", t->FirstConnectedTime); PackAddInt(p, "NumConnected", t->NumConnected); PackAddInt(p, "NumTry", t->NumTry); PackAddInt(p, "NumFailed", t->NumFailed); @@ -11275,6 +12521,7 @@ PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName)); PackGetData2(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword)); PackGetData2(p, "SecurePassword", t->SecurePassword, sizeof(t->SecurePassword)); + PackGetStr(p, "AdminPasswordPlainText", t->AdminPasswordPlainText, sizeof(t->AdminPasswordPlainText)); t->Online = PackGetBool(p, "Online"); InRpcHubOption(&t->HubOption, p); t->HubType = PackGetInt(p, "HubType"); @@ -11291,6 +12538,7 @@ PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword)); PackAddData(p, "SecurePassword", t->SecurePassword, sizeof(t->SecurePassword)); PackAddBool(p, "Online", t->Online); + PackAddStr(p, "AdminPasswordPlainText", t->AdminPasswordPlainText); OutRpcHubOption(p, &t->HubOption); PackAddInt(p, "HubType", t->HubType); } @@ -11339,6 +12587,7 @@ return; } + PackSetCurrentJsonGroupName(p, "HubList"); for (i = 0;i < t->NumHub;i++) { RPC_ENUM_HUB_ITEM *e = &t->Hubs[i]; @@ -11351,14 +12600,15 @@ PackAddIntEx(p, "NumGroups", e->NumGroups, i, t->NumHub); PackAddIntEx(p, "NumMacTables", e->NumMacTables, i, t->NumHub); PackAddIntEx(p, "NumIpTables", e->NumIpTables, i, t->NumHub); - PackAddInt64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumHub); - PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumHub); - PackAddInt64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumHub); + PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumHub); + PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumHub); + PackAddTime64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumHub); PackAddIntEx(p, "NumLogin", e->NumLogin, i, t->NumHub); PackAddBoolEx(p, "IsTrafficFilled", e->IsTrafficFilled, i, t->NumHub); OutRpcTrafficEx(&e->Traffic, p, i, t->NumHub); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumHub(RPC_ENUM_HUB *t) { @@ -11429,6 +12679,7 @@ return; } + PackSetCurrentJsonGroupName(p, "ConnectionList"); for (i = 0;i < t->NumConnection;i++) { RPC_ENUM_CONNECTION_ITEM *e = &t->Connections[i]; @@ -11437,9 +12688,10 @@ PackAddIntEx(p, "Port", e->Port, i, t->NumConnection); PackAddStrEx(p, "Name", e->Name, i, t->NumConnection); PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumConnection); - PackAddInt64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumConnection); + PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumConnection); PackAddIntEx(p, "Type", e->Type, i, t->NumConnection); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumConnection(RPC_ENUM_CONNECTION *t) { @@ -11509,7 +12761,7 @@ PackAddStr(p, "Name", t->Name); PackAddIp32(p, "Ip", t->Ip); PackAddInt(p, "Port", t->Port); - PackAddInt64(p, "ConnectedTime", t->ConnectedTime); + PackAddTime64(p, "ConnectedTime", t->ConnectedTime); PackAddStr(p, "Hostname", t->Hostname); PackAddStr(p, "ServerStr", t->ServerStr); PackAddStr(p, "ClientStr", t->ClientStr); @@ -11594,9 +12846,9 @@ PackAddInt(p, "NumIpTables", t->NumIpTables); PackAddBool(p, "SecureNATEnabled", t->SecureNATEnabled); OutRpcTraffic(p, &t->Traffic); - PackAddInt64(p, "LastCommTime", t->LastCommTime); - PackAddInt64(p, "CreatedTime", t->CreatedTime); - PackAddInt64(p, "LastLoginTime", t->LastLoginTime); + PackAddTime64(p, "LastCommTime", t->LastCommTime); + PackAddTime64(p, "CreatedTime", t->CreatedTime); + PackAddTime64(p, "LastLoginTime", t->LastLoginTime); PackAddInt(p, "NumLogin", t->NumLogin); } @@ -11711,6 +12963,7 @@ } PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "CAList"); for (i = 0;i < t->NumCa;i++) { RPC_HUB_ENUM_CA_ITEM *e = &t->Ca[i]; @@ -11718,8 +12971,9 @@ PackAddIntEx(p, "Key", e->Key, i, t->NumCa); PackAddUniStrEx(p, "SubjectName", e->SubjectName, i, t->NumCa); PackAddUniStrEx(p, "IssuerName", e->IssuerName, i, t->NumCa); - PackAddInt64Ex(p, "Expires", e->Expires, i, t->NumCa); + PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumCa); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcHubEnumCa(RPC_HUB_ENUM_CA *t) { @@ -11886,6 +13140,7 @@ e->ConnectedTime = PackGetInt64Ex(p, "ConnectedTime", i); e->Connected = PackGetBoolEx(p, "Connected", i); e->LastError = PackGetIntEx(p, "LastError", i); + PackGetStrEx(p, "LinkHubName", e->HubName, sizeof(e->HubName), i); } } void OutRpcEnumLink(PACK *p, RPC_ENUM_LINK *t) @@ -11899,6 +13154,7 @@ PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "LinkList"); for (i = 0;i < t->NumLink;i++) { RPC_ENUM_LINK_ITEM *e = &t->Links[i]; @@ -11907,10 +13163,12 @@ PackAddStrEx(p, "ConnectedHubName", e->HubName, i, t->NumLink); PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumLink); PackAddBoolEx(p, "Online", e->Online, i, t->NumLink); - PackAddInt64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumLink); + PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumLink); PackAddBoolEx(p, "Connected", e->Connected, i, t->NumLink); PackAddIntEx(p, "LastError", e->LastError, i, t->NumLink); + PackAddStrEx(p, "TargetHubName", e->HubName, i, t->NumLink); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumLink(RPC_ENUM_LINK *t) { @@ -12184,12 +13442,14 @@ } PackAddStr(p, "HubName", a->HubName); + PackSetCurrentJsonGroupName(p, "AccessList"); for (i = 0;i < a->NumAccess;i++) { ACCESS *e = &a->Accesses[i]; OutRpcAccessEx(p, e, i, a->NumAccess); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a) { @@ -12203,7 +13463,7 @@ } // AUTHDATA -void *InRpcAuthData(PACK *p, UINT *authtype) +void *InRpcAuthData(PACK *p, UINT *authtype, char *username) { wchar_t tmp[MAX_SIZE]; AUTHPASSWORD *pw; @@ -12212,6 +13472,7 @@ AUTHRADIUS *radius; AUTHNT *nt; BUF *b; + char plain_pw[MAX_SIZE]; // Validate arguments if (p == NULL) { @@ -12230,6 +13491,15 @@ pw = ZeroMalloc(sizeof(AUTHPASSWORD)); PackGetData2(p, "HashedKey", pw->HashedKey, sizeof(pw->HashedKey)); PackGetData2(p, "NtLmSecureHash", pw->NtLmSecureHash, sizeof(pw->NtLmSecureHash)); + + if (PackGetStr(p, "Auth_Password", plain_pw, sizeof(plain_pw))) + { + if (IsZero(pw->HashedKey, sizeof(pw->HashedKey))) + { + HashPassword(pw->HashedKey, username, plain_pw); + GenerateNtPasswordHash(pw->NtLmSecureHash, plain_pw); + } + } return pw; case AUTHTYPE_USERCERT: @@ -12347,7 +13617,7 @@ t->CreatedTime = PackGetInt64(p, "CreatedTime"); t->UpdatedTime = PackGetInt64(p, "UpdatedTime"); t->ExpireTime = PackGetInt64(p, "ExpireTime"); - t->AuthData = InRpcAuthData(p, &t->AuthType); + t->AuthData = InRpcAuthData(p, &t->AuthType, t->Name); t->NumLogin = PackGetInt(p, "NumLogin"); InRpcTraffic(&t->Traffic, p); @@ -12371,9 +13641,9 @@ PackAddStr(p, "GroupName", t->GroupName); PackAddUniStr(p, "Realname", t->Realname); PackAddUniStr(p, "Note", t->Note); - PackAddInt64(p, "CreatedTime", t->CreatedTime); - PackAddInt64(p, "UpdatedTime", t->UpdatedTime); - PackAddInt64(p, "ExpireTime", t->ExpireTime); + PackAddTime64(p, "CreatedTime", t->CreatedTime); + PackAddTime64(p, "UpdatedTime", t->UpdatedTime); + PackAddTime64(p, "ExpireTime", t->ExpireTime); OutRpcAuthData(p, t->AuthData, t->AuthType); PackAddInt(p, "NumLogin", t->NumLogin); OutRpcTraffic(p, &t->Traffic); @@ -12444,6 +13714,7 @@ } PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "UserList"); for (i = 0;i < t->NumUser;i++) { RPC_ENUM_USER_ITEM *e = &t->Users[i]; @@ -12453,7 +13724,7 @@ PackAddUniStrEx(p, "Realname", e->Realname, i, t->NumUser); PackAddUniStrEx(p, "Note", e->Note, i, t->NumUser); PackAddIntEx(p, "AuthType", e->AuthType, i, t->NumUser); - PackAddInt64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumUser); + PackAddTime64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumUser); PackAddIntEx(p, "NumLogin", e->NumLogin, i, t->NumUser); PackAddBoolEx(p, "DenyAccess", e->DenyAccess, i, t->NumUser); @@ -12461,8 +13732,9 @@ OutRpcTrafficEx(&e->Traffic, p, i, t->NumUser); PackAddBoolEx(p, "IsExpiresFilled", e->IsExpiresFilled, i, t->NumUser); - PackAddInt64Ex(p, "Expires", e->Expires, i, t->NumUser); + PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumUser); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumUser(RPC_ENUM_USER *t) { @@ -12559,6 +13831,7 @@ PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "GroupList"); for (i = 0;i < t->NumGroup;i++) { RPC_ENUM_GROUP_ITEM *e = &t->Groups[i]; @@ -12569,6 +13842,7 @@ PackAddIntEx(p, "NumUsers", e->NumUsers, i, t->NumGroup); PackAddBoolEx(p, "DenyAccess", e->DenyAccess, i, t->NumGroup); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumGroup(RPC_ENUM_GROUP *t) { @@ -12628,6 +13902,7 @@ PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i); PackGetStrEx(p, "Username", e->Username, sizeof(e->Username), i); e->Ip = PackGetIntEx(p, "Ip", i); + PackGetIpEx(p, "ClientIP", &e->ClientIP, i); PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i); e->MaxNumTcp = PackGetIntEx(p, "MaxNumTcp", i); e->CurrentNumTcp = PackGetIntEx(p, "CurrentNumTcp", i); @@ -12646,6 +13921,8 @@ e->IsDormantEnabled = PackGetBoolEx(p, "IsDormantEnabled", i); e->IsDormant = PackGetBoolEx(p, "IsDormant", i); e->LastCommDormant = PackGetInt64Ex(p, "LastCommDormant", i); + e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i); + e->LastCommTime = PackGetInt64Ex(p, "LastCommTime", i); } } void OutRpcEnumSession(PACK *p, RPC_ENUM_SESSION *t) @@ -12658,6 +13935,7 @@ } PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "SessionList"); for (i = 0;i < t->NumSession;i++) { RPC_ENUM_SESSION_ITEM *e = &t->Sessions[i]; @@ -12665,6 +13943,7 @@ PackAddStrEx(p, "Name", e->Name, i, t->NumSession); PackAddStrEx(p, "Username", e->Username, i, t->NumSession); PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumSession); + PackAddIpEx(p, "ClientIP", &e->ClientIP, i, t->NumSession); PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumSession); PackAddIntEx(p, "MaxNumTcp", e->MaxNumTcp, i, t->NumSession); PackAddIntEx(p, "CurrentNumTcp", e->CurrentNumTcp, i, t->NumSession); @@ -12682,8 +13961,11 @@ PackAddDataEx(p, "UniqueId", e->UniqueId, sizeof(e->UniqueId), i, t->NumSession); PackAddBoolEx(p, "IsDormantEnabled", e->IsDormantEnabled, i, t->NumSession); PackAddBoolEx(p, "IsDormant", e->IsDormant, i, t->NumSession); - PackAddInt64Ex(p, "LastCommDormant", e->LastCommDormant, i, t->NumSession); + PackAddTime64Ex(p, "LastCommDormant", e->LastCommDormant, i, t->NumSession); + PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumSession); + PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumSession); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumSession(RPC_ENUM_SESSION *t) { @@ -12814,6 +14096,7 @@ t->ClientIp = PackGetIp32(p, "SessionStatus_ClientIp"); PackGetData2(p, "SessionStatus_ClientIp6", t->ClientIp6, sizeof(t->ClientIp6)); PackGetStr(p, "SessionStatus_ClientHostName", t->ClientHostName, sizeof(t->ClientHostName)); + PackGetIp(p, "Client_Ip_Address", &t->ClientIpAddress); InRpcClientGetConnectionStatus(&t->Status, p); InRpcNodeInfo(&t->NodeInfo, p); @@ -12834,6 +14117,7 @@ PackAddIp32(p, "SessionStatus_ClientIp", t->ClientIp); PackAddData(p, "SessionStatus_ClientIp6", t->ClientIp6, sizeof(t->ClientIp6)); PackAddStr(p, "SessionStatus_ClientHostName", t->ClientHostName); + PackAddIp(p, "Client_Ip_Address", &t->ClientIpAddress); OutRpcClientGetConnectionStatus(p, &t->Status); OutRpcNodeInfo(p, &t->NodeInfo); @@ -12914,6 +14198,7 @@ PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "MacTable"); for (i = 0;i < t->NumMacTable;i++) { RPC_ENUM_MAC_TABLE_ITEM *e = &t->MacTables[i]; @@ -12922,11 +14207,12 @@ PackAddStrEx(p, "SessionName", e->SessionName, i, t->NumMacTable); PackAddDataEx(p, "MacAddress", e->MacAddress, sizeof(e->MacAddress), i, t->NumMacTable); PackAddIntEx(p, "VlanId", e->VlanId, i, t->NumMacTable); - PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumMacTable); - PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumMacTable); + PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumMacTable); + PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumMacTable); PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumMacTable); PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumMacTable); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumMacTable(RPC_ENUM_MAC_TABLE *t) { @@ -12965,6 +14251,7 @@ { UINTToIP(&e->IpV6, e->Ip); } + PackGetIp(p, "IpAddress", &e->IpAddress); e->DhcpAllocated = PackGetBoolEx(p, "DhcpAllocated", i); e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i); e->UpdatedTime = PackGetInt64Ex(p, "UpdatedTime", i); @@ -12983,6 +14270,7 @@ PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "IpTable"); for (i = 0;i < t->NumIpTable;i++) { RPC_ENUM_IP_TABLE_ITEM *e = &t->IpTables[i]; @@ -12991,12 +14279,14 @@ PackAddStrEx(p, "SessionName", e->SessionName, i, t->NumIpTable); PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumIpTable); PackAddIpEx(p, "IpV6", &e->IpV6, i, t->NumIpTable); + PackAddIpEx(p, "IpAddress", &e->IpAddress, i, t->NumIpTable); PackAddBoolEx(p, "DhcpAllocated", e->DhcpAllocated, i, t->NumIpTable); - PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumIpTable); - PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumIpTable); + PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumIpTable); + PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumIpTable); PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumIpTable); PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumIpTable); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumIpTable(RPC_ENUM_IP_TABLE *t) { diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Admin.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Admin.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Admin.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Admin.h 2019-07-23 21:37:12.000000000 +0000 @@ -32,6 +32,8 @@ LIST *LogFileList; // Accessible log file list UINT ClientBuild; // Build number of the client RPC_WINVER ClientWinVer; // Windows version of client + UINT MaxJsonRpcRecvSize; // Max JSON-RPC Receive Size + char dummy1[MAX_HUBNAME_LEN + 1]; // hubname buffer (dummy) }; // Test @@ -118,7 +120,8 @@ // Set Password struct RPC_SET_PASSWORD { - UCHAR HashedPassword[SHA1_SIZE]; // Hashed password + UCHAR HashedPassword[SHA1_SIZE]; // Hashed password (for traditional RPC) + char PlainTextPassword[MAX_SIZE]; // Plaintext password (for JSON-RPC) }; // Server farm configuration * @@ -131,6 +134,7 @@ char ControllerName[MAX_HOST_NAME_LEN + 1]; // Controller name UINT ControllerPort; // Controller port UCHAR MemberPassword[SHA1_SIZE]; // Member password + char MemberPasswordPlaintext[MAX_SIZE]; // Member password (plaintext) UINT Weight; // Performance ratio bool ControllerOnly; // Only controller function }; @@ -236,6 +240,7 @@ char HubName[MAX_HUBNAME_LEN + 1]; // HUB Name UCHAR HashedPassword[SHA1_SIZE]; // Administrative password UCHAR SecurePassword[SHA1_SIZE]; // Administrator password + char AdminPasswordPlainText[MAX_SIZE]; // Password (plaintext) bool Online; // Online flag RPC_HUB_OPTION HubOption; // HUB options UINT HubType; // Type of HUB @@ -553,6 +558,7 @@ char RemoteHostname[MAX_HOST_NAME_LEN + 1]; // Remote server name char Username[MAX_USERNAME_LEN + 1]; // User name UINT Ip; // IP address (IPv4) + IP ClientIP; // IP address (IPv4 / IPv6) char Hostname[MAX_HOST_NAME_LEN + 1]; // Host name UINT MaxNumTcp; // Maximum number of TCP connections UINT CurrentNumTcp; // Number of currentl TCP connections @@ -569,6 +575,8 @@ bool IsDormantEnabled; // Is the dormant state enabled bool IsDormant; // Is in the dormant state UINT64 LastCommDormant; // Last comm interval in the dormant state + UINT64 CreatedTime; // Creation date and time + UINT64 LastCommTime; // Last communication date and time }; // Disconnect the session @@ -605,8 +613,9 @@ { UINT Key; // Key char SessionName[MAX_SESSION_NAME_LEN + 1]; // Session name - UINT Ip; // IP address + UINT Ip; // IPv4 address IP IpV6; // IPv6 address + IP IpAddress; // IPv4 / IPv6 Address bool DhcpAllocated; // Assigned by the DHCP UINT64 CreatedTime; // Creation date and time UINT64 UpdatedTime; // Updating date @@ -892,6 +901,10 @@ bool IsConnected; // Whether it's connected }; +// Constants +#define ADMIN_RPC_MAX_POST_SIZE_BY_SERVER_ADMIN MAX_PACK_SIZE +#define ADMIN_RPC_MAX_POST_SIZE_BY_HUB_ADMIN (8 * 1024 * 1024) + // Function prototype UINT AdminAccept(CONNECTION *c, PACK *p); @@ -916,6 +929,26 @@ bool CheckAdminSourceAddress(SOCK *sock, char *hubname); void SiEnumSessionMain(SERVER *s, RPC_ENUM_SESSION *t); bool SiIsEmptyPassword(void *hash_password); +void JsonRpcProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size); +void JsonRpcProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target); +void JsonRpcProcOptions(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target); +JSON_VALUE *JsonRpcProcRequestObject(ADMIN *admin, CONNECTION *c, SOCK *s, JSON_VALUE *json_req, char *method_name); +JSON_VALUE *JsonRpcNewError(int code, wchar_t *message); +JSON_VALUE *JsonRpcNewResponse(PACK *p); +bool HttpParseBasicAuthHeader(HTTP_HEADER *h, char *username, UINT username_size, char *password, UINT password_size); +ADMIN *JsonRpcAuthLogin(CEDAR *c, SOCK *sock, HTTP_HEADER *h); +JSON_VALUE *QueryStringToJsonListValue(char *qs); +JSON_VALUE *ConstructDummyJsonRpcRequest(char *method_name, JSON_VALUE *p); +void AdminWebProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size, char *url_target); +void AdminWebProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target); +bool AdminWebHandleFileRequest(ADMIN *a, CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_src, char *query_string, char *virtual_root_dir, char *physical_root_dir); +BUF *AdminWebProcessServerSideInclude(BUF *src_txt, char *filename, UINT depth); +bool AdminWebSendBody(SOCK *s, UINT status_code, char *status_string, UCHAR *data, UINT data_size, char *content_type, char *add_header_name, char *add_header_value, HTTP_HEADER *request_headers); +bool AdminWebSend404Error(SOCK *s, HTTP_HEADER *request_headers); +bool AdminWebSend302Redirect(SOCK *s, char *url, char *query_string, HTTP_HEADER *request_headers); +BUF *AdminWebTryFindAndReadFile(char *vroot, char *proot, char *url, char *ret_filename, UINT ret_filename_size, bool *is_index_html); +BUF *AdminWebTryOneFile(char *filename, char *ret_filename, UINT ret_filename_size); +bool AdminWebSendUnauthorized(SOCK *s, HTTP_HEADER *http_request_headers); UINT StTest(ADMIN *a, RPC_TEST *t); UINT StGetServerInfo(ADMIN *a, RPC_SERVER_INFO *t); @@ -1291,7 +1324,7 @@ void InRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a, PACK *p); void OutRpcEnumAccessList(PACK *p, RPC_ENUM_ACCESS_LIST *a); void FreeRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a); -void *InRpcAuthData(PACK *p, UINT *authtype); +void *InRpcAuthData(PACK *p, UINT *authtype, char *username); void OutRpcAuthData(PACK *p, void *authdata, UINT authtype); void FreeRpcAuthData(void *authdata, UINT authtype); void InRpcSetUser(RPC_SET_USER *t, PACK *p); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/CedarType.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/CedarType.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/CedarType.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/CedarType.h 2019-07-23 21:37:12.000000000 +0000 @@ -137,6 +137,7 @@ typedef struct SEND_SIGNATURE_PARAM SEND_SIGNATURE_PARAM; typedef struct UPDATE_CLIENT UPDATE_CLIENT; typedef struct UPDATE_CLIENT_SETTING UPDATE_CLIENT_SETTING; +typedef struct HTTP_MIME_TYPE HTTP_MIME_TYPE; // ============================================================== diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Client.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Client.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Client.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Client.c 2019-07-23 21:37:12.000000000 +0000 @@ -3810,14 +3810,16 @@ PackAddNum(p, "NumItem", e->NumItem); + PackSetCurrentJsonGroupName(p, "CAList"); for (i = 0;i < e->NumItem;i++) { RPC_CLIENT_ENUM_CA_ITEM *item = e->Items[i]; PackAddIntEx(p, "Key", item->Key, i, e->NumItem); PackAddUniStrEx(p, "SubjectName", item->SubjectName, i, e->NumItem); PackAddUniStrEx(p, "IssuerName", item->IssuerName, i, e->NumItem); - PackAddInt64Ex(p, "Expires", item->Expires, i, e->NumItem); + PackAddTime64Ex(p, "Expires", item->Expires, i, e->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } // RPC_GET_ISSUER @@ -4088,6 +4090,7 @@ PackAddNum(p, "NumItem", e->NumItem); + PackSetCurrentJsonGroupName(p, "SecureDeviceList"); for (i = 0;i < e->NumItem;i++) { RPC_CLIENT_ENUM_SECURE_ITEM *item = e->Items[i]; @@ -4097,6 +4100,7 @@ PackAddStrEx(p, "DeviceName", item->DeviceName, i, e->NumItem); PackAddStrEx(p, "Manufacturer", item->Manufacturer, i, e->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } // RPC_USE_SECURE @@ -4153,11 +4157,13 @@ PackAddNum(p, "NumItem", e->NumItem); PackAddInt(p, "hWnd", e->hWnd); + PackSetCurrentJsonGroupName(p, "ObjectList"); for (i = 0;i < e->NumItem;i++) { PackAddStrEx(p, "ItemName", e->ItemName[i], i, e->NumItem); PackAddIntEx(p, "ItemType", e->ItemType[i], i, e->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } // RPC_CLIENT_CREATE_VLAN @@ -4277,6 +4283,7 @@ PackAddNum(p, "NumItem", v->NumItem); + PackSetCurrentJsonGroupName(p, "VLanList"); for (i = 0;i < v->NumItem;i++) { RPC_CLIENT_ENUM_VLAN_ITEM *item = v->Items[i]; @@ -4286,6 +4293,7 @@ PackAddStrEx(p, "MacAddress", item->MacAddress, i, v->NumItem); PackAddStrEx(p, "Version", item->Version, i, v->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } // CLIENT_OPTION @@ -4352,10 +4360,10 @@ PackAddInt(p, "NumRetry", c->NumRetry); PackAddInt(p, "RetryInterval", c->RetryInterval); PackAddInt(p, "MaxConnection", c->MaxConnection); - PackAddInt(p, "UseEncrypt", c->UseEncrypt); - PackAddInt(p, "UseCompress", c->UseCompress); - PackAddInt(p, "HalfConnection", c->HalfConnection); - PackAddInt(p, "NoRoutingTracking", c->NoRoutingTracking); + PackAddBool(p, "UseEncrypt", c->UseEncrypt); + PackAddBool(p, "UseCompress", c->UseCompress); + PackAddBool(p, "HalfConnection", c->HalfConnection); + PackAddBool(p, "NoRoutingTracking", c->NoRoutingTracking); PackAddInt(p, "AdditionalConnectionInterval", c->AdditionalConnectionInterval); PackAddInt(p, "ConnectionDisconnectSpan", c->ConnectionDisconnectSpan); PackAddBool(p, "HideStatusWindow", c->HideStatusWindow); @@ -4568,6 +4576,7 @@ PackAddNum(p, "NumItem", e->NumItem); + PackSetCurrentJsonGroupName(p, "AccountList"); for (i = 0;i < e->NumItem;i++) { RPC_CLIENT_ENUM_ACCOUNT_ITEM *item = e->Items[i]; @@ -4583,10 +4592,11 @@ PackAddBoolEx(p, "Connected", item->Connected, i, e->NumItem); PackAddIntEx(p, "Port", item->Port, i, e->NumItem); PackAddStrEx(p, "HubName", item->HubName, i, e->NumItem); - PackAddInt64Ex(p, "CreateDateTime", item->CreateDateTime, i, e->NumItem); - PackAddInt64Ex(p, "UpdateDateTime", item->UpdateDateTime, i, e->NumItem); - PackAddInt64Ex(p, "LastConnectDateTime", item->LastConnectDateTime, i, e->NumItem); + PackAddTime64Ex(p, "CreateDateTime", item->CreateDateTime, i, e->NumItem); + PackAddTime64Ex(p, "UpdateDateTime", item->UpdateDateTime, i, e->NumItem); + PackAddTime64Ex(p, "LastConnectDateTime", item->LastConnectDateTime, i, e->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } // RPC_CLIENT_DELETE_ACCOUNT @@ -4702,9 +4712,9 @@ PackAddData(p, "ShortcutKey", c->ShortcutKey, SHA1_SIZE); - PackAddInt64(p, "CreateDateTime", c->CreateDateTime); - PackAddInt64(p, "UpdateDateTime", c->UpdateDateTime); - PackAddInt64(p, "LastConnectDateTime", c->LastConnectDateTime); + PackAddTime64(p, "CreateDateTime", c->CreateDateTime); + PackAddTime64(p, "UpdateDateTime", c->UpdateDateTime); + PackAddTime64(p, "LastConnectDateTime", c->LastConnectDateTime); } // RPC_CLIENT_CONNECT @@ -4792,7 +4802,8 @@ s->NumTcpConnectionsDownload = PackGetInt(p, "NumTcpConnectionsDownload"); s->StartTime = PackGetInt64(p, "StartTime"); - s->FirstConnectionEstablishedTime = PackGetInt64(p, "FirstConnectionEstablishedTime"); + /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ + s->FirstConnectionEstablisiedTime = PackGetInt64(p, "FirstConnectionEstablisiedTime"); s->CurrentConnectionEstablishTime = PackGetInt64(p, "CurrentConnectionEstablishTime"); s->TotalSendSize = PackGetInt64(p, "TotalSendSize"); s->TotalRecvSize = PackGetInt64(p, "TotalRecvSize"); @@ -4852,32 +4863,32 @@ PackAddData(p, "SessionKey", c->SessionKey, SHA1_SIZE); - PackAddInt(p, "Active", c->Active); - PackAddInt(p, "Connected", c->Connected); + PackAddBool(p, "Active", c->Active); + PackAddBool(p, "Connected", c->Connected); PackAddInt(p, "SessionStatus", c->SessionStatus); PackAddInt(p, "ServerPort", c->ServerPort); PackAddInt(p, "ServerProductVer", c->ServerProductVer); PackAddInt(p, "ServerProductBuild", c->ServerProductBuild); PackAddInt(p, "NumConnectionsEstablished", c->NumConnectionsEstablished); - PackAddInt(p, "HalfConnection", c->HalfConnection); - PackAddInt(p, "QoS", c->QoS); + PackAddBool(p, "HalfConnection", c->HalfConnection); + PackAddBool(p, "QoS", c->QoS); PackAddInt(p, "MaxTcpConnections", c->MaxTcpConnections); PackAddInt(p, "NumTcpConnections", c->NumTcpConnections); PackAddInt(p, "NumTcpConnectionsUpload", c->NumTcpConnectionsUpload); PackAddInt(p, "NumTcpConnectionsDownload", c->NumTcpConnectionsDownload); - PackAddInt(p, "UseEncrypt", c->UseEncrypt); - PackAddInt(p, "UseCompress", c->UseCompress); - PackAddInt(p, "IsRUDPSession", c->IsRUDPSession); + PackAddBool(p, "UseEncrypt", c->UseEncrypt); + PackAddBool(p, "UseCompress", c->UseCompress); + PackAddBool(p, "IsRUDPSession", c->IsRUDPSession); PackAddStr(p, "UnderlayProtocol", c->UnderlayProtocol); - PackAddInt(p, "IsUdpAccelerationEnabled", c->IsUdpAccelerationEnabled); - PackAddInt(p, "IsUsingUdpAcceleration", c->IsUsingUdpAcceleration); + PackAddBool(p, "IsUdpAccelerationEnabled", c->IsUdpAccelerationEnabled); + PackAddBool(p, "IsUsingUdpAcceleration", c->IsUsingUdpAcceleration); PackAddBool(p, "IsBridgeMode", c->IsBridgeMode); PackAddBool(p, "IsMonitorMode", c->IsMonitorMode); - PackAddInt64(p, "StartTime", c->StartTime); - PackAddInt64(p, "FirstConnectionEstablishedTime", c->FirstConnectionEstablishedTime); - PackAddInt64(p, "CurrentConnectionEstablishTime", c->CurrentConnectionEstablishTime); + PackAddTime64(p, "StartTime", c->StartTime); + PackAddTime64(p, "FirstConnectionEstablisiedTime", c->FirstConnectionEstablisiedTime); + PackAddTime64(p, "CurrentConnectionEstablishTime", c->CurrentConnectionEstablishTime); PackAddInt64(p, "TotalSendSize", c->TotalSendSize); PackAddInt64(p, "TotalRecvSize", c->TotalRecvSize); PackAddInt64(p, "TotalSendSizeReal", c->TotalSendSizeReal); @@ -5852,7 +5863,8 @@ // Connection start time st->StartTime = TickToTime(s->CreatedTime); // Connection completion time of the first connection - st->FirstConnectionEstablishedTime = TickToTime(s->FirstConnectionEstablishedTime); + /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ + st->FirstConnectionEstablisiedTime = TickToTime(s->FirstConnectionEstablisiedTime); // Number of connections have been established so far st->NumConnectionsEstablished = s->NumConnectionsEstablished; } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Client.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Client.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Client.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Client.h 2019-07-23 21:37:12.000000000 +0000 @@ -325,7 +325,8 @@ X *ServerX; // Server certificate X *ClientX; // Client certificate UINT64 StartTime; // Connection start time - UINT64 FirstConnectionEstablishedTime; // Connection completion time of the first connection + /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ + UINT64 FirstConnectionEstablisiedTime; // Connection completion time of the first connection UINT64 CurrentConnectionEstablishTime; // Connection completion time of this connection UINT NumConnectionsEstablished; // Number of connections have been established so far bool HalfConnection; // Half-connection diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/CM.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/CM.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/CM.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/CM.c 2019-07-23 21:37:12.000000000 +0000 @@ -9578,8 +9578,9 @@ GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->StartTime), NULL); LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_START_TIME"), tmp); - GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablishedTime), NULL); - LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablishedTime == 0 ? _UU("CM_ST_NONE") : tmp); + GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablisiedTime), NULL); + /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ + LvInsertAdd(b, 0, NULL, 2, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablisiedTime == 0 ? _UU("CM_ST_NONE") : tmp); if (s->Connected) { diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Command.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Command.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Command.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Command.c 2019-07-23 21:37:12.000000000 +0000 @@ -15077,8 +15077,10 @@ GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->StartTime), NULL); CtInsert(ct, _UU("CM_ST_START_TIME"), tmp); - GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablishedTime), NULL); - CtInsert(ct, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablishedTime == 0 ? _UU("CM_ST_NONE") : tmp); + /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ + GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablisiedTime), NULL); + /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ + CtInsert(ct, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablisiedTime == 0 ? _UU("CM_ST_NONE") : tmp); if (s->Connected) { diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Connection.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Connection.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Connection.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Connection.h 2019-07-23 21:37:12.000000000 +0000 @@ -216,6 +216,9 @@ UINT LastPacketQueueSize; // The last queue size of packets UINT LastRecvFifoTotalSize; // The last RecvFifo total size UINT LastRecvBlocksNum; // The last ReceivedBlocks num + bool IsJsonRpc; // Is JSON-RPC + bool JsonRpcAuthed; // JSON-RPC Authed + LISTENER *Listener; // Listener ref }; diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/DDNS.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/DDNS.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/DDNS.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/DDNS.c 2019-07-23 21:37:12.000000000 +0000 @@ -37,6 +37,9 @@ Copy(&st->InternetSetting, &c->InternetSetting, sizeof(INTERNET_SETTING)); } Unlock(c->Lock); + + UniStrCpy(st->ErrStr_IPv4, sizeof(st->ErrStr_IPv4), _E(st->Err_IPv4)); + UniStrCpy(st->ErrStr_IPv6, sizeof(st->ErrStr_IPv6), _E(st->Err_IPv6)); } // Set the Internet settings diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/DDNS.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/DDNS.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/DDNS.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/DDNS.h 2019-07-23 21:37:12.000000000 +0000 @@ -111,6 +111,8 @@ struct DDNS_CLIENT_STATUS { UINT Err_IPv4, Err_IPv6; // Last error + wchar_t ErrStr_IPv4[MAX_SIZE]; + wchar_t ErrStr_IPv6[MAX_SIZE]; char CurrentHostName[DDNS_MAX_HOSTNAME + 1]; // Current host name char CurrentFqdn[MAX_SIZE]; // Current FQDN char DnsSuffix[MAX_SIZE]; // DNS suffix diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/EtherLog.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/EtherLog.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/EtherLog.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/EtherLog.c 2019-07-23 21:37:12.000000000 +0000 @@ -558,6 +558,7 @@ PackAddInt(p, "NumItem", t->NumItem); + PackSetCurrentJsonGroupName(p, "DeviceList"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_DEVICE_ITEM *d = &t->Items[i]; @@ -565,6 +566,7 @@ PackAddStrEx(p, "DeviceName", d->DeviceName, i, t->NumItem); PackAddBoolEx(p, "Active", d->Active, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); PackAddBool(p, "IsLicenseSupported", t->IsLicenseSupported); } @@ -605,7 +607,7 @@ PackAddBool(p, "Valid", t->Valid); PackAddInt64(p, "SystemId", t->SystemId); - PackAddInt64(p, "SystemExpires", t->SystemExpires); + PackAddTime64(p, "SystemExpires", t->SystemExpires); } // Listener thread diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Hub.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Hub.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Hub.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Hub.c 2019-07-23 21:37:12.000000000 +0000 @@ -681,6 +681,8 @@ { ADMIN_OPTION *a = LIST_DATA(aol, i); + UniStrCpy(a->Descrption, sizeof(a->Descrption), GetHubAdminOptionHelpString(a->Name)); + Copy(&ao->Items[i], a, sizeof(ADMIN_OPTION)); Free(a); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Hub.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Hub.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Hub.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Hub.h 2019-07-23 21:37:12.000000000 +0000 @@ -287,6 +287,7 @@ { char Name[MAX_ADMIN_OPTION_NAME_LEN + 1]; // Name UINT Value; // Data + wchar_t Descrption[MAX_SIZE]; // Descrption }; // Certificate Revocation List entry diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Listener.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Listener.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Listener.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Listener.c 2019-07-23 21:37:12.000000000 +0000 @@ -150,6 +150,9 @@ // Create a connection c = NewServerConnection(r->Cedar, s, t); + AddRef(r->ref); + c->Listener = r; + // Register to Cedar as a transient connection AddConnection(c->Cedar, c); @@ -169,6 +172,8 @@ // Release SLog(r->Cedar, "LS_CONNECTION_END_1", c->Name); + ReleaseListener(c->Listener); + c->Listener = NULL; ReleaseConnection(c); // Release diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Nat.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Nat.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Nat.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Nat.c 2019-07-23 21:37:12.000000000 +0000 @@ -797,18 +797,20 @@ PackAddInt(p, "NumItem", t->NumItem); PackAddStr(p, "HubName", t->HubName); + PackSetCurrentJsonGroupName(p, "DhcpTable"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_DHCP_ITEM *e = &t->Items[i]; PackAddIntEx(p, "Id", e->Id, i, t->NumItem); - PackAddInt64Ex(p, "LeasedTime", e->LeasedTime, i, t->NumItem); - PackAddInt64Ex(p, "ExpireTime", e->ExpireTime, i, t->NumItem); + PackAddTime64Ex(p, "LeasedTime", e->LeasedTime, i, t->NumItem); + PackAddTime64Ex(p, "ExpireTime", e->ExpireTime, i, t->NumItem); PackAddDataEx(p, "MacAddress", e->MacAddress, 6, i, t->NumItem); PackAddIp32Ex(p, "IpAddress", e->IpAddress, i, t->NumItem); PackAddIntEx(p, "Mask", e->Mask, i, t->NumItem); PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumDhcp(RPC_ENUM_DHCP *t) { @@ -865,6 +867,8 @@ PackAddInt(p, "NumItem", t->NumItem); PackAddStr(p, "HubName", t->HubName); + + PackSetCurrentJsonGroupName(p, "NatTable"); for (i = 0;i < t->NumItem;i++) { RPC_ENUM_NAT_ITEM *e = &t->Items[i]; @@ -877,12 +881,13 @@ PackAddIp32Ex(p, "DestIp", e->DestIp, i, t->NumItem); PackAddStrEx(p, "DestHost", e->DestHost, i, t->NumItem); PackAddIntEx(p, "DestPort", e->DestPort, i, t->NumItem); - PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumItem); - PackAddInt64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumItem); + PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumItem); + PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumItem); PackAddInt64Ex(p, "SendSize", e->SendSize, i, t->NumItem); PackAddInt64Ex(p, "RecvSize", e->RecvSize, i, t->NumItem); PackAddIntEx(p, "TcpStatus", e->TcpStatus, i, t->NumItem); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcEnumNat(RPC_ENUM_NAT *t) { diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Protocol.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Protocol.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Protocol.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Protocol.c 2019-07-23 21:37:12.000000000 +0000 @@ -9,6 +9,726 @@ static UCHAR ssl_packet_start[3] = {0x17, 0x03, 0x00}; +// MIME list from https://www.freeformatter.com/mime-types-list.html +static HTTP_MIME_TYPE http_mime_types[] = +{ + {".x3d", "application/vnd.hzn-3d-crossword"}, + {".3gp", "video/3gpp"}, + {".3g2", "video/3gpp2"}, + {".mseq", "application/vnd.mseq"}, + {".pwn", "application/vnd.3m.post-it-notes"}, + {".plb", "application/vnd.3gpp.pic-bw-large"}, + {".psb", "application/vnd.3gpp.pic-bw-small"}, + {".pvb", "application/vnd.3gpp.pic-bw-var"}, + {".tcap", "application/vnd.3gpp2.tcap"}, + {".7z", "application/x-7z-compressed"}, + {".abw", "application/x-abiword"}, + {".ace", "application/x-ace-compressed"}, + {".acc", "application/vnd.americandynamics.acc"}, + {".acu", "application/vnd.acucobol"}, + {".atc", "application/vnd.acucorp"}, + {".adp", "audio/adpcm"}, + {".aab", "application/x-authorware-bin"}, + {".aam", "application/x-authorware-map"}, + {".aas", "application/x-authorware-seg"}, + {".air", "application/vnd.adobe.air-application-installer-package+zip"}, + {".swf", "application/x-shockwave-flash"}, + {".fxp", "application/vnd.adobe.fxp"}, + {".pdf", "application/pdf"}, + {".ppd", "application/vnd.cups-ppd"}, + {".dir", "application/x-director"}, + {".xdp", "application/vnd.adobe.xdp+xml"}, + {".xfdf", "application/vnd.adobe.xfdf"}, + {".aac", "audio/x-aac"}, + {".ahead", "application/vnd.ahead.space"}, + {".azf", "application/vnd.airzip.filesecure.azf"}, + {".azs", "application/vnd.airzip.filesecure.azs"}, + {".azw", "application/vnd.amazon.ebook"}, + {".ami", "application/vnd.amiga.ami"}, + {".apk", "application/vnd.android.package-archive"}, + {".cii", "application/vnd.anser-web-certificate-issue-initiation"}, + {".fti", "application/vnd.anser-web-funds-transfer-initiation"}, + {".atx", "application/vnd.antix.game-component"}, + {".dmg", "application/x-apple-diskimage"}, + {".mpkg", "application/vnd.apple.installer+xml"}, + {".aw", "application/applixware"}, + {".les", "application/vnd.hhe.lesson-player"}, + {".swi", "application/vnd.aristanetworks.swi"}, + {".s", "text/x-asm"}, + {".atomcat", "application/atomcat+xml"}, + {".atomsvc", "application/atomsvc+xml"}, + {".atom", "application/atom+xml"}, + {".ac", "application/pkix-attr-cert"}, + {".aif", "audio/x-aiff"}, + {".avi", "video/x-msvideo"}, + {".aep", "application/vnd.audiograph"}, + {".dxf", "image/vnd.dxf"}, + {".dwf", "model/vnd.dwf"}, + {".par", "text/plain-bas"}, + {".bcpio", "application/x-bcpio"}, + {".bin", "application/octet-stream"}, + {".bmp", "image/bmp"}, + {".torrent", "application/x-bittorrent"}, + {".cod", "application/vnd.rim.cod"}, + {".mpm", "application/vnd.blueice.multipass"}, + {".bmi", "application/vnd.bmi"}, + {".sh", "application/x-sh"}, + {".btif", "image/prs.btif"}, + {".rep", "application/vnd.businessobjects"}, + {".bz", "application/x-bzip"}, + {".bz2", "application/x-bzip2"}, + {".csh", "application/x-csh"}, + {".c", "text/x-c"}, + {".cdxml", "application/vnd.chemdraw+xml"}, + {".css", "text/css"}, + {".cdx", "chemical/x-cdx"}, + {".cml", "chemical/x-cml"}, + {".csml", "chemical/x-csml"}, + {".cdbcmsg", "application/vnd.contact.cmsg"}, + {".cla", "application/vnd.claymore"}, + {".c4g", "application/vnd.clonk.c4group"}, + {".sub", "image/vnd.dvb.subtitle"}, + {".cdmia", "application/cdmi-capability"}, + {".cdmic", "application/cdmi-container"}, + {".cdmid", "application/cdmi-domain"}, + {".cdmio", "application/cdmi-object"}, + {".cdmiq", "application/cdmi-queue"}, + {".c11amc", "application/vnd.cluetrust.cartomobile-config"}, + {".c11amz", "application/vnd.cluetrust.cartomobile-config-pkg"}, + {".ras", "image/x-cmu-raster"}, + {".dae", "model/vnd.collada+xml"}, + {".csv", "text/csv"}, + {".cpt", "application/mac-compactpro"}, + {".wmlc", "application/vnd.wap.wmlc"}, + {".cgm", "image/cgm"}, + {".ice", "x-conference/x-cooltalk"}, + {".cmx", "image/x-cmx"}, + {".xar", "application/vnd.xara"}, + {".cmc", "application/vnd.cosmocaller"}, + {".cpio", "application/x-cpio"}, + {".clkx", "application/vnd.crick.clicker"}, + {".clkk", "application/vnd.crick.clicker.keyboard"}, + {".clkp", "application/vnd.crick.clicker.palette"}, + {".clkt", "application/vnd.crick.clicker.template"}, + {".clkw", "application/vnd.crick.clicker.wordbank"}, + {".wbs", "application/vnd.criticaltools.wbs+xml"}, + {".cryptonote", "application/vnd.rig.cryptonote"}, + {".cif", "chemical/x-cif"}, + {".cmdf", "chemical/x-cmdf"}, + {".cu", "application/cu-seeme"}, + {".cww", "application/prs.cww"}, + {".curl", "text/vnd.curl"}, + {".dcurl", "text/vnd.curl.dcurl"}, + {".mcurl", "text/vnd.curl.mcurl"}, + {".scurl", "text/vnd.curl.scurl"}, + {".car", "application/vnd.curl.car"}, + {".pcurl", "application/vnd.curl.pcurl"}, + {".cmp", "application/vnd.yellowriver-custom-menu"}, + {".dssc", "application/dssc+der"}, + {".xdssc", "application/dssc+xml"}, + {".deb", "application/x-debian-package"}, + {".uva", "audio/vnd.dece.audio"}, + {".uvi", "image/vnd.dece.graphic"}, + {".uvh", "video/vnd.dece.hd"}, + {".uvm", "video/vnd.dece.mobile"}, + {".uvu", "video/vnd.uvvu.mp4"}, + {".uvp", "video/vnd.dece.pd"}, + {".uvs", "video/vnd.dece.sd"}, + {".uvv", "video/vnd.dece.video"}, + {".dvi", "application/x-dvi"}, + {".seed", "application/vnd.fdsn.seed"}, + {".dtb", "application/x-dtbook+xml"}, + {".res", "application/x-dtbresource+xml"}, + {".ait", "application/vnd.dvb.ait"}, + {".svc", "application/vnd.dvb.service"}, + {".eol", "audio/vnd.digital-winds"}, + {".djvu", "image/vnd.djvu"}, + {".dtd", "application/xml-dtd"}, + {".mlp", "application/vnd.dolby.mlp"}, + {".wad", "application/x-doom"}, + {".dpg", "application/vnd.dpgraph"}, + {".dra", "audio/vnd.dra"}, + {".dfac", "application/vnd.dreamfactory"}, + {".dts", "audio/vnd.dts"}, + {".dtshd", "audio/vnd.dts.hd"}, + {".dwg", "image/vnd.dwg"}, + {".geo", "application/vnd.dynageo"}, + {".es", "application/ecmascript"}, + {".mag", "application/vnd.ecowin.chart"}, + {".mmr", "image/vnd.fujixerox.edmics-mmr"}, + {".rlc", "image/vnd.fujixerox.edmics-rlc"}, + {".exi", "application/exi"}, + {".mgz", "application/vnd.proteus.magazine"}, + {".epub", "application/epub+zip"}, + {".eml", "message/rfc822"}, + {".nml", "application/vnd.enliven"}, + {".xpr", "application/vnd.is-xpr"}, + {".xif", "image/vnd.xiff"}, + {".xfdl", "application/vnd.xfdl"}, + {".emma", "application/emma+xml"}, + {".ez2", "application/vnd.ezpix-album"}, + {".ez3", "application/vnd.ezpix-package"}, + {".fst", "image/vnd.fst"}, + {".fvt", "video/vnd.fvt"}, + {".fbs", "image/vnd.fastbidsheet"}, + {".fe_launch", "application/vnd.denovo.fcselayout-link"}, + {".f4v", "video/x-f4v"}, + {".flv", "video/x-flv"}, + {".fpx", "image/vnd.fpx"}, + {".npx", "image/vnd.net-fpx"}, + {".flx", "text/vnd.fmi.flexstor"}, + {".fli", "video/x-fli"}, + {".ftc", "application/vnd.fluxtime.clip"}, + {".fdf", "application/vnd.fdf"}, + {".f", "text/x-fortran"}, + {".mif", "application/vnd.mif"}, + {".fm", "application/vnd.framemaker"}, + {".fh", "image/x-freehand"}, + {".fsc", "application/vnd.fsc.weblaunch"}, + {".fnc", "application/vnd.frogans.fnc"}, + {".ltf", "application/vnd.frogans.ltf"}, + {".ddd", "application/vnd.fujixerox.ddd"}, + {".xdw", "application/vnd.fujixerox.docuworks"}, + {".xbd", "application/vnd.fujixerox.docuworks.binder"}, + {".oas", "application/vnd.fujitsu.oasys"}, + {".oa2", "application/vnd.fujitsu.oasys2"}, + {".oa3", "application/vnd.fujitsu.oasys3"}, + {".fg5", "application/vnd.fujitsu.oasysgp"}, + {".bh2", "application/vnd.fujitsu.oasysprs"}, + {".spl", "application/x-futuresplash"}, + {".fzs", "application/vnd.fuzzysheet"}, + {".g3", "image/g3fax"}, + {".gmx", "application/vnd.gmx"}, + {".gtw", "model/vnd.gtw"}, + {".txd", "application/vnd.genomatix.tuxedo"}, + {".ggb", "application/vnd.geogebra.file"}, + {".ggt", "application/vnd.geogebra.tool"}, + {".gdl", "model/vnd.gdl"}, + {".gex", "application/vnd.geometry-explorer"}, + {".gxt", "application/vnd.geonext"}, + {".g2w", "application/vnd.geoplan"}, + {".g3w", "application/vnd.geospace"}, + {".gsf", "application/x-font-ghostscript"}, + {".bdf", "application/x-font-bdf"}, + {".gtar", "application/x-gtar"}, + {".texinfo", "application/x-texinfo"}, + {".gnumeric", "application/x-gnumeric"}, + {".kml", "application/vnd.google-earth.kml+xml"}, + {".kmz", "application/vnd.google-earth.kmz"}, + {".gqf", "application/vnd.grafeq"}, + {".gif", "image/gif"}, + {".gv", "text/vnd.graphviz"}, + {".gac", "application/vnd.groove-account"}, + {".ghf", "application/vnd.groove-help"}, + {".gim", "application/vnd.groove-identity-message"}, + {".grv", "application/vnd.groove-injector"}, + {".gtm", "application/vnd.groove-tool-message"}, + {".tpl", "application/vnd.groove-tool-template"}, + {".vcg", "application/vnd.groove-vcard"}, + {".h261", "video/h261"}, + {".h263", "video/h263"}, + {".h264", "video/h264"}, + {".hpid", "application/vnd.hp-hpid"}, + {".hps", "application/vnd.hp-hps"}, + {".hdf", "application/x-hdf"}, + {".rip", "audio/vnd.rip"}, + {".hbci", "application/vnd.hbci"}, + {".jlt", "application/vnd.hp-jlyt"}, + {".pcl", "application/vnd.hp-pcl"}, + {".hpgl", "application/vnd.hp-hpgl"}, + {".hvs", "application/vnd.yamaha.hv-script"}, + {".hvd", "application/vnd.yamaha.hv-dic"}, + {".hvp", "application/vnd.yamaha.hv-voice"}, + {".sfd-hdstx", "application/vnd.hydrostatix.sof-data"}, + {".stk", "application/hyperstudio"}, + {".hal", "application/vnd.hal+xml"}, + {".htm", "text/html; charset=utf-8"}, + {".html", "text/html; charset=utf-8"}, + {".irm", "application/vnd.ibm.rights-management"}, + {".sc", "application/vnd.ibm.secure-container"}, + {".ics", "text/calendar"}, + {".icc", "application/vnd.iccprofile"}, + {".ico", "image/x-icon"}, + {".igl", "application/vnd.igloader"}, + {".ief", "image/ief"}, + {".ivp", "application/vnd.immervision-ivp"}, + {".ivu", "application/vnd.immervision-ivu"}, + {".rif", "application/reginfo+xml"}, + {".3dml", "text/vnd.in3d.3dml"}, + {".spot", "text/vnd.in3d.spot"}, + {".igs", "model/iges"}, + {".i2g", "application/vnd.intergeo"}, + {".cdy", "application/vnd.cinderella"}, + {".xpw", "application/vnd.intercon.formnet"}, + {".fcs", "application/vnd.isac.fcs"}, + {".ipfix", "application/ipfix"}, + {".cer", "application/pkix-cert"}, + {".pki", "application/pkixcmp"}, + {".crl", "application/pkix-crl"}, + {".pkipath", "application/pkix-pkipath"}, + {".igm", "application/vnd.insors.igm"}, + {".rcprofile", "application/vnd.ipunplugged.rcprofile"}, + {".irp", "application/vnd.irepository.package+xml"}, + {".jad", "text/vnd.sun.j2me.app-descriptor"}, + {".jar", "application/java-archive"}, + {".class", "application/java-vm"}, + {".jnlp", "application/x-java-jnlp-file"}, + {".ser", "application/java-serialized-object"}, + {".java", "text/x-java-source"}, + {".js", "application/javascript"}, + {".json", "application/json"}, + {".joda", "application/vnd.joost.joda-archive"}, + {".jpm", "video/jpm"}, + {".jpg", "image/jpeg"}, + {".jpeg", "image/jpeg"}, + {".pjpeg", "image/pjpeg"}, + {".jpgv", "video/jpeg"}, + {".ktz", "application/vnd.kahootz"}, + {".mmd", "application/vnd.chipnuts.karaoke-mmd"}, + {".karbon", "application/vnd.kde.karbon"}, + {".chrt", "application/vnd.kde.kchart"}, + {".kfo", "application/vnd.kde.kformula"}, + {".flw", "application/vnd.kde.kivio"}, + {".kon", "application/vnd.kde.kontour"}, + {".kpr", "application/vnd.kde.kpresenter"}, + {".ksp", "application/vnd.kde.kspread"}, + {".kwd", "application/vnd.kde.kword"}, + {".htke", "application/vnd.kenameaapp"}, + {".kia", "application/vnd.kidspiration"}, + {".kne", "application/vnd.kinar"}, + {".sse", "application/vnd.kodak-descriptor"}, + {".lasxml", "application/vnd.las.las+xml"}, + {".latex", "application/x-latex"}, + {".lbd", "application/vnd.llamagraphics.life-balance.desktop"}, + {".lbe", "application/vnd.llamagraphics.life-balance.exchange+xml"}, + {".jam", "application/vnd.jam"}, + {"0.123", "application/vnd.lotus-1-2-3"}, + {".apr", "application/vnd.lotus-approach"}, + {".pre", "application/vnd.lotus-freelance"}, + {".nsf", "application/vnd.lotus-notes"}, + {".org", "application/vnd.lotus-organizer"}, + {".scm", "application/vnd.lotus-screencam"}, + {".lwp", "application/vnd.lotus-wordpro"}, + {".lvp", "audio/vnd.lucent.voice"}, + {".m3u", "audio/x-mpegurl"}, + {".m4v", "video/x-m4v"}, + {".hqx", "application/mac-binhex40"}, + {".portpkg", "application/vnd.macports.portpkg"}, + {".mgp", "application/vnd.osgeo.mapguide.package"}, + {".mrc", "application/marc"}, + {".mrcx", "application/marcxml+xml"}, + {".mxf", "application/mxf"}, + {".nbp", "application/vnd.wolfram.player"}, + {".ma", "application/mathematica"}, + {".mathml", "application/mathml+xml"}, + {".mbox", "application/mbox"}, + {".mc1", "application/vnd.medcalcdata"}, + {".mscml", "application/mediaservercontrol+xml"}, + {".cdkey", "application/vnd.mediastation.cdkey"}, + {".mwf", "application/vnd.mfer"}, + {".mfm", "application/vnd.mfmp"}, + {".msh", "model/mesh"}, + {".mads", "application/mads+xml"}, + {".mets", "application/mets+xml"}, + {".mods", "application/mods+xml"}, + {".meta4", "application/metalink4+xml"}, + {".mcd", "application/vnd.mcd"}, + {".flo", "application/vnd.micrografx.flo"}, + {".igx", "application/vnd.micrografx.igx"}, + {".es3", "application/vnd.eszigno3+xml"}, + {".mdb", "application/x-msaccess"}, + {".asf", "video/x-ms-asf"}, + {".exe", "application/x-msdownload"}, + {".cil", "application/vnd.ms-artgalry"}, + {".cab", "application/vnd.ms-cab-compressed"}, + {".ims", "application/vnd.ms-ims"}, + {".application", "application/x-ms-application"}, + {".clp", "application/x-msclip"}, + {".mdi", "image/vnd.ms-modi"}, + {".eot", "application/vnd.ms-fontobject"}, + {".xls", "application/vnd.ms-excel"}, + {".xlam", "application/vnd.ms-excel.addin.macroenabled.12"}, + {".xlsb", "application/vnd.ms-excel.sheet.binary.macroenabled.12"}, + {".xltm", "application/vnd.ms-excel.template.macroenabled.12"}, + {".xlsm", "application/vnd.ms-excel.sheet.macroenabled.12"}, + {".chm", "application/vnd.ms-htmlhelp"}, + {".crd", "application/x-mscardfile"}, + {".lrm", "application/vnd.ms-lrm"}, + {".mvb", "application/x-msmediaview"}, + {".mny", "application/x-msmoney"}, + {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, + {".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"}, + {".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"}, + {".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"}, + {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, + {".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"}, + {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, + {".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"}, + {".obd", "application/x-msbinder"}, + {".thmx", "application/vnd.ms-officetheme"}, + {".onetoc", "application/onenote"}, + {".pya", "audio/vnd.ms-playready.media.pya"}, + {".pyv", "video/vnd.ms-playready.media.pyv"}, + {".ppt", "application/vnd.ms-powerpoint"}, + {".ppam", "application/vnd.ms-powerpoint.addin.macroenabled.12"}, + {".sldm", "application/vnd.ms-powerpoint.slide.macroenabled.12"}, + {".pptm", "application/vnd.ms-powerpoint.presentation.macroenabled.12"}, + {".ppsm", "application/vnd.ms-powerpoint.slideshow.macroenabled.12"}, + {".potm", "application/vnd.ms-powerpoint.template.macroenabled.12"}, + {".mpp", "application/vnd.ms-project"}, + {".pub", "application/x-mspublisher"}, + {".scd", "application/x-msschedule"}, + {".xap", "application/x-silverlight-app"}, + {".stl", "application/vnd.ms-pki.stl"}, + {".cat", "application/vnd.ms-pki.seccat"}, + {".vsd", "application/vnd.visio"}, + {".vsdx", "application/vnd.visio2013"}, + {".wm", "video/x-ms-wm"}, + {".wma", "audio/x-ms-wma"}, + {".wax", "audio/x-ms-wax"}, + {".wmx", "video/x-ms-wmx"}, + {".wmd", "application/x-ms-wmd"}, + {".wpl", "application/vnd.ms-wpl"}, + {".wmz", "application/x-ms-wmz"}, + {".wmv", "video/x-ms-wmv"}, + {".wvx", "video/x-ms-wvx"}, + {".wmf", "application/x-msmetafile"}, + {".trm", "application/x-msterminal"}, + {".doc", "application/msword"}, + {".docm", "application/vnd.ms-word.document.macroenabled.12"}, + {".dotm", "application/vnd.ms-word.template.macroenabled.12"}, + {".wri", "application/x-mswrite"}, + {".wps", "application/vnd.ms-works"}, + {".xbap", "application/x-ms-xbap"}, + {".xps", "application/vnd.ms-xpsdocument"}, + {".mid", "audio/midi"}, + {".mpy", "application/vnd.ibm.minipay"}, + {".afp", "application/vnd.ibm.modcap"}, + {".rms", "application/vnd.jcp.javame.midlet-rms"}, + {".tmo", "application/vnd.tmobile-livetv"}, + {".prc", "application/x-mobipocket-ebook"}, + {".mbk", "application/vnd.mobius.mbk"}, + {".dis", "application/vnd.mobius.dis"}, + {".plc", "application/vnd.mobius.plc"}, + {".mqy", "application/vnd.mobius.mqy"}, + {".msl", "application/vnd.mobius.msl"}, + {".txf", "application/vnd.mobius.txf"}, + {".daf", "application/vnd.mobius.daf"}, + {".fly", "text/vnd.fly"}, + {".mpc", "application/vnd.mophun.certificate"}, + {".mpn", "application/vnd.mophun.application"}, + {".mj2", "video/mj2"}, + {".mpga", "audio/mpeg"}, + {".mxu", "video/vnd.mpegurl"}, + {".mpeg", "video/mpeg"}, + {".m21", "application/mp21"}, + {".mp4a", "audio/mp4"}, + {".mp4", "video/mp4"}, + {".mp4", "application/mp4"}, + {".m3u8", "application/vnd.apple.mpegurl"}, + {".mus", "application/vnd.musician"}, + {".msty", "application/vnd.muvee.style"}, + {".mxml", "application/xv+xml"}, + {".ngdat", "application/vnd.nokia.n-gage.data"}, + {".n-gage", "application/vnd.nokia.n-gage.symbian.install"}, + {".ncx", "application/x-dtbncx+xml"}, + {".nc", "application/x-netcdf"}, + {".nlu", "application/vnd.neurolanguage.nlu"}, + {".dna", "application/vnd.dna"}, + {".nnd", "application/vnd.noblenet-directory"}, + {".nns", "application/vnd.noblenet-sealer"}, + {".nnw", "application/vnd.noblenet-web"}, + {".rpst", "application/vnd.nokia.radio-preset"}, + {".rpss", "application/vnd.nokia.radio-presets"}, + {".n3", "text/n3"}, + {".edm", "application/vnd.novadigm.edm"}, + {".edx", "application/vnd.novadigm.edx"}, + {".ext", "application/vnd.novadigm.ext"}, + {".gph", "application/vnd.flographit"}, + {".ecelp4800", "audio/vnd.nuera.ecelp4800"}, + {".ecelp7470", "audio/vnd.nuera.ecelp7470"}, + {".ecelp9600", "audio/vnd.nuera.ecelp9600"}, + {".oda", "application/oda"}, + {".ogx", "application/ogg"}, + {".oga", "audio/ogg"}, + {".ogv", "video/ogg"}, + {".dd2", "application/vnd.oma.dd2+xml"}, + {".oth", "application/vnd.oasis.opendocument.text-web"}, + {".opf", "application/oebps-package+xml"}, + {".qbo", "application/vnd.intu.qbo"}, + {".oxt", "application/vnd.openofficeorg.extension"}, + {".osf", "application/vnd.yamaha.openscoreformat"}, + {".weba", "audio/webm"}, + {".webm", "video/webm"}, + {".odc", "application/vnd.oasis.opendocument.chart"}, + {".otc", "application/vnd.oasis.opendocument.chart-template"}, + {".odb", "application/vnd.oasis.opendocument.database"}, + {".odf", "application/vnd.oasis.opendocument.formula"}, + {".odft", "application/vnd.oasis.opendocument.formula-template"}, + {".odg", "application/vnd.oasis.opendocument.graphics"}, + {".otg", "application/vnd.oasis.opendocument.graphics-template"}, + {".odi", "application/vnd.oasis.opendocument.image"}, + {".oti", "application/vnd.oasis.opendocument.image-template"}, + {".odp", "application/vnd.oasis.opendocument.presentation"}, + {".otp", "application/vnd.oasis.opendocument.presentation-template"}, + {".ods", "application/vnd.oasis.opendocument.spreadsheet"}, + {".ots", "application/vnd.oasis.opendocument.spreadsheet-template"}, + {".odt", "application/vnd.oasis.opendocument.text"}, + {".odm", "application/vnd.oasis.opendocument.text-master"}, + {".ott", "application/vnd.oasis.opendocument.text-template"}, + {".ktx", "image/ktx"}, + {".sxc", "application/vnd.sun.xml.calc"}, + {".stc", "application/vnd.sun.xml.calc.template"}, + {".sxd", "application/vnd.sun.xml.draw"}, + {".std", "application/vnd.sun.xml.draw.template"}, + {".sxi", "application/vnd.sun.xml.impress"}, + {".sti", "application/vnd.sun.xml.impress.template"}, + {".sxm", "application/vnd.sun.xml.math"}, + {".sxw", "application/vnd.sun.xml.writer"}, + {".sxg", "application/vnd.sun.xml.writer.global"}, + {".stw", "application/vnd.sun.xml.writer.template"}, + {".otf", "application/x-font-otf"}, + {".osfpvg", "application/vnd.yamaha.openscoreformat.osfpvg+xml"}, + {".dp", "application/vnd.osgi.dp"}, + {".pdb", "application/vnd.palm"}, + {".p", "text/x-pascal"}, + {".paw", "application/vnd.pawaafile"}, + {".pclxl", "application/vnd.hp-pclxl"}, + {".efif", "application/vnd.picsel"}, + {".pcx", "image/x-pcx"}, + {".psd", "image/vnd.adobe.photoshop"}, + {".prf", "application/pics-rules"}, + {".pic", "image/x-pict"}, + {".chat", "application/x-chat"}, + {".p10", "application/pkcs10"}, + {".p12", "application/x-pkcs12"}, + {".p7m", "application/pkcs7-mime"}, + {".p7s", "application/pkcs7-signature"}, + {".p7r", "application/x-pkcs7-certreqresp"}, + {".p7b", "application/x-pkcs7-certificates"}, + {".p8", "application/pkcs8"}, + {".plf", "application/vnd.pocketlearn"}, + {".pnm", "image/x-portable-anymap"}, + {".pbm", "image/x-portable-bitmap"}, + {".pcf", "application/x-font-pcf"}, + {".pfr", "application/font-tdpfr"}, + {".pgn", "application/x-chess-pgn"}, + {".pgm", "image/x-portable-graymap"}, + {".png", "image/png"}, + {".png", "image/x-citrix-png"}, + {".png", "image/x-png"}, + {".ppm", "image/x-portable-pixmap"}, + {".pskcxml", "application/pskc+xml"}, + {".pml", "application/vnd.ctc-posml"}, + {".ai", "application/postscript"}, + {".pfa", "application/x-font-type1"}, + {".pbd", "application/vnd.powerbuilder6"}, + {".pgp", "application/pgp-encrypted"}, + {".pgp", "application/pgp-signature"}, + {".box", "application/vnd.previewsystems.box"}, + {".ptid", "application/vnd.pvi.ptid1"}, + {".pls", "application/pls+xml"}, + {".str", "application/vnd.pg.format"}, + {".ei6", "application/vnd.pg.osasli"}, + {".dsc", "text/prs.lines.tag"}, + {".psf", "application/x-font-linux-psf"}, + {".qps", "application/vnd.publishare-delta-tree"}, + {".wg", "application/vnd.pmi.widget"}, + {".qxd", "application/vnd.quark.quarkxpress"}, + {".esf", "application/vnd.epson.esf"}, + {".msf", "application/vnd.epson.msf"}, + {".ssf", "application/vnd.epson.ssf"}, + {".qam", "application/vnd.epson.quickanime"}, + {".qfx", "application/vnd.intu.qfx"}, + {".qt", "video/quicktime"}, + {".rar", "application/x-rar-compressed"}, + {".ram", "audio/x-pn-realaudio"}, + {".rmp", "audio/x-pn-realaudio-plugin"}, + {".rsd", "application/rsd+xml"}, + {".rm", "application/vnd.rn-realmedia"}, + {".bed", "application/vnd.realvnc.bed"}, + {".mxl", "application/vnd.recordare.musicxml"}, + {".musicxml", "application/vnd.recordare.musicxml+xml"}, + {".rnc", "application/relax-ng-compact-syntax"}, + {".rdz", "application/vnd.data-vision.rdz"}, + {".rdf", "application/rdf+xml"}, + {".rp9", "application/vnd.cloanto.rp9"}, + {".jisp", "application/vnd.jisp"}, + {".rtf", "application/rtf"}, + {".rtx", "text/richtext"}, + {".link66", "application/vnd.route66.link66+xml"}, + {".rss", "application/rss+xml"}, + {".shf", "application/shf+xml"}, + {".st", "application/vnd.sailingtracker.track"}, + {".svg", "image/svg+xml"}, + {".sus", "application/vnd.sus-calendar"}, + {".sru", "application/sru+xml"}, + {".setpay", "application/set-payment-initiation"}, + {".setreg", "application/set-registration-initiation"}, + {".sema", "application/vnd.sema"}, + {".semd", "application/vnd.semd"}, + {".semf", "application/vnd.semf"}, + {".see", "application/vnd.seemail"}, + {".snf", "application/x-font-snf"}, + {".spq", "application/scvp-vp-request"}, + {".spp", "application/scvp-vp-response"}, + {".scq", "application/scvp-cv-request"}, + {".scs", "application/scvp-cv-response"}, + {".sdp", "application/sdp"}, + {".etx", "text/x-setext"}, + {".movie", "video/x-sgi-movie"}, + {".ifm", "application/vnd.shana.informed.formdata"}, + {".itp", "application/vnd.shana.informed.formtemplate"}, + {".iif", "application/vnd.shana.informed.interchange"}, + {".ipk", "application/vnd.shana.informed.package"}, + {".tfi", "application/thraud+xml"}, + {".shar", "application/x-shar"}, + {".rgb", "image/x-rgb"}, + {".slt", "application/vnd.epson.salt"}, + {".aso", "application/vnd.accpac.simply.aso"}, + {".imp", "application/vnd.accpac.simply.imp"}, + {".twd", "application/vnd.simtech-mindmapper"}, + {".csp", "application/vnd.commonspace"}, + {".saf", "application/vnd.yamaha.smaf-audio"}, + {".mmf", "application/vnd.smaf"}, + {".spf", "application/vnd.yamaha.smaf-phrase"}, + {".teacher", "application/vnd.smart.teacher"}, + {".svd", "application/vnd.svd"}, + {".rq", "application/sparql-query"}, + {".srx", "application/sparql-results+xml"}, + {".gram", "application/srgs"}, + {".grxml", "application/srgs+xml"}, + {".ssml", "application/ssml+xml"}, + {".skp", "application/vnd.koan"}, + {".sgml", "text/sgml"}, + {".sdc", "application/vnd.stardivision.calc"}, + {".sda", "application/vnd.stardivision.draw"}, + {".sdd", "application/vnd.stardivision.impress"}, + {".smf", "application/vnd.stardivision.math"}, + {".sdw", "application/vnd.stardivision.writer"}, + {".sgl", "application/vnd.stardivision.writer-global"}, + {".sm", "application/vnd.stepmania.stepchart"}, + {".sit", "application/x-stuffit"}, + {".sitx", "application/x-stuffitx"}, + {".sdkm", "application/vnd.solent.sdkm+xml"}, + {".xo", "application/vnd.olpc-sugar"}, + {".au", "audio/basic"}, + {".wqd", "application/vnd.wqd"}, + {".sis", "application/vnd.symbian.install"}, + {".smi", "application/smil+xml"}, + {".xsm", "application/vnd.syncml+xml"}, + {".bdm", "application/vnd.syncml.dm+wbxml"}, + {".xdm", "application/vnd.syncml.dm+xml"}, + {".sv4cpio", "application/x-sv4cpio"}, + {".sv4crc", "application/x-sv4crc"}, + {".sbml", "application/sbml+xml"}, + {".tsv", "text/tab-separated-values"}, + {".tiff", "image/tiff"}, + {".tao", "application/vnd.tao.intent-module-archive"}, + {".tar", "application/x-tar"}, + {".tcl", "application/x-tcl"}, + {".tex", "application/x-tex"}, + {".tfm", "application/x-tex-tfm"}, + {".tei", "application/tei+xml"}, + {".txt", "text/plain; charset=utf-8"}, + {".md", "text/markdown; charset=utf-8"}, + {".dxp", "application/vnd.spotfire.dxp"}, + {".sfs", "application/vnd.spotfire.sfs"}, + {".tsd", "application/timestamped-data"}, + {".tpt", "application/vnd.trid.tpt"}, + {".mxs", "application/vnd.triscape.mxs"}, + {".t", "text/troff"}, + {".tra", "application/vnd.trueapp"}, + {".ttf", "application/x-font-ttf"}, + {".ttl", "text/turtle"}, + {".umj", "application/vnd.umajin"}, + {".uoml", "application/vnd.uoml+xml"}, + {".unityweb", "application/vnd.unity"}, + {".ufd", "application/vnd.ufdl"}, + {".uri", "text/uri-list"}, + {".utz", "application/vnd.uiq.theme"}, + {".ustar", "application/x-ustar"}, + {".uu", "text/x-uuencode"}, + {".vcs", "text/x-vcalendar"}, + {".vcf", "text/x-vcard"}, + {".vcd", "application/x-cdlink"}, + {".vsf", "application/vnd.vsf"}, + {".wrl", "model/vrml"}, + {".vcx", "application/vnd.vcx"}, + {".mts", "model/vnd.mts"}, + {".vtu", "model/vnd.vtu"}, + {".vis", "application/vnd.visionary"}, + {".viv", "video/vnd.vivo"}, + {".ccxml", "application/ccxml+xml"}, + {".vxml", "application/voicexml+xml"}, + {".src", "application/x-wais-source"}, + {".wbxml", "application/vnd.wap.wbxml"}, + {".wbmp", "image/vnd.wap.wbmp"}, + {".wav", "audio/x-wav"}, + {".davmount", "application/davmount+xml"}, + {".woff", "application/x-font-woff"}, + {".wspolicy", "application/wspolicy+xml"}, + {".webp", "image/webp"}, + {".wtb", "application/vnd.webturbo"}, + {".wgt", "application/widget"}, + {".hlp", "application/winhlp"}, + {".wml", "text/vnd.wap.wml"}, + {".wmls", "text/vnd.wap.wmlscript"}, + {".wmlsc", "application/vnd.wap.wmlscriptc"}, + {".wpd", "application/vnd.wordperfect"}, + {".stf", "application/vnd.wt.stf"}, + {".wsdl", "application/wsdl+xml"}, + {".xbm", "image/x-xbitmap"}, + {".xpm", "image/x-xpixmap"}, + {".xwd", "image/x-xwindowdump"}, + {".der", "application/x-x509-ca-cert"}, + {".fig", "application/x-xfig"}, + {".xhtml", "application/xhtml+xml"}, + {".xml", "application/xml"}, + {".xdf", "application/xcap-diff+xml"}, + {".xenc", "application/xenc+xml"}, + {".xer", "application/patch-ops-error+xml"}, + {".rl", "application/resource-lists+xml"}, + {".rs", "application/rls-services+xml"}, + {".rld", "application/resource-lists-diff+xml"}, + {".xslt", "application/xslt+xml"}, + {".xop", "application/xop+xml"}, + {".xpi", "application/x-xpinstall"}, + {".xspf", "application/xspf+xml"}, + {".xul", "application/vnd.mozilla.xul+xml"}, + {".xyz", "chemical/x-xyz"}, + {".yaml", "text/yaml"}, + {".yang", "application/yang"}, + {".yin", "application/yin+xml"}, + {".zir", "application/vnd.zul"}, + {".zip", "application/zip"}, + {".zmm", "application/vnd.handheld-entertainment+xml"}, + {".zaz", "application/vnd.zzazz.deck+xml"}, +}; + +// Get HTTP MIME type from filename +char *GetMimeTypeFromFileName(char *filename) +{ + UINT i; + UINT num = sizeof(http_mime_types) / sizeof(HTTP_MIME_TYPE); + if (filename == NULL) + { + return NULL; + } + + for (i = 0;i < num;i++) + { + HTTP_MIME_TYPE *a = &http_mime_types[i]; + + if (EndWith(filename, a->Extension)) + { + return a->MimeType; + } + } + + return NULL; +} + // Download and save intermediate certificates if necessary bool DownloadAndSaveIntermediateCertificatesIfNecessary(X *x) { @@ -1183,6 +1903,11 @@ error_detail_2 = NULL; if (ServerDownloadSignature(c, &error_detail_2) == false) { + if (c->Type == CONNECTION_TYPE_ADMIN_RPC) + { + c->Err = ERR_NO_ERROR; + } + if (error_detail_2 == NULL) { error_detail = "ServerDownloadSignature"; @@ -5045,11 +5770,11 @@ } #define PACK_ADD_POLICY_BOOL(name, value) \ - PackAddInt(p, "policy:" name, y->value == false ? 0 : 1) + PackAddBool(p, "policy:" name, y->value == false ? 0 : 1) #define PACK_ADD_POLICY_UINT(name, value) \ PackAddInt(p, "policy:" name, y->value) #define PACK_GET_POLICY_BOOL(name, value) \ - y->value = (PackGetInt(p, "policy:" name) == 0 ? false : true) + y->value = (PackGetBool(p, "policy:" name)) #define PACK_GET_POLICY_UINT(name, value) \ y->value = PackGetInt(p, "policy:" name) @@ -5560,6 +6285,10 @@ if (h == NULL) { c->Err = ERR_CLIENT_IS_NOT_VPN; + if (c->IsJsonRpc) + { + c->Err = ERR_DISCONNECTED; + } return false; } @@ -5568,6 +6297,43 @@ { // Receive the data since it's POST data_size = GetContentLength(h); + + if (server->DisableJsonRpcWebApi == false) + { + if (StrCmpi(h->Target, "/api") == 0 || StrCmpi(h->Target, "/api/") == 0) + { + c->IsJsonRpc = true; + c->Type = CONNECTION_TYPE_ADMIN_RPC; + + JsonRpcProcPost(c, s, h, data_size); + + FreeHttpHeader(h); + + if (c->JsonRpcAuthed) + { + num = 0; + } + + continue; + } + else if (StartWith(h->Target, "/admin")) + { + c->IsJsonRpc = true; + c->Type = CONNECTION_TYPE_ADMIN_RPC; + + AdminWebProcPost(c, s, h, data_size, h->Target); + + FreeHttpHeader(h); + + if (c->JsonRpcAuthed) + { + num = 0; + } + + continue; + } + } + if ((data_size > MAX_WATERMARK_SIZE || data_size < SizeOfWaterMark()) && (data_size != StrLen(HTTP_VPN_TARGET_POSTDATA))) { // Data is too large @@ -5616,6 +6382,25 @@ } } } + else if (StrCmpi(h->Method, "OPTIONS") == 0) + { + if (server->DisableJsonRpcWebApi == false) + { + if (StrCmpi(h->Target, "/api") == 0 || StrCmpi(h->Target, "/api/") == 0 || StartWith(h->Target, "/admin")) + { + c->IsJsonRpc = true; + c->Type = CONNECTION_TYPE_ADMIN_RPC; + + JsonRpcProcOptions(c, s, h, h->Target); + + FreeHttpHeader(h); + + num = 0; + + continue; + } + } + } else if (StrCmpi(h->Method, "SSTP_DUPLEX_POST") == 0 && (server->DisableSSTPServer == false || s->IsReverseAcceptedSocket ) && GetServerCapsBool(server, "b_support_sstp") && GetNoSstp() == false) @@ -5732,6 +6517,45 @@ } } } + + if (b == false) + { + if (server->DisableJsonRpcWebApi == false) + { + if (StartWith(h->Target, "/api?") || StartWith(h->Target, "/api/") || StrCmpi(h->Target, "/api") == 0) + { + c->IsJsonRpc = true; + c->Type = CONNECTION_TYPE_ADMIN_RPC; + + JsonRpcProcGet(c, s, h, h->Target); + + if (c->JsonRpcAuthed) + { + num = 0; + } + + FreeHttpHeader(h); + + continue; + } + else if (StartWith(h->Target, "/admin")) + { + c->IsJsonRpc = true; + c->Type = CONNECTION_TYPE_ADMIN_RPC; + + AdminWebProcGet(c, s, h, h->Target); + + if (c->JsonRpcAuthed) + { + num = 0; + } + + FreeHttpHeader(h); + + continue; + } + } + } if (b == false) { diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Protocol.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Protocol.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Protocol.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Protocol.h 2019-07-23 21:37:12.000000000 +0000 @@ -8,6 +8,13 @@ #ifndef PROTOCOL_H #define PROTOCOL_H +// MIME types +struct HTTP_MIME_TYPE +{ + char *Extension; + char *MimeType; +}; + // The parameters that will be passed to the certificate confirmation thread struct CHECK_CERT_THREAD_PROC { @@ -190,6 +197,6 @@ bool TryGetRootCertChain(LIST *o, X *x, bool auto_save, X **found_root_x); bool TryGetParentCertFromCertList(LIST *o, X *x, LIST *found_chain); bool DownloadAndSaveIntermediateCertificatesIfNecessary(X *x); - +char *GetMimeTypeFromFileName(char *filename); #endif // PROTOCOL_H diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Proto_OpenVPN.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Proto_OpenVPN.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Proto_OpenVPN.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Proto_OpenVPN.c 2019-07-23 21:37:12.000000000 +0000 @@ -871,9 +871,13 @@ p.BridgeMode = true; } - if (c->ClientCert.X != NULL) + if (IsEmptyStr(c->ClientKey.Username) || IsEmptyStr(c->ClientKey.Password)) { - p.ClientCertificate = c->ClientCert.X; + // OpenVPN X.509 certificate authentication will be used only when no username / password is specified + if (c->ClientCert.X != NULL) + { + p.ClientCertificate = c->ClientCert.X; + } } // Calculate the MSS diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Remote.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Remote.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Remote.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Remote.c 2019-07-23 21:37:12.000000000 +0000 @@ -16,13 +16,21 @@ // Release the RPC void RpcFree(RPC *rpc) { + RpcFreeEx(rpc, false); +} +void RpcFreeEx(RPC *rpc, bool no_disconnect) +{ // Validate arguments if (rpc == NULL) { return; } - Disconnect(rpc->Sock); + if (no_disconnect == false) + { + Disconnect(rpc->Sock); + } + ReleaseSock(rpc->Sock); DeleteLock(rpc->Lock); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Remote.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Remote.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Remote.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Remote.h 2019-07-23 21:37:12.000000000 +0000 @@ -42,6 +42,7 @@ UINT RpcGetError(PACK *p); void EndRpc(RPC *rpc); void RpcFree(RPC *rpc); +void RpcFreeEx(RPC *rpc, bool no_disconnect); #endif // REMOTE_H diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Server.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Server.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Server.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Server.c 2019-07-23 21:37:12.000000000 +0000 @@ -974,52 +974,70 @@ // Enumerate in the packet_log Format(tmp, sizeof(tmp), "%s/packet_log", exe_dir); - dir = EnumDir(tmp); - if (dir != NULL) + + if (hubname == NULL) { - UINT i; - for (i = 0;i < dir->NumFiles;i++) + dir = EnumDir(tmp); + if (dir != NULL) { - DIRENT *e = dir->File[i]; - - if (e->Folder) + UINT i; + for (i = 0;i < dir->NumFiles;i++) { - char dir_name[MAX_PATH]; + DIRENT *e = dir->File[i]; - if (hubname == NULL || StrCmpi(hubname, e->FileName) == 0) + if (e->Folder) { + char dir_name[MAX_PATH]; Format(dir_name, sizeof(dir_name), "packet_log/%s", e->FileName); EnumLogFileDir(o, dir_name); } } + + FreeDir(dir); } + } + else + { + char dir_name[MAX_PATH]; - FreeDir(dir); + Format(dir_name, sizeof(dir_name), "packet_log/%s", hubname); + + EnumLogFileDir(o, dir_name); } // Enumerate in the security_log Format(tmp, sizeof(tmp), "%s/security_log", exe_dir); - dir = EnumDir(tmp); - if (dir != NULL) + + if (hubname == NULL) { - UINT i; - for (i = 0;i < dir->NumFiles;i++) + dir = EnumDir(tmp); + if (dir != NULL) { - DIRENT *e = dir->File[i]; - - if (e->Folder) + UINT i; + for (i = 0;i < dir->NumFiles;i++) { - char dir_name[MAX_PATH]; + DIRENT *e = dir->File[i]; - if (hubname == NULL || StrCmpi(hubname, e->FileName) == 0) + if (e->Folder) { + char dir_name[MAX_PATH]; + Format(dir_name, sizeof(dir_name), "security_log/%s", e->FileName); + EnumLogFileDir(o, dir_name); } } + + FreeDir(dir); } + } + else + { + char dir_name[MAX_PATH]; + + Format(dir_name, sizeof(dir_name), "security_log/%s", hubname); - FreeDir(dir); + EnumLogFileDir(o, dir_name); } return o; @@ -1731,14 +1749,37 @@ return; } + PackSetCurrentJsonGroupName(p, "CapsList"); for (i = 0;i < LIST_NUM(t->CapsList);i++) { char tmp[MAX_SIZE]; + char ct_key[MAX_PATH]; + wchar_t ct_description[MAX_PATH]; + wchar_t *w; CAPS *c = LIST_DATA(t->CapsList, i); Format(tmp, sizeof(tmp), "caps_%s", c->Name); + + Format(ct_key, sizeof(ct_key), "CT_%s", c->Name); + + Zero(ct_description, sizeof(ct_description)); + w = _UU(ct_key); + if (UniIsEmptyStr(w) == false) + { + UniStrCpy(ct_description, sizeof(ct_description), w); + } + else + { + StrToUni(ct_description, sizeof(ct_description), c->Name); + } + PackAddInt(p, tmp, c->Value); + + PackAddStrEx(p, "CapsName", c->Name, i, LIST_NUM(t->CapsList)); + PackAddIntEx(p, "CapsValue", c->Value, i, LIST_NUM(t->CapsList)); + PackAddUniStrEx(p, "CapsDescrption", ct_description, i, LIST_NUM(t->CapsList)); } + PackSetCurrentJsonGroupName(p, NULL); } void FreeRpcCapsList(CAPSLIST *t) { @@ -5982,7 +6023,11 @@ c->SslAcceptSettings.Tls_Disable1_2 = CfgGetBool(f, "Tls_Disable1_2"); s->StrictSyslogDatetimeFormat = CfgGetBool(f, "StrictSyslogDatetimeFormat"); - // Bits of Diffie-Hellman parameters + + // Disable JSON-RPC Web API + s->DisableJsonRpcWebApi = CfgGetBool(f, "DisableJsonRpcWebApi"); + + // Bits of Diffie-Hellman parameters c->DhParamBits = CfgGetInt(f, "DhParamBits"); if (c->DhParamBits == 0) { @@ -6314,6 +6359,9 @@ CfgAddBool(f, "DisableSessionReconnect", GetGlobalServerFlag(GSF_DISABLE_SESSION_RECONNECT)); CfgAddBool(f, "StrictSyslogDatetimeFormat", s->StrictSyslogDatetimeFormat); + + // Disable JSON-RPC Web API + CfgAddBool(f, "DisableJsonRpcWebApi", s->DisableJsonRpcWebApi); } Unlock(c->lock); } @@ -7031,7 +7079,7 @@ PackAddIntEx(p, "NumTcpConnections", f->NumTcpConnections, i, num); PackAddIntEx(p, "NumHubs", LIST_NUM(f->HubList), i, num); PackAddBoolEx(p, "Me", f->Me, i, num); - PackAddInt64Ex(p, "ConnectedTime", f->ConnectedTime, i, num); + PackAddTime64Ex(p, "ConnectedTime", f->ConnectedTime, i, num); PackAddInt64Ex(p, "SystemId", f->SystemId, i, num); PackAddBoolEx(p, "DoNotSelect", do_not_select, i, num); } @@ -7060,7 +7108,7 @@ PackAddStr(p, "CipherName", c->CipherName); PackAddStr(p, "ClientStr", c->ClientStr); PackAddInt(p, "ClientVer", c->ClientVer); - PackAddInt64(p, "ConnectedTime", Tick64ToTime64(c->ConnectedTick)); + PackAddTime64(p, "ConnectedTime", Tick64ToTime64(c->ConnectedTick)); PackAddStr(p, "HubName", h->Name); PackAddBool(p, "StaticHub", h->Type == HUB_TYPE_FARM_STATIC); @@ -7200,8 +7248,8 @@ PackAddIntEx(p, "NumIpTables", LIST_NUM(h->IpTable), i, num); - PackAddInt64Ex(p, "LastCommTime", h->LastCommTime, i, num); - PackAddInt64Ex(p, "CreatedTime", h->CreatedTime, i, num); + PackAddTime64Ex(p, "LastCommTime", h->LastCommTime, i, num); + PackAddTime64Ex(p, "CreatedTime", h->CreatedTime, i, num); } Unlock(h->lock); } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Server.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Server.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Server.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Server.h 2019-07-23 21:37:12.000000000 +0000 @@ -267,6 +267,7 @@ IP ListenIP; // Listen IP bool StrictSyslogDatetimeFormat; // Make syslog datetime format strict RFC3164 + bool DisableJsonRpcWebApi; // Disable JSON-RPC Web API }; @@ -290,6 +291,7 @@ RPC_CLIENT_GET_CONNECTION_STATUS Status; // Status UINT ClientIp; // Client IP address UCHAR ClientIp6[16]; // Client IPv6 address + IP ClientIpAddress; // Client IP address (IPv4/IPv6) char ClientHostName[MAX_HOST_NAME_LEN + 1]; // Client host name NODE_INFO NodeInfo; // Node information }; diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Session.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Session.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Session.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Session.c 2019-07-23 21:37:12.000000000 +0000 @@ -108,9 +108,9 @@ s->NumConnectionsEstablished++; s->CurrentConnectionEstablishTime = Tick64(); - if (s->FirstConnectionEstablishedTime == 0) + if (s->FirstConnectionEstablisiedTime == 0) /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ { - s->FirstConnectionEstablishedTime = Tick64(); + s->FirstConnectionEstablisiedTime = Tick64(); /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ } if (s->ServerMode == false && s->Cedar->Client != NULL) @@ -1158,7 +1158,10 @@ // Server and client mode if (s->Connection) { - StopConnection(s->Connection, no_wait); + CONNECTION *c = s->Connection; + AddRef(c->ref); + StopConnection(c, no_wait); + ReleaseConnection(c); } // Wait until the stop diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Session.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Session.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/Session.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/Session.h 2019-07-23 21:37:12.000000000 +0000 @@ -157,7 +157,8 @@ UINT NumDisconnected; // Number of socket disconnection bool NoReconnectToSession; // Disable to reconnect to the session char UnderlayProtocol[64]; // Physical communication protocol - UINT64 FirstConnectionEstablishedTime; // Connection completion time of the first connection + /* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */ + UINT64 FirstConnectionEstablisiedTime; // Connection completion time of the first connection UINT64 CurrentConnectionEstablishTime; // Completion time of this connection UINT NumConnectionsEstablished; // Number of connections established so far UINT AdjustMss; // MSS adjustment value diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/SW.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/SW.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Cedar/SW.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Cedar/SW.c 2019-07-23 21:37:12.000000000 +0000 @@ -5640,6 +5640,15 @@ break; } + if (MsIsKB3033929RequiredAndMissing()) + { + // KB3033929 is missing + if (MsgBoxEx(hWnd, MB_ICONINFORMATION | MB_OKCANCEL, _UU("SW_KB3033929_REQUIRED")) == IDCANCEL) + { + break; + } + } + if (sw->DoubleClickBlocker) { break; diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/CurrentBuild.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/CurrentBuild.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/CurrentBuild.txt 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/CurrentBuild.txt 2019-07-23 21:37:12.000000000 +0000 @@ -1,5 +1,5 @@ VERSION_MAJOR 5 VERSION_MINOR 1 -VERSION_BUILD 9670 +VERSION_BUILD 9671 BUILD_NAME unstable -BUILD_DATE 20190407_185715 +BUILD_DATE 20190710_000000 diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/CMakeLists.txt softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/CMakeLists.txt --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/CMakeLists.txt 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/CMakeLists.txt 2019-07-23 21:37:18.000000000 +0000 @@ -2,6 +2,8 @@ project(CpuFeatures VERSION 0.1.0) +set(CMAKE_C_STANDARD 99) + # Default Build Type to be Release if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING @@ -47,7 +49,7 @@ set(PROCESSOR_IS_ARM TRUE) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") set(PROCESSOR_IS_AARCH64 TRUE) -elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64)|(^i.86$)") +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)") set(PROCESSOR_IS_X86 TRUE) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") set(PROCESSOR_IS_POWER TRUE) @@ -55,6 +57,7 @@ macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME) list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_macros.h) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_cache_info.h) if(PROCESSOR_IS_MIPS) list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_mips.h) list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_mips.c) diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpu_features_cache_info.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpu_features_cache_info.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpu_features_cache_info.h 1970-01-01 00:00:00.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpu_features_cache_info.h 2019-07-23 21:37:18.000000000 +0000 @@ -0,0 +1,54 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_COMMON_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_COMMON_H_ + +#include "cpu_features_macros.h" + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef enum { + CPU_FEATURE_CACHE_NULL = 0, + CPU_FEATURE_CACHE_DATA = 1, + CPU_FEATURE_CACHE_INSTRUCTION = 2, + CPU_FEATURE_CACHE_UNIFIED = 3, + CPU_FEATURE_CACHE_TLB = 4, + CPU_FEATURE_CACHE_DTLB = 5, + CPU_FEATURE_CACHE_STLB = 6, + CPU_FEATURE_CACHE_PREFETCH = 7 +} CacheType; + +typedef struct { + int level; + CacheType cache_type; + int cache_size; // Cache size in bytes + int ways; // Associativity, 0 undefined, 0xFF fully associative + int line_size; // Cache line size in bytes + int tlb_entries; // number of entries for TLB + int partitioning; // number of lines per sector +} CacheLevelInfo; + +// Increase this value if more cache levels are needed. +#ifndef CPU_FEATURES_MAX_CACHE_LEVEL +#define CPU_FEATURES_MAX_CACHE_LEVEL 10 +#endif +typedef struct { + int size; + CacheLevelInfo levels[CPU_FEATURES_MAX_CACHE_LEVEL]; +} CacheInfo; + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_COMMON_H_ diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_aarch64.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_aarch64.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_aarch64.h 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_aarch64.h 2019-07-23 21:37:18.000000000 +0000 @@ -16,6 +16,7 @@ #define CPU_FEATURES_INCLUDE_CPUINFO_AARCH64_H_ #include "cpu_features_macros.h" +#include "cpu_features_cache_info.h" CPU_FEATURES_START_CPP_NAMESPACE diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_arm.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_arm.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_arm.h 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_arm.h 2019-07-23 21:37:18.000000000 +0000 @@ -17,18 +17,33 @@ #include // uint32_t #include "cpu_features_macros.h" +#include "cpu_features_cache_info.h" CPU_FEATURES_START_CPP_NAMESPACE typedef struct { + int swp : 1; // SWP instruction (atomic read-modify-write) + int half : 1; // Half-word loads and stores + int thumb : 1; // Thumb (16-bit instruction set) + int _26bit : 1; // "26 Bit" Model (Processor status register folded into program counter) + int fastmult : 1; // 32x32->64-bit multiplication + int fpa : 1; // Floating point accelerator int vfp : 1; // Vector Floating Point. + int edsp : 1; // DSP extensions (the 'e' variant of the ARM9 CPUs, and all others above) + int java : 1; // Jazelle (Java bytecode accelerator) int iwmmxt : 1; // Intel Wireless MMX Technology. + int crunch : 1; // MaverickCrunch coprocessor + int thumbee : 1; // ThumbEE int neon : 1; // Advanced SIMD. int vfpv3 : 1; // VFP version 3 int vfpv3d16 : 1; // VFP version 3 with 16 D-registers + int tls : 1; // TLS register int vfpv4 : 1; // VFP version 4 with fast context switching int idiva : 1; // SDIV and UDIV hardware division in ARM mode. int idivt : 1; // SDIV and UDIV hardware division in Thumb mode. + int vfpd32 : 1; // VFP with 32 D-registers + int lpae : 1; // Large Physical Address Extension (>4GB physical memory on 32-bit architecture) + int evtstrm : 1; // kernel event stream using generic architected timer int aes : 1; // Hardware-accelerated Advanced Encryption Standard. int pmull : 1; // Polynomial multiply long. int sha1 : 1; // Hardware-accelerated SHA1. @@ -59,14 +74,28 @@ // Introspection functions typedef enum { + ARM_SWP, + ARM_HALF, + ARM_THUMB, + ARM_26BIT, + ARM_FASTMULT, + ARM_FPA, ARM_VFP, + ARM_EDSP, + ARM_JAVA, ARM_IWMMXT, + ARM_CRUNCH, + ARM_THUMBEE, ARM_NEON, ARM_VFPV3, ARM_VFPV3D16, + ARM_TLS, ARM_VFPV4, ARM_IDIVA, ARM_IDIVT, + ARM_VFPD32, + ARM_LPAE, + ARM_EVTSTRM, ARM_AES, ARM_PMULL, ARM_SHA1, diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_mips.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_mips.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_mips.h 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_mips.h 2019-07-23 21:37:18.000000000 +0000 @@ -16,6 +16,7 @@ #define CPU_FEATURES_INCLUDE_CPUINFO_MIPS_H_ #include "cpu_features_macros.h" +#include "cpu_features_cache_info.h" CPU_FEATURES_START_CPP_NAMESPACE diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_ppc.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_ppc.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_ppc.h 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_ppc.h 2019-07-23 21:37:18.000000000 +0000 @@ -16,6 +16,7 @@ #define CPU_FEATURES_INCLUDE_CPUINFO_PPC_H_ #include "cpu_features_macros.h" +#include "cpu_features_cache_info.h" #include "internal/hwcaps.h" CPU_FEATURES_START_CPP_NAMESPACE diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_x86.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_x86.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_x86.h 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/cpuinfo_x86.h 2019-07-23 21:37:18.000000000 +0000 @@ -15,6 +15,7 @@ #ifndef CPU_FEATURES_INCLUDE_CPUINFO_X86_H_ #define CPU_FEATURES_INCLUDE_CPUINFO_X86_H_ +#include "cpu_features_cache_info.h" #include "cpu_features_macros.h" CPU_FEATURES_START_CPP_NAMESPACE @@ -22,14 +23,28 @@ // See https://en.wikipedia.org/wiki/CPUID for a list of x86 cpu features. // The field names are based on the short name provided in the wikipedia tables. typedef struct { + int fpu : 1; + int tsc : 1; + int cx8 : 1; + int clfsh : 1; + int mmx : 1; int aes : 1; int erms : 1; int f16c : 1; int fma3 : 1; + int vaes : 1; int vpclmulqdq : 1; int bmi1 : 1; + int hle : 1; int bmi2 : 1; - + int rtm : 1; + int rdseed : 1; + int clflushopt : 1; + int clwb : 1; + + int sse : 1; + int sse2 : 1; + int sse3 : 1; int ssse3 : 1; int sse4_1 : 1; int sse4_2 : 1; @@ -53,6 +68,7 @@ int avx512_4vnniw : 1; int avx512_4vbmi2 : 1; + int pclmulqdq : 1; int smx : 1; int sgx : 1; int cx16 : 1; // aka. CMPXCHG16B @@ -61,6 +77,8 @@ int movbe : 1; int rdrnd : 1; + int dca : 1; + int ss : 1; // Make sure to update X86FeaturesEnum below if you add a field here. } X86Features; @@ -76,6 +94,12 @@ // This function is guaranteed to be malloc, memset and memcpy free. X86Info GetX86Info(void); +// Returns cache hierarchy informations. +// Can call cpuid multiple times. +// Only works on Intel CPU at the moment. +// This function is guaranteed to be malloc, memset and memcpy free. +CacheInfo GetX86CacheInfo(void); + typedef enum { X86_UNKNOWN, INTEL_CORE, // CORE @@ -115,13 +139,27 @@ // Introspection functions typedef enum { + X86_FPU, + X86_TSC, + X86_CX8, + X86_CLFSH, + X86_MMX, X86_AES, X86_ERMS, X86_F16C, X86_FMA3, + X86_VAES, X86_VPCLMULQDQ, X86_BMI1, + X86_HLE, X86_BMI2, + X86_RTM, + X86_RDSEED, + X86_CLFLUSHOPT, + X86_CLWB, + X86_SSE, + X86_SSE2, + X86_SSE3, X86_SSSE3, X86_SSE4_1, X86_SSE4_2, @@ -142,6 +180,7 @@ X86_AVX512VPOPCNTDQ, X86_AVX512_4VNNIW, X86_AVX512_4VBMI2, + X86_PCLMULQDQ, X86_SMX, X86_SGX, X86_CX16, @@ -149,6 +188,8 @@ X86_POPCNT, X86_MOVBE, X86_RDRND, + X86_DCA, + X86_SS, X86_LAST_, } X86FeaturesEnum; diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/internal/cpuid_x86.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/internal/cpuid_x86.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/internal/cpuid_x86.h 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/internal/cpuid_x86.h 2019-07-23 21:37:18.000000000 +0000 @@ -26,8 +26,7 @@ uint32_t eax, ebx, ecx, edx; } Leaf; -// Retrieves the leaf for a particular cpuid. -Leaf CpuId(uint32_t leaf_id); +Leaf CpuIdEx(uint32_t leaf_id, int ecx); // Returns the eax value of the XCR0 register. uint32_t GetXCR0Eax(void); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/internal/hwcaps.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/internal/hwcaps.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/internal/hwcaps.h 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/include/internal/hwcaps.h 2019-07-23 21:37:18.000000000 +0000 @@ -35,14 +35,28 @@ #define AARCH64_HWCAP_CRC32 (1UL << 7) // http://elixir.free-electrons.com/linux/latest/source/arch/arm/include/uapi/asm/hwcap.h +#define ARM_HWCAP_SWP (1UL << 0) +#define ARM_HWCAP_HALF (1UL << 1) +#define ARM_HWCAP_THUMB (1UL << 2) +#define ARM_HWCAP_26BIT (1UL << 3) +#define ARM_HWCAP_FAST_MULT (1UL << 4) +#define ARM_HWCAP_FPA (1UL << 5) #define ARM_HWCAP_VFP (1UL << 6) +#define ARM_HWCAP_EDSP (1UL << 7) +#define ARM_HWCAP_JAVA (1UL << 8) #define ARM_HWCAP_IWMMXT (1UL << 9) +#define ARM_HWCAP_CRUNCH (1UL << 10) +#define ARM_HWCAP_THUMBEE (1UL << 11) #define ARM_HWCAP_NEON (1UL << 12) #define ARM_HWCAP_VFPV3 (1UL << 13) #define ARM_HWCAP_VFPV3D16 (1UL << 14) +#define ARM_HWCAP_TLS (1UL << 15) #define ARM_HWCAP_VFPV4 (1UL << 16) #define ARM_HWCAP_IDIVA (1UL << 17) #define ARM_HWCAP_IDIVT (1UL << 18) +#define ARM_HWCAP_VFPD32 (1UL << 19) +#define ARM_HWCAP_LPAE (1UL << 20) +#define ARM_HWCAP_EVTSTRM (1UL << 21) #define ARM_HWCAP2_AES (1UL << 0) #define ARM_HWCAP2_PMULL (1UL << 1) #define ARM_HWCAP2_SHA1 (1UL << 2) diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_aarch64.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_aarch64.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_aarch64.c 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_aarch64.c 2019-07-23 21:37:18.000000000 +0000 @@ -20,6 +20,7 @@ #include "internal/string_view.h" #include "internal/unix_features_aggregator.h" +#include #include DECLARE_SETTER(Aarch64Features, fp) @@ -31,13 +32,13 @@ DECLARE_SETTER(Aarch64Features, crc32) static const CapabilityConfig kConfigs[] = { - {{AARCH64_HWCAP_FP, 0}, "fp", &set_fp}, // - {{AARCH64_HWCAP_ASIMD, 0}, "asimd", &set_asimd}, // - {{AARCH64_HWCAP_AES, 0}, "aes", &set_aes}, // - {{AARCH64_HWCAP_PMULL, 0}, "pmull", &set_pmull}, // - {{AARCH64_HWCAP_SHA1, 0}, "sha1", &set_sha1}, // - {{AARCH64_HWCAP_SHA2, 0}, "sha2", &set_sha2}, // - {{AARCH64_HWCAP_CRC32, 0}, "crc32", &set_crc32}, // + [AARCH64_FP] = {{AARCH64_HWCAP_FP, 0}, "fp", &set_fp}, // + [AARCH64_ASIMD] = {{AARCH64_HWCAP_ASIMD, 0}, "asimd", &set_asimd}, // + [AARCH64_AES] = {{AARCH64_HWCAP_AES, 0}, "aes", &set_aes}, // + [AARCH64_PMULL] = {{AARCH64_HWCAP_PMULL, 0}, "pmull", &set_pmull}, // + [AARCH64_SHA1] = {{AARCH64_HWCAP_SHA1, 0}, "sha1", &set_sha1}, // + [AARCH64_SHA2] = {{AARCH64_HWCAP_SHA2, 0}, "sha2", &set_sha2}, // + [AARCH64_CRC32] {{AARCH64_HWCAP_CRC32, 0}, "crc32", &set_crc32}, // }; static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig); @@ -79,6 +80,8 @@ static const Aarch64Info kEmptyAarch64Info; Aarch64Info GetAarch64Info(void) { + assert(kConfigsSize == AARCH64_LAST_); + // capabilities are fetched from both getauxval and /proc/cpuinfo so we can // have some information if the executable is sandboxed (aka no access to // /proc/cpuinfo). @@ -119,23 +122,7 @@ } const char* GetAarch64FeaturesEnumName(Aarch64FeaturesEnum value) { - switch (value) { - case AARCH64_FP: - return "fp"; - case AARCH64_ASIMD: - return "asimd"; - case AARCH64_AES: - return "aes"; - case AARCH64_PMULL: - return "pmull"; - case AARCH64_SHA1: - return "sha1"; - case AARCH64_SHA2: - return "sha2"; - case AARCH64_CRC32: - return "crc32"; - case AARCH64_LAST_: - break; - } - return "unknown feature"; + if(value >= kConfigsSize) + return "unknown feature"; + return kConfigs[value].proc_cpuinfo_flag; } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_arm.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_arm.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_arm.c 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_arm.c 2019-07-23 21:37:18.000000000 +0000 @@ -21,16 +21,31 @@ #include "internal/string_view.h" #include "internal/unix_features_aggregator.h" +#include #include +DECLARE_SETTER(ArmFeatures, swp) +DECLARE_SETTER(ArmFeatures, half) +DECLARE_SETTER(ArmFeatures, thumb) +DECLARE_SETTER(ArmFeatures, _26bit) +DECLARE_SETTER(ArmFeatures, fastmult) +DECLARE_SETTER(ArmFeatures, fpa) DECLARE_SETTER(ArmFeatures, vfp) +DECLARE_SETTER(ArmFeatures, edsp) +DECLARE_SETTER(ArmFeatures, java) DECLARE_SETTER(ArmFeatures, iwmmxt) +DECLARE_SETTER(ArmFeatures, crunch) +DECLARE_SETTER(ArmFeatures, thumbee) DECLARE_SETTER(ArmFeatures, neon) DECLARE_SETTER(ArmFeatures, vfpv3) DECLARE_SETTER(ArmFeatures, vfpv3d16) +DECLARE_SETTER(ArmFeatures, tls) DECLARE_SETTER(ArmFeatures, vfpv4) DECLARE_SETTER(ArmFeatures, idiva) DECLARE_SETTER(ArmFeatures, idivt) +DECLARE_SETTER(ArmFeatures, vfpd32) +DECLARE_SETTER(ArmFeatures, lpae) +DECLARE_SETTER(ArmFeatures, evtstrm) DECLARE_SETTER(ArmFeatures, aes) DECLARE_SETTER(ArmFeatures, pmull) DECLARE_SETTER(ArmFeatures, sha1) @@ -38,19 +53,33 @@ DECLARE_SETTER(ArmFeatures, crc32) static const CapabilityConfig kConfigs[] = { - {{ARM_HWCAP_VFP, 0}, "vfp", &set_vfp}, // - {{ARM_HWCAP_IWMMXT, 0}, "iwmmxt", &set_iwmmxt}, // - {{ARM_HWCAP_NEON, 0}, "neon", &set_neon}, // - {{ARM_HWCAP_VFPV3, 0}, "vfpv3", &set_vfpv3}, // - {{ARM_HWCAP_VFPV3D16, 0}, "vfpv3d16", &set_vfpv3d16}, // - {{ARM_HWCAP_VFPV4, 0}, "vfpv4", &set_vfpv4}, // - {{ARM_HWCAP_IDIVA, 0}, "idiva", &set_idiva}, // - {{ARM_HWCAP_IDIVT, 0}, "idivt", &set_idivt}, // - {{0, ARM_HWCAP2_AES}, "aes", &set_aes}, // - {{0, ARM_HWCAP2_PMULL}, "pmull", &set_pmull}, // - {{0, ARM_HWCAP2_SHA1}, "sha1", &set_sha1}, // - {{0, ARM_HWCAP2_SHA2}, "sha2", &set_sha2}, // - {{0, ARM_HWCAP2_CRC32}, "crc32", &set_crc32}, // + [ARM_SWP] = {{ARM_HWCAP_SWP, 0}, "swp", &set_swp}, // + [ARM_HALF] = {{ARM_HWCAP_HALF, 0}, "half", &set_half}, // + [ARM_THUMB] = {{ARM_HWCAP_THUMB, 0}, "thumb", &set_thumb}, // + [ARM_26BIT] = {{ARM_HWCAP_26BIT, 0}, "26bit", &set__26bit}, // + [ARM_FASTMULT] = {{ARM_HWCAP_FAST_MULT, 0}, "fastmult", &set_fastmult}, // + [ARM_FPA] = {{ARM_HWCAP_FPA, 0}, "fpa", &set_fpa}, // + [ARM_VFP] = {{ARM_HWCAP_VFP, 0}, "vfp", &set_vfp}, // + [ARM_EDSP] = {{ARM_HWCAP_EDSP, 0}, "edsp", &set_edsp}, // + [ARM_JAVA] = {{ARM_HWCAP_JAVA, 0}, "java", &set_java}, // + [ARM_IWMMXT] = {{ARM_HWCAP_IWMMXT, 0}, "iwmmxt", &set_iwmmxt}, // + [ARM_CRUNCH] = {{ARM_HWCAP_CRUNCH, 0}, "crunch", &set_crunch}, // + [ARM_THUMBEE] = {{ARM_HWCAP_THUMBEE, 0}, "thumbee", &set_thumbee}, // + [ARM_NEON] = {{ARM_HWCAP_NEON, 0}, "neon", &set_neon}, // + [ARM_VFPV3] = {{ARM_HWCAP_VFPV3, 0}, "vfpv3", &set_vfpv3}, // + [ARM_VFPV3D16] = {{ARM_HWCAP_VFPV3D16, 0}, "vfpv3d16", &set_vfpv3d16}, // + [ARM_TLS] = {{ARM_HWCAP_TLS, 0}, "tls", &set_tls}, // + [ARM_VFPV4] = {{ARM_HWCAP_VFPV4, 0}, "vfpv4", &set_vfpv4}, // + [ARM_IDIVA] = {{ARM_HWCAP_IDIVA, 0}, "idiva", &set_idiva}, // + [ARM_IDIVT] = {{ARM_HWCAP_IDIVT, 0}, "idivt", &set_idivt}, // + [ARM_VFPD32] = {{ARM_HWCAP_VFPD32, 0}, "vfpd32", &set_vfpd32}, // + [ARM_LPAE] = {{ARM_HWCAP_LPAE, 0}, "lpae", &set_lpae}, // + [ARM_EVTSTRM] = {{ARM_HWCAP_EVTSTRM, 0}, "evtstrm", &set_evtstrm}, // + [ARM_AES] = {{0, ARM_HWCAP2_AES}, "aes", &set_aes}, // + [ARM_PMULL] = {{0, ARM_HWCAP2_PMULL}, "pmull", &set_pmull}, // + [ARM_SHA1] = {{0, ARM_HWCAP2_SHA1}, "sha1", &set_sha1}, // + [ARM_SHA2] = {{0, ARM_HWCAP2_SHA2}, "sha2", &set_sha2}, // + [ARM_CRC32] = {{0, ARM_HWCAP2_CRC32}, "crc32", &set_crc32}, // }; static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig); @@ -90,7 +119,11 @@ const StringView digits = CpuFeatures_StringView_KeepFront(value, IndexOfNonDigit(value)); info->architecture = CpuFeatures_StringView_ParsePositiveNumber(digits); - } else if (CpuFeatures_StringView_IsEquals(key, str("Processor"))) { + } else if (CpuFeatures_StringView_IsEquals(key, str("Processor")) + || CpuFeatures_StringView_IsEquals(key, str("model name")) ) { + // Android reports this in a non-Linux standard "Processor" but sometimes + // also in "model name", Linux reports it only in "model name" + // see RaspberryPiZero (Linux) vs InvalidArmv7 (Android) test-cases proc_info->processor_reports_armv6 = CpuFeatures_StringView_IndexOf(value, str("(v6l)")) >= 0; } else if (CpuFeatures_StringView_IsEquals(key, str("Hardware"))) { @@ -192,22 +225,50 @@ int GetArmFeaturesEnumValue(const ArmFeatures* features, ArmFeaturesEnum value) { switch (value) { + case ARM_SWP: + return features->swp; + case ARM_HALF: + return features->half; + case ARM_THUMB: + return features->thumb; + case ARM_26BIT: + return features->_26bit; + case ARM_FASTMULT: + return features->fastmult; + case ARM_FPA: + return features->fpa; case ARM_VFP: return features->vfp; + case ARM_EDSP: + return features->edsp; + case ARM_JAVA: + return features->java; case ARM_IWMMXT: return features->iwmmxt; + case ARM_CRUNCH: + return features->crunch; + case ARM_THUMBEE: + return features->thumbee; case ARM_NEON: return features->neon; case ARM_VFPV3: return features->vfpv3; case ARM_VFPV3D16: return features->vfpv3d16; + case ARM_TLS: + return features->tls; case ARM_VFPV4: return features->vfpv4; case ARM_IDIVA: return features->idiva; case ARM_IDIVT: return features->idivt; + case ARM_VFPD32: + return features->vfpd32; + case ARM_LPAE: + return features->lpae; + case ARM_EVTSTRM: + return features->evtstrm; case ARM_AES: return features->aes; case ARM_PMULL: @@ -225,35 +286,7 @@ } const char* GetArmFeaturesEnumName(ArmFeaturesEnum value) { - switch (value) { - case ARM_VFP: - return "vfp"; - case ARM_IWMMXT: - return "iwmmxt"; - case ARM_NEON: - return "neon"; - case ARM_VFPV3: - return "vfpv3"; - case ARM_VFPV3D16: - return "vfpv3d16"; - case ARM_VFPV4: - return "vfpv4"; - case ARM_IDIVA: - return "idiva"; - case ARM_IDIVT: - return "idivt"; - case ARM_AES: - return "aes"; - case ARM_PMULL: - return "pmull"; - case ARM_SHA1: - return "sha1"; - case ARM_SHA2: - return "sha2"; - case ARM_CRC32: - return "crc32"; - case ARM_LAST_: - break; - } - return "unknown feature"; + if(value >= kConfigsSize) + return "unknown feature"; + return kConfigs[value].proc_cpuinfo_flag; } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_mips.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_mips.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_mips.c 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_mips.c 2019-07-23 21:37:18.000000000 +0000 @@ -19,14 +19,16 @@ #include "internal/string_view.h" #include "internal/unix_features_aggregator.h" +#include + DECLARE_SETTER(MipsFeatures, msa) DECLARE_SETTER(MipsFeatures, eva) DECLARE_SETTER(MipsFeatures, r6) static const CapabilityConfig kConfigs[] = { - {{MIPS_HWCAP_MSA, 0}, "msa", &set_msa}, // - {{0, 0}, "eva", &set_eva}, // - {{MIPS_HWCAP_R6, 0}, "r6", &set_r6}, // + [MIPS_MSA] = {{MIPS_HWCAP_MSA, 0}, "msa", &set_msa}, // + [MIPS_EVA] = {{0, 0}, "eva", &set_eva}, // + [MIPS_R6] = {{MIPS_HWCAP_R6, 0}, "r6", &set_r6}, // }; static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig); @@ -59,6 +61,8 @@ static const MipsInfo kEmptyMipsInfo; MipsInfo GetMipsInfo(void) { + assert(kConfigsSize == MIPS_LAST_); + // capabilities are fetched from both getauxval and /proc/cpuinfo so we can // have some information if the executable is sandboxed (aka no access to // /proc/cpuinfo). @@ -90,15 +94,7 @@ } const char* GetMipsFeaturesEnumName(MipsFeaturesEnum value) { - switch (value) { - case MIPS_MSA: - return "msa"; - case MIPS_EVA: - return "eva"; - case MIPS_R6: - return "r6"; - case MIPS_LAST_: - break; - } - return "unknown feature"; + if(value >= kConfigsSize) + return "unknown feature"; + return kConfigs[value].proc_cpuinfo_flag; } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_ppc.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_ppc.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_ppc.c 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_ppc.c 2019-07-23 21:37:18.000000000 +0000 @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include #include #include @@ -65,49 +66,49 @@ DECLARE_SETTER(PPCFeatures, htm_no_suspend) static const CapabilityConfig kConfigs[] = { - {{PPC_FEATURE_32, 0}, "ppc32", &set_ppc32}, - {{PPC_FEATURE_64, 0}, "ppc64", &set_ppc64}, - {{PPC_FEATURE_601_INSTR, 0}, "ppc601", &set_ppc601}, - {{PPC_FEATURE_HAS_ALTIVEC, 0}, "altivec", &set_altivec}, - {{PPC_FEATURE_HAS_FPU, 0}, "fpu", &set_fpu}, - {{PPC_FEATURE_HAS_MMU, 0}, "mmu", &set_mmu}, - {{PPC_FEATURE_HAS_4xxMAC, 0}, "4xxmac", &set_mac_4xx}, - {{PPC_FEATURE_UNIFIED_CACHE, 0}, "ucache", &set_unifiedcache}, - {{PPC_FEATURE_HAS_SPE, 0}, "spe", &set_spe}, - {{PPC_FEATURE_HAS_EFP_SINGLE, 0}, "efpsingle", &set_efpsingle}, - {{PPC_FEATURE_HAS_EFP_DOUBLE, 0}, "efpdouble", &set_efpdouble}, - {{PPC_FEATURE_NO_TB, 0}, "notb", &set_no_tb}, - {{PPC_FEATURE_POWER4, 0}, "power4", &set_power4}, - {{PPC_FEATURE_POWER5, 0}, "power5", &set_power5}, - {{PPC_FEATURE_POWER5_PLUS, 0}, "power5+", &set_power5plus}, - {{PPC_FEATURE_CELL, 0}, "cellbe", &set_cell}, - {{PPC_FEATURE_BOOKE, 0}, "booke", &set_booke}, - {{PPC_FEATURE_SMT, 0}, "smt", &set_smt}, - {{PPC_FEATURE_ICACHE_SNOOP, 0}, "ic_snoop", &set_icachesnoop}, - {{PPC_FEATURE_ARCH_2_05, 0}, "arch_2_05", &set_arch205}, - {{PPC_FEATURE_PA6T, 0}, "pa6t", &set_pa6t}, - {{PPC_FEATURE_HAS_DFP, 0}, "dfp", &set_dfp}, - {{PPC_FEATURE_POWER6_EXT, 0}, "power6x", &set_power6ext}, - {{PPC_FEATURE_ARCH_2_06, 0}, "arch_2_06", &set_arch206}, - {{PPC_FEATURE_HAS_VSX, 0}, "vsx", &set_vsx}, - {{PPC_FEATURE_PSERIES_PERFMON_COMPAT, 0}, + [PPC_32] = {{PPC_FEATURE_32, 0}, "ppc32", &set_ppc32}, + [PPC_64] = {{PPC_FEATURE_64, 0}, "ppc64", &set_ppc64}, + [PPC_601_INSTR] = {{PPC_FEATURE_601_INSTR, 0}, "ppc601", &set_ppc601}, + [PPC_HAS_ALTIVEC] = {{PPC_FEATURE_HAS_ALTIVEC, 0}, "altivec", &set_altivec}, + [PPC_HAS_FPU] = {{PPC_FEATURE_HAS_FPU, 0}, "fpu", &set_fpu}, + [PPC_HAS_MMU] = {{PPC_FEATURE_HAS_MMU, 0}, "mmu", &set_mmu}, + [PPC_HAS_4xxMAC] = {{PPC_FEATURE_HAS_4xxMAC, 0}, "4xxmac", &set_mac_4xx}, + [PPC_UNIFIED_CACHE] = {{PPC_FEATURE_UNIFIED_CACHE, 0}, "ucache", &set_unifiedcache}, + [PPC_HAS_SPE] = {{PPC_FEATURE_HAS_SPE, 0}, "spe", &set_spe}, + [PPC_HAS_EFP_SINGLE] = {{PPC_FEATURE_HAS_EFP_SINGLE, 0}, "efpsingle", &set_efpsingle}, + [PPC_HAS_EFP_DOUBLE] = {{PPC_FEATURE_HAS_EFP_DOUBLE, 0}, "efpdouble", &set_efpdouble}, + [PPC_NO_TB] = {{PPC_FEATURE_NO_TB, 0}, "notb", &set_no_tb}, + [PPC_POWER4] = {{PPC_FEATURE_POWER4, 0}, "power4", &set_power4}, + [PPC_POWER5] = {{PPC_FEATURE_POWER5, 0}, "power5", &set_power5}, + [PPC_POWER5_PLUS] = {{PPC_FEATURE_POWER5_PLUS, 0}, "power5+", &set_power5plus}, + [PPC_CELL] = {{PPC_FEATURE_CELL, 0}, "cellbe", &set_cell}, + [PPC_BOOKE] = {{PPC_FEATURE_BOOKE, 0}, "booke", &set_booke}, + [PPC_SMT] = {{PPC_FEATURE_SMT, 0}, "smt", &set_smt}, + [PPC_ICACHE_SNOOP] = {{PPC_FEATURE_ICACHE_SNOOP, 0}, "ic_snoop", &set_icachesnoop}, + [PPC_ARCH_2_05] = {{PPC_FEATURE_ARCH_2_05, 0}, "arch_2_05", &set_arch205}, + [PPC_PA6T] = {{PPC_FEATURE_PA6T, 0}, "pa6t", &set_pa6t}, + [PPC_HAS_DFP] = {{PPC_FEATURE_HAS_DFP, 0}, "dfp", &set_dfp}, + [PPC_POWER6_EXT] = {{PPC_FEATURE_POWER6_EXT, 0}, "power6x", &set_power6ext}, + [PPC_ARCH_2_06] = {{PPC_FEATURE_ARCH_2_06, 0}, "arch_2_06", &set_arch206}, + [PPC_HAS_VSX] = {{PPC_FEATURE_HAS_VSX, 0}, "vsx", &set_vsx}, + [PPC_PSERIES_PERFMON_COMPAT] = {{PPC_FEATURE_PSERIES_PERFMON_COMPAT, 0}, "archpmu", &set_pseries_perfmon_compat}, - {{PPC_FEATURE_TRUE_LE, 0}, "true_le", &set_truele}, - {{PPC_FEATURE_PPC_LE, 0}, "ppcle", &set_ppcle}, - {{0, PPC_FEATURE2_ARCH_2_07}, "arch_2_07", &set_arch207}, - {{0, PPC_FEATURE2_HTM}, "htm", &set_htm}, - {{0, PPC_FEATURE2_DSCR}, "dscr", &set_dscr}, - {{0, PPC_FEATURE2_EBB}, "ebb", &set_ebb}, - {{0, PPC_FEATURE2_ISEL}, "isel", &set_isel}, - {{0, PPC_FEATURE2_TAR}, "tar", &set_tar}, - {{0, PPC_FEATURE2_VEC_CRYPTO}, "vcrypto", &set_vcrypto}, - {{0, PPC_FEATURE2_HTM_NOSC}, "htm-nosc", &set_htm_nosc}, - {{0, PPC_FEATURE2_ARCH_3_00}, "arch_3_00", &set_arch300}, - {{0, PPC_FEATURE2_HAS_IEEE128}, "ieee128", &set_ieee128}, - {{0, PPC_FEATURE2_DARN}, "darn", &set_darn}, - {{0, PPC_FEATURE2_SCV}, "scv", &set_scv}, - {{0, PPC_FEATURE2_HTM_NO_SUSPEND}, "htm-no-suspend", &set_htm_no_suspend}, + [PPC_TRUE_LE] = {{PPC_FEATURE_TRUE_LE, 0}, "true_le", &set_truele}, + [PPC_PPC_LE] = {{PPC_FEATURE_PPC_LE, 0}, "ppcle", &set_ppcle}, + [PPC_ARCH_2_07] = {{0, PPC_FEATURE2_ARCH_2_07}, "arch_2_07", &set_arch207}, + [PPC_HTM] = {{0, PPC_FEATURE2_HTM}, "htm", &set_htm}, + [PPC_DSCR] = {{0, PPC_FEATURE2_DSCR}, "dscr", &set_dscr}, + [PPC_EBB] = {{0, PPC_FEATURE2_EBB}, "ebb", &set_ebb}, + [PPC_ISEL] = {{0, PPC_FEATURE2_ISEL}, "isel", &set_isel}, + [PPC_TAR] = {{0, PPC_FEATURE2_TAR}, "tar", &set_tar}, + [PPC_VEC_CRYPTO] = {{0, PPC_FEATURE2_VEC_CRYPTO}, "vcrypto", &set_vcrypto}, + [PPC_HTM_NOSC] = {{0, PPC_FEATURE2_HTM_NOSC}, "htm-nosc", &set_htm_nosc}, + [PPC_ARCH_3_00] = {{0, PPC_FEATURE2_ARCH_3_00}, "arch_3_00", &set_arch300}, + [PPC_HAS_IEEE128] = {{0, PPC_FEATURE2_HAS_IEEE128}, "ieee128", &set_ieee128}, + [PPC_DARN] = {{0, PPC_FEATURE2_DARN}, "darn", &set_darn}, + [PPC_SCV] = {{0, PPC_FEATURE2_SCV}, "scv", &set_scv}, + [PPC_HTM_NO_SUSPEND] = {{0, PPC_FEATURE2_HTM_NO_SUSPEND}, "htm-no-suspend", &set_htm_no_suspend}, }; static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig); @@ -268,91 +269,7 @@ /* Have used the same names as glibc */ const char* GetPPCFeaturesEnumName(PPCFeaturesEnum value) { - switch (value) { - case PPC_32: - return "ppc32"; - case PPC_64: - return "ppc64"; - case PPC_601_INSTR: - return "ppc601"; - case PPC_HAS_ALTIVEC: - return "altivec"; - case PPC_HAS_FPU: - return "fpu"; - case PPC_HAS_MMU: - return "mmu"; - case PPC_HAS_4xxMAC: - return "4xxmac"; - case PPC_UNIFIED_CACHE: - return "ucache"; - case PPC_HAS_SPE: - return "spe"; - case PPC_HAS_EFP_SINGLE: - return "efpsingle"; - case PPC_HAS_EFP_DOUBLE: - return "efpdouble"; - case PPC_NO_TB: - return "notb"; - case PPC_POWER4: - return "power4"; - case PPC_POWER5: - return "power5"; - case PPC_POWER5_PLUS: - return "power5+"; - case PPC_CELL: - return "cellbe"; - case PPC_BOOKE: - return "booke"; - case PPC_SMT: - return "smt"; - case PPC_ICACHE_SNOOP: - return "ic_snoop"; - case PPC_ARCH_2_05: - return "arch_2_05"; - case PPC_PA6T: - return "pa6t"; - case PPC_HAS_DFP: - return "dfp"; - case PPC_POWER6_EXT: - return "power6x"; - case PPC_ARCH_2_06: - return "arch_2_06"; - case PPC_HAS_VSX: - return "vsx"; - case PPC_PSERIES_PERFMON_COMPAT: - return "archpmu"; - case PPC_TRUE_LE: - return "true_le"; - case PPC_PPC_LE: - return "ppcle"; - case PPC_ARCH_2_07: - return "arch_2_07"; - case PPC_HTM: - return "htm"; - case PPC_DSCR: - return "dscr"; - case PPC_EBB: - return "ebb"; - case PPC_ISEL: - return "isel"; - case PPC_TAR: - return "tar"; - case PPC_VEC_CRYPTO: - return "vcrypto"; - case PPC_HTM_NOSC: - return "htm-nosc"; - case PPC_ARCH_3_00: - return "arch_3_00"; - case PPC_HAS_IEEE128: - return "ieee128"; - case PPC_DARN: - return "darn"; - case PPC_SCV: - return "scv"; - case PPC_HTM_NO_SUSPEND: - return "htm-no-suspend"; - case PPC_LAST_: - break; - } - return "unknown_feature"; + if(value >= kConfigsSize) + return "unknown feature"; + return kConfigs[value].proc_cpuinfo_flag; } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_x86.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_x86.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_x86.c 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/cpuinfo_x86.c 2019-07-23 21:37:18.000000000 +0000 @@ -33,9 +33,9 @@ #include -Leaf CpuId(uint32_t leaf_id) { +Leaf CpuIdEx(uint32_t leaf_id, int ecx) { Leaf leaf; - __cpuid_count(leaf_id, 0, leaf.eax, leaf.ebx, leaf.ecx, leaf.edx); + __cpuid_count(leaf_id, ecx, leaf.eax, leaf.ebx, leaf.ecx, leaf.edx); return leaf; } @@ -53,10 +53,10 @@ #include #include // For __cpuidex() -Leaf CpuId(uint32_t leaf_id) { +Leaf CpuIdEx(uint32_t leaf_id, int ecx) { Leaf leaf; int data[4]; - __cpuid(data, leaf_id); + __cpuidex(data, leaf_id, ecx); leaf.eax = data[0]; leaf.ebx = data[1]; leaf.ecx = data[2]; @@ -64,22 +64,28 @@ return leaf; } -uint32_t GetXCR0Eax(void) { return _xgetbv(0); } +uint32_t GetXCR0Eax(void) { return (uint32_t)_xgetbv(0); } #else #error "Unsupported compiler, x86 cpuid requires either GCC, Clang or MSVC." #endif +static Leaf CpuId(uint32_t leaf_id) { return CpuIdEx(leaf_id, 0); } + static const Leaf kEmptyLeaf; -static Leaf SafeCpuId(uint32_t max_cpuid_leaf, uint32_t leaf_id) { +static Leaf SafeCpuIdEx(uint32_t max_cpuid_leaf, uint32_t leaf_id, int ecx) { if (leaf_id <= max_cpuid_leaf) { - return CpuId(leaf_id); + return CpuIdEx(leaf_id, ecx); } else { return kEmptyLeaf; } } +static Leaf SafeCpuId(uint32_t max_cpuid_leaf, uint32_t leaf_id) { + return SafeCpuIdEx(max_cpuid_leaf, leaf_id, 0); +} + #define MASK_XMM 0x2 #define MASK_YMM 0x4 #define MASK_MASKREG 0x20 @@ -123,6 +129,397 @@ return leaf.ebx == ebx && leaf.ecx == ecx && leaf.edx == edx; } +static const CacheLevelInfo kEmptyCacheLevelInfo; + +static CacheLevelInfo MakeX86CacheLevelInfo(int level, CacheType cache_type, + int cache_size, int ways, + int line_size, int entries, + int partitioning) { + CacheLevelInfo info; + info.level = level; + info.cache_type = cache_type; + info.cache_size = cache_size; + info.ways = ways; + info.line_size = line_size; + info.tlb_entries = entries; + info.partitioning = partitioning; + return info; +} + +static CacheLevelInfo GetCacheLevelInfo(const uint32_t reg) { + const int UNDEF = -1; + const int KiB = 1024; + const int MiB = 1024 * KiB; + const int GiB = 1024 * MiB; + switch (reg) { + case 0x01: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 32, 0); + case 0x02: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * MiB, 0xFF, + UNDEF, 2, 0); + case 0x03: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 64, 0); + case 0x04: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * MiB, 4, + UNDEF, 8, 0); + case 0x05: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * MiB, 4, + UNDEF, 32, 0); + case 0x06: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_INSTRUCTION, 8 * KiB, 4, + 32, UNDEF, 0); + case 0x08: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_INSTRUCTION, 16 * KiB, + 4, 32, UNDEF, 0); + case 0x09: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_INSTRUCTION, 32 * KiB, + 4, 64, UNDEF, 0); + case 0x0A: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 8 * KiB, 2, 32, + UNDEF, 0); + case 0x0B: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * MiB, 4, + UNDEF, 4, 0); + case 0x0C: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 16 * KiB, 4, 32, + UNDEF, 0); + case 0x0D: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 16 * KiB, 4, 64, + UNDEF, 0); + case 0x0E: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 24 * KiB, 6, 64, + UNDEF, 0); + case 0x1D: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 128 * KiB, 2, 64, + UNDEF, 0); + case 0x21: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 256 * KiB, 8, 64, + UNDEF, 0); + case 0x22: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 512 * KiB, 4, 64, + UNDEF, 2); + case 0x23: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 1 * MiB, 8, 64, + UNDEF, 2); + case 0x24: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 1 * MiB, 16, 64, + UNDEF, 0); + case 0x25: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 2 * MiB, 8, 64, + UNDEF, 2); + case 0x29: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 4 * MiB, 8, 64, + UNDEF, 2); + case 0x2C: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 32 * KiB, 8, 64, + UNDEF, 0); + case 0x30: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_INSTRUCTION, 32 * KiB, + 8, 64, UNDEF, 0); + case 0x40: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_DATA, UNDEF, UNDEF, + UNDEF, UNDEF, 0); + case 0x41: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 128 * KiB, 4, 32, + UNDEF, 0); + case 0x42: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 256 * KiB, 4, 32, + UNDEF, 0); + case 0x43: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 512 * KiB, 4, 32, + UNDEF, 0); + case 0x44: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 1 * MiB, 4, 32, + UNDEF, 0); + case 0x45: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 2 * MiB, 4, 32, + UNDEF, 0); + case 0x46: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 4 * MiB, 4, 64, + UNDEF, 0); + case 0x47: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 8 * MiB, 8, 64, + UNDEF, 0); + case 0x48: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 3 * MiB, 12, 64, + UNDEF, 0); + case 0x49: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 4 * MiB, 16, 64, + UNDEF, 0); + case (0x49 | (1 << 8)): + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 4 * MiB, 16, 64, + UNDEF, 0); + case 0x4A: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 6 * MiB, 12, 64, + UNDEF, 0); + case 0x4B: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 8 * MiB, 16, 64, + UNDEF, 0); + case 0x4C: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 12 * MiB, 12, 64, + UNDEF, 0); + case 0x4D: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 16 * MiB, 16, 64, + UNDEF, 0); + case 0x4E: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 6 * MiB, 24, 64, + UNDEF, 0); + case 0x4F: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, UNDEF, + UNDEF, 32, 0); + case 0x50: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, UNDEF, + UNDEF, 64, 0); + case 0x51: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, UNDEF, + UNDEF, 128, 0); + case 0x52: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, UNDEF, + UNDEF, 256, 0); + case 0x55: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 2 * MiB, 0xFF, + UNDEF, 7, 0); + case 0x56: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * MiB, 4, + UNDEF, 16, 0); + case 0x57: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 16, 0); + case 0x59: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 0xFF, + UNDEF, 16, 0); + case 0x5A: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 2 * MiB, 4, + UNDEF, 32, 0); + case 0x5B: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, UNDEF, + UNDEF, 64, 0); + case 0x5C: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, UNDEF, + UNDEF, 128, 0); + case 0x5D: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4, UNDEF, + UNDEF, 256, 0); + case 0x60: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 16 * KiB, 8, 64, + UNDEF, 0); + case 0x61: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 0xFF, + UNDEF, 48, 0); + case 0x63: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 2 * MiB, 4, + UNDEF, 4, 0); + case 0x66: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 8 * KiB, 4, 64, + UNDEF, 0); + case 0x67: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 16 * KiB, 4, 64, + UNDEF, 0); + case 0x68: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_DATA, 32 * KiB, 4, 64, + UNDEF, 0); + case 0x70: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_INSTRUCTION, 12 * KiB, + 8, UNDEF, UNDEF, 0); + case 0x71: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_INSTRUCTION, 16 * KiB, + 8, UNDEF, UNDEF, 0); + case 0x72: + return MakeX86CacheLevelInfo(1, CPU_FEATURE_CACHE_INSTRUCTION, 32 * KiB, + 8, UNDEF, UNDEF, 0); + case 0x76: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 2 * MiB, 0xFF, + UNDEF, 8, 0); + case 0x78: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 1 * MiB, 4, 64, + UNDEF, 0); + case 0x79: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 128 * KiB, 8, 64, + UNDEF, 2); + case 0x7A: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 256 * KiB, 8, 64, + UNDEF, 2); + case 0x7B: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 512 * KiB, 8, 64, + UNDEF, 2); + case 0x7C: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 1 * MiB, 8, 64, + UNDEF, 2); + case 0x7D: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 2 * MiB, 8, 64, + UNDEF, 0); + case 0x7F: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 512 * KiB, 2, 64, + UNDEF, 0); + case 0x80: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 512 * KiB, 8, 64, + UNDEF, 0); + case 0x82: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 256 * KiB, 8, 32, + UNDEF, 0); + case 0x83: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 512 * KiB, 8, 32, + UNDEF, 0); + case 0x84: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 1 * MiB, 8, 32, + UNDEF, 0); + case 0x85: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 2 * MiB, 8, 32, + UNDEF, 0); + case 0x86: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 512 * KiB, 4, 32, + UNDEF, 0); + case 0x87: + return MakeX86CacheLevelInfo(2, CPU_FEATURE_CACHE_DATA, 1 * MiB, 8, 64, + UNDEF, 0); + case 0xA0: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_DTLB, 4 * KiB, 0xFF, + UNDEF, 32, 0); + case 0xB0: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 128, 0); + case 0xB1: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 2 * MiB, 4, + UNDEF, 8, 0); + case 0xB2: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 64, 0); + case 0xB3: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 128, 0); + case 0xB4: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 256, 0); + case 0xB5: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 8, + UNDEF, 64, 0); + case 0xB6: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 8, + UNDEF, 128, 0); + case 0xBA: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 64, 0); + case 0xC0: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_TLB, 4 * KiB, 4, + UNDEF, 8, 0); + case 0xC1: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_STLB, 4 * KiB, 8, + UNDEF, 1024, 0); + case 0xC2: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_DTLB, 4 * KiB, 4, + UNDEF, 16, 0); + case 0xC3: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_STLB, 4 * KiB, 6, + UNDEF, 1536, 0); + case 0xCA: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_STLB, 4 * KiB, 4, + UNDEF, 512, 0); + case 0xD0: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 512 * KiB, 4, 64, + UNDEF, 0); + case 0xD1: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 1 * MiB, 4, 64, + UNDEF, 0); + case 0xD2: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 2 * MiB, 4, 64, + UNDEF, 0); + case 0xD6: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 1 * MiB, 8, 64, + UNDEF, 0); + case 0xD7: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 2 * MiB, 8, 64, + UNDEF, 0); + case 0xD8: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 4 * MiB, 8, 64, + UNDEF, 0); + case 0xDC: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 1 * 1536 * KiB, + 12, 64, UNDEF, 0); + case 0xDD: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 3 * MiB, 12, 64, + UNDEF, 0); + case 0xDE: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 6 * MiB, 12, 64, + UNDEF, 0); + case 0xE2: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 2 * MiB, 16, 64, + UNDEF, 0); + case 0xE3: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 4 * MiB, 16, 64, + UNDEF, 0); + case 0xE4: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 8 * MiB, 16, 64, + UNDEF, 0); + case 0xEA: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 12 * MiB, 24, 64, + UNDEF, 0); + case 0xEB: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 18 * MiB, 24, 64, + UNDEF, 0); + case 0xEC: + return MakeX86CacheLevelInfo(3, CPU_FEATURE_CACHE_DATA, 24 * MiB, 24, 64, + UNDEF, 0); + case 0xF0: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_PREFETCH, 64 * KiB, + UNDEF, UNDEF, UNDEF, 0); + case 0xF1: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_PREFETCH, 128 * KiB, + UNDEF, UNDEF, UNDEF, 0); + case 0xFF: + return MakeX86CacheLevelInfo(UNDEF, CPU_FEATURE_CACHE_NULL, UNDEF, UNDEF, + UNDEF, UNDEF, 0); + default: + return kEmptyCacheLevelInfo; + } +} + +static void GetByteArrayFromRegister(uint32_t result[4], const uint32_t reg) { + for (int i = 0; i < 4; ++i) { + result[i] = ExtractBitRange(reg, (i + 1) * 8, i * 8); + } +} + +static void ParseLeaf2(const int max_cpuid_leaf, CacheInfo* info) { + Leaf leaf = SafeCpuId(max_cpuid_leaf, 2); + uint32_t registers[] = {leaf.eax, leaf.ebx, leaf.ecx, leaf.edx}; + for (int i = 0; i < 4; ++i) { + if (registers[i] & (1 << 31)) { + continue; // register does not contains valid information + } + uint32_t bytes[4]; + GetByteArrayFromRegister(bytes, registers[i]); + for (int i = 0; i < 4; ++i) { + if (bytes[i] == 0xFF) + break; // leaf 4 should be used to fetch cache information + info->levels[info->size] = GetCacheLevelInfo(bytes[i]); + } + info->size++; + } +} + +static void ParseLeaf4(const int max_cpuid_leaf, CacheInfo* info) { + info->size = 0; + for (int cache_id = 0; cache_id < CPU_FEATURES_MAX_CACHE_LEVEL; cache_id++) { + const Leaf leaf = SafeCpuIdEx(max_cpuid_leaf, 4, cache_id); + CacheType cache_type = ExtractBitRange(leaf.eax, 4, 0); + if (cache_type == CPU_FEATURE_CACHE_NULL) { + info->levels[cache_id] = kEmptyCacheLevelInfo; + continue; + } + int level = ExtractBitRange(leaf.eax, 7, 5); + int line_size = ExtractBitRange(leaf.ebx, 11, 0) + 1; + int partitioning = ExtractBitRange(leaf.ebx, 21, 12) + 1; + int ways = ExtractBitRange(leaf.ebx, 31, 22) + 1; + int entries = leaf.ecx + 1; + int cache_size = (ways * partitioning * line_size * (entries)); + info->levels[cache_id] = MakeX86CacheLevelInfo( + level, cache_type, cache_size, ways, line_size, entries, partitioning); + info->size++; + } +} + // Reference https://en.wikipedia.org/wiki/CPUID. static void ParseCpuId(const uint32_t max_cpuid_leaf, X86Info* info) { const Leaf leaf_1 = SafeCpuId(max_cpuid_leaf, 1); @@ -146,8 +543,16 @@ info->model = (extended_model << 4) + model; info->stepping = ExtractBitRange(leaf_1.eax, 3, 0); + features->fpu = IsBitSet(leaf_1.edx, 0); + features->tsc = IsBitSet(leaf_1.edx, 4); + features->cx8 = IsBitSet(leaf_1.edx, 8); + features->clfsh = IsBitSet(leaf_1.edx, 19); + features->mmx = IsBitSet(leaf_1.edx, 23); + features->ss = IsBitSet(leaf_1.edx, 27); + features->pclmulqdq = IsBitSet(leaf_1.ecx, 1); features->smx = IsBitSet(leaf_1.ecx, 6); features->cx16 = IsBitSet(leaf_1.ecx, 13); + features->dca = IsBitSet(leaf_1.ecx, 18); features->movbe = IsBitSet(leaf_1.ecx, 22); features->popcnt = IsBitSet(leaf_1.ecx, 23); features->aes = IsBitSet(leaf_1.ecx, 25); @@ -155,12 +560,21 @@ features->rdrnd = IsBitSet(leaf_1.ecx, 30); features->sgx = IsBitSet(leaf_7.ebx, 2); features->bmi1 = IsBitSet(leaf_7.ebx, 3); + features->hle = IsBitSet(leaf_7.ebx, 4); features->bmi2 = IsBitSet(leaf_7.ebx, 8); features->erms = IsBitSet(leaf_7.ebx, 9); + features->rtm = IsBitSet(leaf_7.ebx, 11); + features->rdseed = IsBitSet(leaf_7.ebx, 18); + features->clflushopt = IsBitSet(leaf_7.ebx, 23); + features->clwb = IsBitSet(leaf_7.ebx, 24); features->sha = IsBitSet(leaf_7.ebx, 29); + features->vaes = IsBitSet(leaf_7.ecx, 9); features->vpclmulqdq = IsBitSet(leaf_7.ecx, 10); if (have_sse_os_support) { + features->sse = IsBitSet(leaf_1.edx, 25); + features->sse2 = IsBitSet(leaf_1.edx, 26); + features->sse3 = IsBitSet(leaf_1.ecx, 0); features->ssse3 = IsBitSet(leaf_1.ecx, 9); features->sse4_1 = IsBitSet(leaf_1.ecx, 19); features->sse4_2 = IsBitSet(leaf_1.ecx, 20); @@ -192,6 +606,7 @@ } static const X86Info kEmptyX86Info; +static const CacheInfo kEmptyCacheInfo; X86Info GetX86Info(void) { X86Info info = kEmptyX86Info; @@ -204,6 +619,17 @@ return info; } +CacheInfo GetX86CacheInfo(void) { + CacheInfo info = kEmptyCacheInfo; + const Leaf leaf_0 = CpuId(0); + const uint32_t max_cpuid_leaf = leaf_0.eax; + if (IsVendor(leaf_0, "GenuineIntel")) { + ParseLeaf2(max_cpuid_leaf, &info); + ParseLeaf4(max_cpuid_leaf, &info); + } + return info; +} + #define CPUID(FAMILY, MODEL) ((((FAMILY)&0xFF) << 8) | ((MODEL)&0xFF)) X86Microarchitecture GetX86Microarchitecture(const X86Info* info) { @@ -317,6 +743,16 @@ int GetX86FeaturesEnumValue(const X86Features* features, X86FeaturesEnum value) { switch (value) { + case X86_FPU: + return features->fpu; + case X86_TSC: + return features->tsc; + case X86_CX8: + return features->cx8; + case X86_CLFSH: + return features->clfsh; + case X86_MMX: + return features->mmx; case X86_AES: return features->aes; case X86_ERMS: @@ -325,12 +761,30 @@ return features->f16c; case X86_FMA3: return features->fma3; + case X86_VAES: + return features->vaes; case X86_VPCLMULQDQ: return features->vpclmulqdq; case X86_BMI1: return features->bmi1; + case X86_HLE: + return features->hle; case X86_BMI2: return features->bmi2; + case X86_RTM: + return features->rtm; + case X86_RDSEED: + return features->rdseed; + case X86_CLFLUSHOPT: + return features->clflushopt; + case X86_CLWB: + return features->clwb; + case X86_SSE: + return features->sse; + case X86_SSE2: + return features->sse2; + case X86_SSE3: + return features->sse3; case X86_SSSE3: return features->ssse3; case X86_SSE4_1: @@ -371,6 +825,8 @@ return features->avx512_4vnniw; case X86_AVX512_4VBMI2: return features->avx512_4vbmi2; + case X86_PCLMULQDQ: + return features->pclmulqdq; case X86_SMX: return features->smx; case X86_SGX: @@ -385,6 +841,10 @@ return features->movbe; case X86_RDRND: return features->rdrnd; + case X86_DCA: + return features->dca; + case X86_SS: + return features->ss; case X86_LAST_: break; } @@ -393,6 +853,16 @@ const char* GetX86FeaturesEnumName(X86FeaturesEnum value) { switch (value) { + case X86_FPU: + return "fpu"; + case X86_TSC: + return "tsc"; + case X86_CX8: + return "cx8"; + case X86_CLFSH: + return "clfsh"; + case X86_MMX: + return "mmx"; case X86_AES: return "aes"; case X86_ERMS: @@ -401,12 +871,30 @@ return "f16c"; case X86_FMA3: return "fma3"; + case X86_VAES: + return "vaes"; case X86_VPCLMULQDQ: return "vpclmulqdq"; case X86_BMI1: return "bmi1"; + case X86_HLE: + return "hle"; case X86_BMI2: return "bmi2"; + case X86_RTM: + return "rtm"; + case X86_RDSEED: + return "rdseed"; + case X86_CLFLUSHOPT: + return "clflushopt"; + case X86_CLWB: + return "clwb"; + case X86_SSE: + return "sse"; + case X86_SSE2: + return "sse2"; + case X86_SSE3: + return "sse3"; case X86_SSSE3: return "ssse3"; case X86_SSE4_1: @@ -447,6 +935,8 @@ return "avx512_4vnniw"; case X86_AVX512_4VBMI2: return "avx512_4vbmi2"; + case X86_PCLMULQDQ: + return "pclmulqdq"; case X86_SMX: return "smx"; case X86_SGX: @@ -461,6 +951,10 @@ return "movbe"; case X86_RDRND: return "rdrnd"; + case X86_DCA: + return "dca"; + case X86_SS: + return "ss"; case X86_LAST_: break; } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/filesystem.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/filesystem.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/filesystem.c 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/filesystem.c 2019-07-23 21:37:18.000000000 +0000 @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -24,14 +25,16 @@ #elif defined(_MSC_VER) #include int CpuFeatures_OpenFile(const char* filename) { - return _open(filename, _O_RDONLY); + int fd = -1; + _sopen_s(&fd, filename, _O_RDONLY, _SH_DENYWR, _S_IREAD); + return fd; } void CpuFeatures_CloseFile(int file_descriptor) { _close(file_descriptor); } int CpuFeatures_ReadFile(int file_descriptor, void* buffer, size_t buffer_size) { - return _read(file_descriptor, buffer, buffer_size); + return _read(file_descriptor, buffer, (unsigned int)buffer_size); } #else diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/string_view.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/string_view.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/string_view.c 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/string_view.c 2019-07-23 21:37:18.000000000 +0000 @@ -22,7 +22,7 @@ if (view.ptr && view.size) { const char* const found = (const char*)memchr(view.ptr, c, view.size); if (found) { - return found - view.ptr; + return (int)(found - view.ptr); } } return -1; @@ -38,7 +38,7 @@ if (found_index < 0) break; remainder = CpuFeatures_StringView_PopFront(remainder, found_index); if (CpuFeatures_StringView_StartsWith(remainder, sub_view)) { - return remainder.ptr - view.ptr; + return (int)(remainder.ptr - view.ptr); } remainder = CpuFeatures_StringView_PopFront(remainder, 1); } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/utils/list_cpu_features.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/utils/list_cpu_features.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/utils/list_cpu_features.c 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/src/utils/list_cpu_features.c 2019-07-23 21:37:18.000000000 +0000 @@ -136,7 +136,7 @@ ++count; \ } \ } \ - qsort(ptrs, count, sizeof(char*), cmp); \ + qsort((void*)ptrs, count, sizeof(char*), cmp); \ p.StartField("flags"); \ p.ArrayStart(); \ for (i = 0; i < count; ++i) { \ diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/bit_utils_test.cc softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/bit_utils_test.cc --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/bit_utils_test.cc 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/bit_utils_test.cc 2019-07-23 21:37:18.000000000 +0000 @@ -22,18 +22,18 @@ TEST(UtilsTest, IsBitSet) { for (size_t bit_set = 0; bit_set < 32; ++bit_set) { const uint32_t value = 1UL << bit_set; - for (size_t i = 0; i < 32; ++i) { + for (uint32_t i = 0; i < 32; ++i) { EXPECT_EQ(IsBitSet(value, i), i == bit_set); } } // testing 0, all bits should be 0. - for (size_t i = 0; i < 32; ++i) { + for (uint32_t i = 0; i < 32; ++i) { EXPECT_FALSE(IsBitSet(0, i)); } // testing ~0, all bits should be 1. - for (size_t i = 0; i < 32; ++i) { + for (uint32_t i = 0; i < 32; ++i) { EXPECT_TRUE(IsBitSet(-1, i)); } } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/cpuinfo_arm_test.cc softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/cpuinfo_arm_test.cc --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/cpuinfo_arm_test.cc 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/cpuinfo_arm_test.cc 2019-07-23 21:37:18.000000000 +0000 @@ -35,6 +35,8 @@ EXPECT_FALSE(info.features.vfpv4); EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); EXPECT_FALSE(info.features.vfpv3d16); EXPECT_FALSE(info.features.idiva); EXPECT_FALSE(info.features.idivt); @@ -62,14 +64,28 @@ EXPECT_EQ(info.revision, 3); EXPECT_EQ(info.architecture, 7); + EXPECT_FALSE(info.features.swp); + EXPECT_TRUE(info.features.half); + EXPECT_TRUE(info.features.thumb); + EXPECT_FALSE(info.features._26bit); + EXPECT_TRUE(info.features.fastmult); + EXPECT_FALSE(info.features.fpa); EXPECT_TRUE(info.features.vfp); + EXPECT_TRUE(info.features.edsp); + EXPECT_FALSE(info.features.java); EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); EXPECT_TRUE(info.features.neon); EXPECT_TRUE(info.features.vfpv3); EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_TRUE(info.features.tls); EXPECT_TRUE(info.features.vfpv4); EXPECT_TRUE(info.features.idiva); EXPECT_TRUE(info.features.idivt); + EXPECT_TRUE(info.features.vfpd32); + EXPECT_TRUE(info.features.lpae); + EXPECT_FALSE(info.features.evtstrm); EXPECT_FALSE(info.features.aes); EXPECT_FALSE(info.features.pmull); EXPECT_FALSE(info.features.sha1); @@ -77,6 +93,122 @@ EXPECT_FALSE(info.features.crc32); } +// Linux test-case +TEST(CpuinfoArmTest, RaspberryPiZeroFromCpuInfo) { + DisableHardwareCapabilities(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(processor : 0 +model name : ARMv6-compatible processor rev 7 (v6l) +BogoMIPS : 697.95 +Features : half thumb fastmult vfp edsp java tls +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x0 +CPU part : 0xb76 +CPU revision : 7 + +Hardware : BCM2835 +Revision : 9000c1 +Serial : 000000006cd946f3)"); + const auto info = GetArmInfo(); + EXPECT_EQ(info.implementer, 0x41); + EXPECT_EQ(info.variant, 0x0); + EXPECT_EQ(info.part, 0xb76); + EXPECT_EQ(info.revision, 7); + EXPECT_EQ(info.architecture, 6); + + EXPECT_FALSE(info.features.swp); + EXPECT_TRUE(info.features.half); + EXPECT_TRUE(info.features.thumb); + EXPECT_FALSE(info.features._26bit); + EXPECT_TRUE(info.features.fastmult); + EXPECT_FALSE(info.features.fpa); + EXPECT_TRUE(info.features.vfp); + EXPECT_TRUE(info.features.edsp); + EXPECT_TRUE(info.features.java); + EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); + EXPECT_FALSE(info.features.neon); + EXPECT_FALSE(info.features.vfpv3); + EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_TRUE(info.features.tls); + EXPECT_FALSE(info.features.vfpv4); + EXPECT_FALSE(info.features.idiva); + EXPECT_FALSE(info.features.idivt); + EXPECT_FALSE(info.features.vfpd32); + EXPECT_FALSE(info.features.lpae); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.crc32); +} + +TEST(CpuinfoArmTest, MarvellArmadaFromCpuInfo) { + DisableHardwareCapabilities(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(processor : 0 +model name : ARMv7 Processor rev 1 (v7l) +BogoMIPS : 50.00 +Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32 +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x4 +CPU part : 0xc09 +CPU revision : 1 + +processor : 1 +model name : ARMv7 Processor rev 1 (v7l) +BogoMIPS : 50.00 +Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32 +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x4 +CPU part : 0xc09 +CPU revision : 1 + +Hardware : Marvell Armada 380/385 (Device Tree) +Revision : 0000 +Serial : 0000000000000000)"); + const auto info = GetArmInfo(); + EXPECT_EQ(info.implementer, 0x41); + EXPECT_EQ(info.variant, 0x4); + EXPECT_EQ(info.part, 0xc09); + EXPECT_EQ(info.revision, 1); + EXPECT_EQ(info.architecture, 7); + + EXPECT_FALSE(info.features.swp); + EXPECT_TRUE(info.features.half); + EXPECT_TRUE(info.features.thumb); + EXPECT_FALSE(info.features._26bit); + EXPECT_TRUE(info.features.fastmult); + EXPECT_FALSE(info.features.fpa); + EXPECT_TRUE(info.features.vfp); + EXPECT_TRUE(info.features.edsp); + EXPECT_FALSE(info.features.java); + EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); + EXPECT_TRUE(info.features.neon); + EXPECT_TRUE(info.features.vfpv3); + EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_TRUE(info.features.tls); + EXPECT_FALSE(info.features.vfpv4); + EXPECT_FALSE(info.features.idiva); + EXPECT_FALSE(info.features.idivt); + EXPECT_TRUE(info.features.vfpd32); + EXPECT_FALSE(info.features.lpae); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.crc32); +} + +// Android test-case // http://code.google.com/p/android/issues/detail?id=10812 TEST(CpuinfoArmTest, InvalidArmv7) { DisableHardwareCapabilities(); @@ -96,8 +228,37 @@ Serial : 33323613546d00ec )"); const auto info = GetArmInfo(); EXPECT_EQ(info.architecture, 6); + + EXPECT_TRUE(info.features.swp); + EXPECT_TRUE(info.features.half); + EXPECT_TRUE(info.features.thumb); + EXPECT_FALSE(info.features._26bit); + EXPECT_TRUE(info.features.fastmult); + EXPECT_FALSE(info.features.fpa); + EXPECT_TRUE(info.features.vfp); + EXPECT_TRUE(info.features.edsp); + EXPECT_TRUE(info.features.java); + EXPECT_FALSE(info.features.iwmmxt); + EXPECT_FALSE(info.features.crunch); + EXPECT_FALSE(info.features.thumbee); + EXPECT_FALSE(info.features.neon); + EXPECT_FALSE(info.features.vfpv3); + EXPECT_FALSE(info.features.vfpv3d16); + EXPECT_FALSE(info.features.tls); + EXPECT_FALSE(info.features.vfpv4); + EXPECT_FALSE(info.features.idiva); + EXPECT_FALSE(info.features.idivt); + EXPECT_FALSE(info.features.vfpd32); + EXPECT_FALSE(info.features.lpae); + EXPECT_FALSE(info.features.evtstrm); + EXPECT_FALSE(info.features.aes); + EXPECT_FALSE(info.features.pmull); + EXPECT_FALSE(info.features.sha1); + EXPECT_FALSE(info.features.sha2); + EXPECT_FALSE(info.features.crc32); } +// Android test-case // https://crbug.com/341598. TEST(CpuinfoArmTest, InvalidNeon) { auto& fs = GetEmptyFilesystem(); @@ -120,6 +281,7 @@ Revision: 0010 Serial: 00001e030000354e)"); const auto info = GetArmInfo(); + EXPECT_TRUE(info.features.swp); EXPECT_FALSE(info.features.neon); } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/cpuinfo_x86_test.cc softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/cpuinfo_x86_test.cc --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/cpuinfo_x86_test.cc 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/cpuinfo_x86_test.cc 2019-07-23 21:37:18.000000000 +0000 @@ -25,15 +25,17 @@ class FakeCpu { public: - Leaf CpuId(uint32_t leaf_id) const { - const auto itr = cpuid_leaves_.find(leaf_id); - EXPECT_TRUE(itr != cpuid_leaves_.end()) << "Missing leaf " << leaf_id; - return itr->second; + Leaf CpuIdEx(uint32_t leaf_id, int ecx) const { + const auto itr = cpuid_leaves_.find(std::make_pair(leaf_id, ecx)); + if (itr != cpuid_leaves_.end()) { + return itr->second; + } + return {0, 0, 0, 0}; } uint32_t GetXCR0Eax() const { return xcr0_eax_; } - void SetLeaves(std::map configuration) { + void SetLeaves(std::map, Leaf> configuration) { cpuid_leaves_ = std::move(configuration); } @@ -42,13 +44,16 @@ } private: - std::map cpuid_leaves_; + std::map, Leaf> cpuid_leaves_; uint32_t xcr0_eax_; }; auto* g_fake_cpu = new FakeCpu(); -extern "C" Leaf CpuId(uint32_t leaf_id) { return g_fake_cpu->CpuId(leaf_id); } +extern "C" Leaf CpuIdEx(uint32_t leaf_id, int ecx) { + return g_fake_cpu->CpuIdEx(leaf_id, ecx); +} + extern "C" uint32_t GetXCR0Eax(void) { return g_fake_cpu->GetXCR0Eax(); } namespace { @@ -56,9 +61,9 @@ TEST(CpuidX86Test, SandyBridge) { g_fake_cpu->SetOsBackupsExtendedRegisters(true); g_fake_cpu->SetLeaves({ - {0x00000000, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}}, - {0x00000001, Leaf{0x000206A6, 0x00100800, 0x1F9AE3BF, 0xBFEBFBFF}}, - {0x00000007, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000000, 0}, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000206A6, 0x00100800, 0x1F9AE3BF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, }); const auto info = GetX86Info(); EXPECT_STREQ(info.vendor, "GenuineIntel"); @@ -96,11 +101,14 @@ EXPECT_FALSE(features.rdrnd); } +const int KiB = 1024; +const int MiB = 1024 * KiB; + TEST(CpuidX86Test, SandyBridgeTestOsSupport) { g_fake_cpu->SetLeaves({ - {0x00000000, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}}, - {0x00000001, Leaf{0x000206A6, 0x00100800, 0x1F9AE3BF, 0xBFEBFBFF}}, - {0x00000007, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x00000000, 0}, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000206A6, 0x00100800, 0x1F9AE3BF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, }); // avx is disabled if os does not support backing up ymm registers. g_fake_cpu->SetOsBackupsExtendedRegisters(false); @@ -113,9 +121,9 @@ TEST(CpuidX86Test, SkyLake) { g_fake_cpu->SetOsBackupsExtendedRegisters(true); g_fake_cpu->SetLeaves({ - {0x00000000, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, - {0x00000001, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, - {0x00000007, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, }); const auto info = GetX86Info(); EXPECT_STREQ(info.vendor, "GenuineIntel"); @@ -127,32 +135,129 @@ TEST(CpuidX86Test, Branding) { g_fake_cpu->SetLeaves({ - {0x00000000, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, - {0x00000001, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, - {0x00000007, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, - {0x80000000, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, - {0x80000001, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, - {0x80000002, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}}, - {0x80000003, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}}, - {0x80000004, Leaf{0x352E3220, 0x7A484730, 0x00000000, 0x00000000}}, + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, + {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}}, + {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}}, + {{0x80000004, 0}, Leaf{0x352E3220, 0x7A484730, 0x00000000, 0x00000000}}, }); char brand_string[49]; FillX86BrandString(brand_string); EXPECT_STREQ(brand_string, "Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz"); } +TEST(CpuidX86Test, KabyLakeCache) { + g_fake_cpu->SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000004, 0}, Leaf{0x1C004121, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 1}, Leaf{0x1C004122, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 2}, Leaf{0x1C004143, 0x00C0003F, 0x000003FF, 0x00000000}}, + {{0x00000004, 3}, Leaf{0x1C03C163, 0x02C0003F, 0x00001FFF, 0x00000002}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, + {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}}, + {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}}, + }); + const auto info = GetX86CacheInfo(); + EXPECT_EQ(info.size, 4); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, 1); + EXPECT_EQ(info.levels[0].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[0].ways, 8); + EXPECT_EQ(info.levels[0].line_size, 64); + EXPECT_EQ(info.levels[0].tlb_entries, 64); + EXPECT_EQ(info.levels[0].partitioning, 1); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, 2); + EXPECT_EQ(info.levels[1].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[1].ways, 8); + EXPECT_EQ(info.levels[1].line_size, 64); + EXPECT_EQ(info.levels[1].tlb_entries, 64); + EXPECT_EQ(info.levels[1].partitioning, 1); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, 3); + EXPECT_EQ(info.levels[2].cache_size, 256 * KiB); + EXPECT_EQ(info.levels[2].ways, 4); + EXPECT_EQ(info.levels[2].line_size, 64); + EXPECT_EQ(info.levels[2].tlb_entries, 1024); + EXPECT_EQ(info.levels[2].partitioning, 1); + + EXPECT_EQ(info.levels[3].level, 3); + EXPECT_EQ(info.levels[3].cache_type, 3); + EXPECT_EQ(info.levels[3].cache_size, 6 * MiB); + EXPECT_EQ(info.levels[3].ways, 12); + EXPECT_EQ(info.levels[3].line_size, 64); + EXPECT_EQ(info.levels[3].tlb_entries, 8192); + EXPECT_EQ(info.levels[3].partitioning, 1); +} + +TEST(CpuidX86Test, HSWCache) { + g_fake_cpu->SetLeaves({ + {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}}, + {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}}, + {{0x00000004, 0}, Leaf{0x1C004121, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 1}, Leaf{0x1C004122, 0x01C0003F, 0x0000003F, 0x00000000}}, + {{0x00000004, 2}, Leaf{0x1C004143, 0x01C0003F, 0x000001FF, 0x00000000}}, + {{0x00000004, 3}, Leaf{0x1C03C163, 0x02C0003F, 0x00001FFF, 0x00000006}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}}, + {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}}, + {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}}, + }); + const auto info = GetX86CacheInfo(); + EXPECT_EQ(info.size, 4); + EXPECT_EQ(info.levels[0].level, 1); + EXPECT_EQ(info.levels[0].cache_type, 1); + EXPECT_EQ(info.levels[0].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[0].ways, 8); + EXPECT_EQ(info.levels[0].line_size, 64); + EXPECT_EQ(info.levels[0].tlb_entries, 64); + EXPECT_EQ(info.levels[0].partitioning, 1); + + EXPECT_EQ(info.levels[1].level, 1); + EXPECT_EQ(info.levels[1].cache_type, 2); + EXPECT_EQ(info.levels[1].cache_size, 32 * KiB); + EXPECT_EQ(info.levels[1].ways, 8); + EXPECT_EQ(info.levels[1].line_size, 64); + EXPECT_EQ(info.levels[1].tlb_entries, 64); + EXPECT_EQ(info.levels[1].partitioning, 1); + + EXPECT_EQ(info.levels[2].level, 2); + EXPECT_EQ(info.levels[2].cache_type, 3); + EXPECT_EQ(info.levels[2].cache_size, 256 * KiB); + EXPECT_EQ(info.levels[2].ways, 8); + EXPECT_EQ(info.levels[2].line_size, 64); + EXPECT_EQ(info.levels[2].tlb_entries, 512); + EXPECT_EQ(info.levels[2].partitioning, 1); + + EXPECT_EQ(info.levels[3].level, 3); + EXPECT_EQ(info.levels[3].cache_type, 3); + EXPECT_EQ(info.levels[3].cache_size, 6 * MiB); + EXPECT_EQ(info.levels[3].ways, 12); + EXPECT_EQ(info.levels[3].line_size, 64); + EXPECT_EQ(info.levels[3].tlb_entries, 8192); + EXPECT_EQ(info.levels[3].partitioning, 1); +} // http://users.atw.hu/instlatx64/AuthenticAMD0630F81_K15_Godavari_CPUID.txt TEST(CpuidX86Test, AMD_K15) { g_fake_cpu->SetLeaves({ - {0x00000000, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, - {0x00000001, Leaf{0x00630F81, 0x00040800, 0x3E98320B, 0x178BFBFF}}, - {0x00000007, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, - {0x80000000, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, - {0x80000001, Leaf{0x00630F81, 0x10000000, 0x0FEBBFFF, 0x2FD3FBFF}}, - {0x80000002, Leaf{0x20444D41, 0x372D3841, 0x4B303736, 0x64615220}}, - {0x80000003, Leaf{0x206E6F65, 0x202C3752, 0x43203031, 0x75706D6F}}, - {0x80000004, Leaf{0x43206574, 0x7365726F, 0x2B433420, 0x00204736}}, - {0x80000005, Leaf{0xFF40FF18, 0xFF40FF30, 0x10040140, 0x60030140}}, + {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x00000001, 0}, Leaf{0x00630F81, 0x00040800, 0x3E98320B, 0x178BFBFF}}, + {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}}, + {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}}, + {{0x80000001, 0}, Leaf{0x00630F81, 0x10000000, 0x0FEBBFFF, 0x2FD3FBFF}}, + {{0x80000002, 0}, Leaf{0x20444D41, 0x372D3841, 0x4B303736, 0x64615220}}, + {{0x80000003, 0}, Leaf{0x206E6F65, 0x202C3752, 0x43203031, 0x75706D6F}}, + {{0x80000004, 0}, Leaf{0x43206574, 0x7365726F, 0x2B433420, 0x00204736}}, + {{0x80000005, 0}, Leaf{0xFF40FF18, 0xFF40FF30, 0x10040140, 0x60030140}}, }); const auto info = GetX86Info(); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/filesystem_for_testing.cc softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/filesystem_for_testing.cc --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/filesystem_for_testing.cc 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/filesystem_for_testing.cc 2019-07-23 21:37:18.000000000 +0000 @@ -45,7 +45,7 @@ memcpy(buf, content_.data() + head_index_, read); head_index_ += read; assert(read < INT_MAX); - return read; + return (int)read; } void FakeFilesystem::Reset() { files_.clear(); } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/filesystem_for_testing.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/filesystem_for_testing.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/filesystem_for_testing.h 2019-04-21 08:03:30.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/3rdparty/cpu_features/test/filesystem_for_testing.h 2019-07-23 21:37:18.000000000 +0000 @@ -50,7 +50,7 @@ FakeFile* FindFileOrNull(const std::string& filename) const; private: - size_t next_file_descriptor_ = 0; + int next_file_descriptor_ = 0; std::unordered_map> files_; }; diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/FileIO.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/FileIO.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/FileIO.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/FileIO.c 2019-07-23 21:37:12.000000000 +0000 @@ -1127,6 +1127,12 @@ } } + if (InStr(rpath, "\\node_modules\\")) + { + // Exclude node_modules in the hamcore\webroot + ok = false; + } + if (ok) { b = ReadDump(s); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Kernel.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Kernel.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Kernel.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Kernel.c 2019-07-23 21:37:12.000000000 +0000 @@ -1408,11 +1408,103 @@ st->wMilliseconds); } + +// Convert string RFC3339 format (example: 2017-09-27T18:25:55.434-9:00) to UINT64 +UINT64 DateTimeStrRFC3339ToSystemTime64(char *str) +{ + SYSTEMTIME st; + if (DateTimeStrRFC3339ToSystemTime(&st, str)) + { + return SystemToUINT64(&st); + } + else + { + return 0; + } +} + +// Convert string RFC3339 format (example: 2017-09-27T18:25:55.434-9:00) to SYSTEMTIME +bool DateTimeStrRFC3339ToSystemTime(SYSTEMTIME *st, char *str) +{ + bool ok = false; + UINT index_plus; + char tmp[MAX_PATH]; + Zero(st, sizeof(SYSTEMTIME)); + if (st == NULL || str == NULL) + { + return false; + } + + StrCpy(tmp, sizeof(tmp), str); + + index_plus = SearchStrEx(tmp, "+", 0, false); + if (index_plus != INFINITE) + { + tmp[index_plus] = 0; + } + + if (StrLen(tmp) >= 19) + { + if (tmp[4] == '-' && tmp[7] == '-' && tmp[10] == 'T' && tmp[13] == ':' && + tmp[16] == ':') + { + char str_year[16], str_month[16], str_day[16], str_hour[16], str_minute[16], + str_second[16], str_msec[16]; + + StrCpy(str_year, sizeof(str_year), tmp + 0); + str_year[4] = 0; + + StrCpy(str_month, sizeof(str_month), tmp + 5); + str_month[2] = 0; + + StrCpy(str_day, sizeof(str_day), tmp + 8); + str_day[2] = 0; + + StrCpy(str_hour, sizeof(str_hour), tmp + 11); + str_hour[2] = 0; + + StrCpy(str_minute, sizeof(str_minute), tmp + 14); + str_minute[2] = 0; + + StrCpy(str_second, sizeof(str_second), tmp + 17); + str_second[2] = 0; + + str_msec[0] = 0; + + if (StrLen(tmp) >= 21 && tmp[19] == '.') + { + StrCpy(str_msec, sizeof(str_msec), tmp + 20); + str_msec[StrLen(tmp) - 21] = 0; + while (StrLen(str_msec) < 3) + { + StrCat(str_msec, sizeof(str_msec), "0"); + } + str_msec[3] = 0; + } + + st->wYear = ToInt(str_year); + st->wMonth = ToInt(str_month); + st->wDay = ToInt(str_day); + st->wHour = ToInt(str_hour); + st->wMinute = ToInt(str_minute); + st->wSecond = ToInt(str_second); + st->wMilliseconds = ToInt(str_msec); + + NormalizeSystem(st); + + ok = true; + } + } + + return ok; +} + // Get the date and time string in RFC3339 format (example: 2017-09-27T18:25:55.434-9:00) void GetDateTimeStrRFC3339(char *str, UINT size, SYSTEMTIME *st, int timezone_min){ // Validate arguments if (str == NULL || st == NULL) { + ClearStr(str, size); return; } diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Kernel.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Kernel.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Kernel.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Kernel.h 2019-07-23 21:37:12.000000000 +0000 @@ -137,6 +137,8 @@ void GetDateStrEx64(wchar_t *str, UINT size, UINT64 sec64, LOCALE *locale); void GetTimeStrMilli64(char *str, UINT size, UINT64 sec64); void GetDateTimeStrRFC3339(char *str, UINT size, SYSTEMTIME *st, int timezone_min); +bool DateTimeStrRFC3339ToSystemTime(SYSTEMTIME *st, char *str); +UINT64 DateTimeStrRFC3339ToSystemTime64(char *str); UINT64 SafeTime64(UINT64 sec64); bool Run(char *filename, char *arg, bool hide, bool wait); bool RunW(wchar_t *filename, wchar_t *arg, bool hide, bool wait); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/MayaType.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/MayaType.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/MayaType.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/MayaType.h 2019-07-23 21:37:12.000000000 +0000 @@ -347,6 +347,9 @@ // Str.h typedef struct TOKEN_LIST TOKEN_LIST; typedef struct INI_ENTRY INI_ENTRY; +typedef struct JSON_OBJECT JSON_OBJECT; +typedef struct JSON_ARRAY JSON_ARRAY; +typedef struct JSON_VALUE JSON_VALUE; // Internat.h typedef struct UNI_TOKEN_LIST UNI_TOKEN_LIST; @@ -383,6 +386,8 @@ typedef struct VALUE VALUE; typedef struct ELEMENT ELEMENT; typedef struct PACK PACK; +typedef struct JSONPACKHINT JSONPACKHINT; +typedef struct JSONPACKHINT_ITEM JSONPACKHINT_ITEM; // Cfg.h typedef struct FOLDER FOLDER; diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Memory.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Memory.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Memory.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Memory.c 2019-07-23 21:37:12.000000000 +0000 @@ -1413,6 +1413,48 @@ return false; } +// New string list +LIST *NewStrList() +{ + return NewListFast(CompareStr); +} + +// Release string list +void ReleaseStrList(LIST *o) +{ + UINT i; + if (o == NULL) + { + return; + } + + for (i = 0;i < LIST_NUM(o);i++) + { + char *s = LIST_DATA(o, i); + Free(s); + } + + ReleaseList(o); +} + +// Add a string distinct to the string list +bool AddStrToStrListDistinct(LIST *o, char *str) +{ + if (o == NULL || str == NULL) + { + return false; + } + + if (IsInListStr(o, str) == false) + { + Add(o, CopyStr(str)); + + return true; + } + + return false; +} + // Examine whether a string items are present in the list bool IsInListStr(LIST *o, char *str) { @@ -2948,6 +2990,43 @@ WriteBuf(b, bb->Buf, bb->Size); } +// Write the buffer (from the offset) to a buffer +void WriteBufBufWithOffset(BUF *b, BUF *bb) +{ + // Validate arguments + if (b == NULL || bb == NULL) + { + return; + } + + WriteBuf(b, ((UCHAR *)bb->Buf) + bb->Current, bb->Size - bb->Current); +} + +// Skip UTF-8 BOM +bool BufSkipUtf8Bom(BUF *b) +{ + if (b == NULL) + { + return false; + } + + SeekBufToBegin(b); + + if (b->Size >= 3) + { + UCHAR *data = b->Buf; + + if (data[0] == 0xEF && data[1] == 0xBB && data[2] == 0xBF) + { + SeekBuf(b, 3, 1); + + return true; + } + } + + return false; +} + // Read into a buffer from the buffer BUF *ReadBufFromBuf(BUF *b, UINT size) { diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Memory.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Memory.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Memory.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Memory.h 2019-07-23 21:37:12.000000000 +0000 @@ -208,7 +208,9 @@ void ClearBuf(BUF *b); void WriteBuf(BUF *b, void *buf, UINT size); void WriteBufBuf(BUF *b, BUF *bb); +void WriteBufBufWithOffset(BUF *b, BUF *bb); UINT ReadBuf(BUF *b, void *buf, UINT size); +bool BufSkipUtf8Bom(BUF *b); BUF *ReadBufFromBuf(BUF *b, UINT size); void AdjustBufSize(BUF *b, UINT new_size); void SeekBuf(BUF *b, UINT offset, int mode); @@ -357,5 +359,9 @@ void AppendBufUtf8(BUF *b, wchar_t *str); void AppendBufStr(BUF *b, char *str); +LIST *NewStrList(); +void ReleaseStrList(LIST *o); +bool AddStrToStrListDistinct(LIST *o, char *str); + #endif // MEMORY_H diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Microsoft.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Microsoft.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Microsoft.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Microsoft.c 2019-07-23 21:37:12.000000000 +0000 @@ -1717,6 +1717,59 @@ return hNewToken; } +// Check whether SHA-2 kernel mode signature is supported +bool MsIsSha2KernelModeSignatureSupported() +{ + HINSTANCE hDll; + bool ret = false; + + if (MsIsWindows8()) + { + return true; + } + + hDll = LoadLibrary("Wintrust.dll"); + if (hDll == NULL) + { + return false; + } + + if (GetProcAddress(hDll, "CryptCATAdminAcquireContext2") != NULL) + { + ret = true; + } + + FreeLibrary(hDll); + + return ret; +} + +// Check whether KB3033929 is required +bool MsIsKB3033929RequiredAndMissing() +{ + OS_INFO *info = GetOsInfo(); + + if (info == NULL) + { + return false; + } + + if (OS_IS_WINDOWS_NT(info->OsType)) + { + if (GET_KETA(info->OsType, 100) == 6) + { + if (MsIsX64()) + { + if (MsIsSha2KernelModeSignatureSupported() == false) + { + return true; + } + } + } + } + + return false; +} // Check the digital signature of the file bool MsCheckFileDigitalSignatureW(HWND hWnd, wchar_t *name, bool *danger) diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Microsoft.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Microsoft.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Microsoft.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Microsoft.h 2019-07-23 21:37:12.000000000 +0000 @@ -847,6 +847,8 @@ bool MsCheckFileDigitalSignatureW(HWND hWnd, wchar_t *name, bool *danger); +bool MsIsKB3033929RequiredAndMissing(); +bool MsIsSha2KernelModeSignatureSupported(); bool MsGetProcessExeName(char *path, UINT size, UINT id); bool MsGetWindowOwnerProcessExeName(char *path, UINT size, HWND hWnd); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Network.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Network.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Network.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Network.c 2019-07-23 21:37:12.000000000 +0000 @@ -7229,6 +7229,12 @@ return (IsIP6(ip) ? false : true); } +// Copy the IP address +void CopyIP(IP *dst, IP *src) +{ + Copy(dst, src, sizeof(IP)); +} + // Get the number of clients connected from the specified IP address UINT GetNumIpClient(IP *ip) { @@ -11368,6 +11374,50 @@ Zero(set, sizeof(SOCKSET)); } +// Receive data and discard all of them +bool RecvAllWithDiscard(SOCK *sock, UINT size, bool secure) +{ + static UCHAR buffer[4096]; + UINT recv_size, sz, ret; + if (sock == NULL) + { + return false; + } + if (size == 0) + { + return true; + } + if (sock->AsyncMode) + { + return false; + } + + recv_size = 0; + + while (true) + { + sz = MIN(size - recv_size, sizeof(buffer)); + ret = Recv(sock, buffer, sz, secure); + if (ret == 0) + { + return false; + } + if (ret == SOCK_LATER) + { + // I suppose that this is safe because the RecvAll() function is used only + // if the sock->AsyncMode == true. And the Recv() function may return + // SOCK_LATER only if the sock->AsyncMode == false. Therefore the call of + // Recv() function in the RecvAll() function never returns SOCK_LATER. + return false; + } + recv_size += ret; + if (recv_size >= size) + { + return true; + } + } +} + // Receive all by TCP bool RecvAll(SOCK *sock, void *data, UINT size, bool secure) { diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Network.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Network.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Network.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Network.h 2019-07-23 21:37:12.000000000 +0000 @@ -953,6 +953,7 @@ void GetHttpDateStr(char *str, UINT size, UINT64 t); bool HttpSendForbidden(SOCK *s, char *target, char *server_id); bool HttpSendNotFound(SOCK *s, char *target); +bool HttpSendBody(SOCK *s, void *data, UINT size, char *contents_type); bool HttpSendNotImplemented(SOCK *s, char *method, char *target, char *version); bool HttpServerSend(SOCK *s, PACK *p); bool HttpClientSend(SOCK *s, PACK *p); @@ -1193,6 +1194,7 @@ bool SendNow(SOCK *sock, int secure); bool RecvAll(SOCK *sock, void *data, UINT size, bool secure); bool RecvAllEx(SOCK *sock, void **data_new_ptr, UINT size, bool secure); +bool RecvAllWithDiscard(SOCK *sock, UINT size, bool secure); void InitSockSet(SOCKSET *set); void AddSockSet(SOCKSET *set, SOCK *sock); CANCEL *NewCancel(); @@ -1308,6 +1310,7 @@ SOCKET_TIMEOUT_PARAM *NewSocketTimeout(SOCK *sock); void FreeSocketTimeout(SOCKET_TIMEOUT_PARAM *ttp); +void CopyIP(IP *dst, IP *src); bool IsIP6(IP *ip); bool IsIP4(IP *ip); void IPv6AddrToIP(IP *ip, IPV6_ADDR *addr); diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Pack.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Pack.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Pack.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Pack.c 2019-07-23 21:37:12.000000000 +0000 @@ -644,13 +644,13 @@ } // Memory allocation - e = Malloc(sizeof(ELEMENT)); + e = ZeroMalloc(sizeof(ELEMENT)); StrCpy(e->name, sizeof(e->name), name); e->num_value = num_value; e->type = type; // Copy of the pointer list to the element - e->values = (VALUE **)Malloc(sizeof(VALUE *) * num_value); + e->values = (VALUE **)ZeroMalloc(sizeof(VALUE *) * num_value); for (i = 0;i < e->num_value;i++) { e->values[i] = values[i]; @@ -765,6 +765,9 @@ return false; } + // Set JsonHint_GroupName + StrCpy(e->JsonHint_GroupName, sizeof(e->JsonHint_GroupName), p->CurrentJsonHint_GroupName); + // Adding Add(p->elements, e); return true; @@ -788,6 +791,11 @@ } Free(elements); + if (p->json_subitem_names != NULL) + { + FreeStrList(p->json_subitem_names); + } + ReleaseList(p->elements); Free(p); } @@ -798,7 +806,7 @@ PACK *p; // Memory allocation - p = MallocEx(sizeof(PACK), true); + p = ZeroMallocEx(sizeof(PACK), true); // Creating a List p->elements = NewListFast(ComparePackName); @@ -824,6 +832,12 @@ } k = BufToK(b, true, false, NULL); + + if (k == NULL) + { + k = BufToK(b, true, true, NULL); + } + FreeBuf(b); return k; @@ -847,49 +861,61 @@ } x = BufToX(b, false); + + if (x == NULL) + { + x = BufToX(b, true); + } + FreeBuf(b); return x; } // Add the K to the PACK -void PackAddK(PACK *p, char *name, K *k) +ELEMENT *PackAddK(PACK *p, char *name, K *k) { BUF *b; + ELEMENT *e = NULL; // Validate arguments if (p == NULL || name == NULL || k == NULL) { - return; + return NULL; } b = KToBuf(k, false, NULL); if (b == NULL) { - return; + return NULL; } - PackAddBuf(p, name, b); + e = PackAddBuf(p, name, b); FreeBuf(b); + + return e; } // Add an X into the PACK -void PackAddX(PACK *p, char *name, X *x) +ELEMENT *PackAddX(PACK *p, char *name, X *x) { BUF *b; + ELEMENT *e = NULL; // Validate arguments if (p == NULL || name == NULL || x == NULL) { - return; + return NULL; } b = XToBuf(x, false); if (b == NULL) { - return; + return NULL; } - PackAddBuf(p, name, b); + e = PackAddBuf(p, name, b); FreeBuf(b); + + return e; } // Get a buffer from the PACK @@ -1052,30 +1078,65 @@ return PackGetIntEx(p, name, index) == 0 ? false : true; } +// Set CurrentJsonHint_GroupName to PACK +void PackSetCurrentJsonGroupName(PACK *p, char *json_group_name) +{ + if (p == NULL) + { + return; + } + + if (json_group_name == NULL) + { + ClearStr(p->CurrentJsonHint_GroupName, sizeof(p->CurrentJsonHint_GroupName)); + } + else + { + StrCpy(p->CurrentJsonHint_GroupName, sizeof(p->CurrentJsonHint_GroupName), json_group_name); + + if (p->json_subitem_names == NULL) + { + p->json_subitem_names = NewStrList(); + } + + AddStrToStrListDistinct(p->json_subitem_names, json_group_name); + } +} + // Add a bool type into the PACK -void PackAddBool(PACK *p, char *name, bool b) +ELEMENT *PackAddBool(PACK *p, char *name, bool b) { - PackAddInt(p, name, b ? 1 : 0); + ELEMENT *e = PackAddInt(p, name, b ? 1 : 0); + if (e != NULL) + { + e->JsonHint_IsBool = true; + } + return e; } -void PackAddBoolEx(PACK *p, char *name, bool b, UINT index, UINT total) +ELEMENT *PackAddBoolEx(PACK *p, char *name, bool b, UINT index, UINT total) { - PackAddIntEx(p, name, b ? 1 : 0, index, total); + ELEMENT *e = PackAddIntEx(p, name, b ? 1 : 0, index, total); + if (e != NULL) + { + e->JsonHint_IsBool = true; + } + return e; } // Add the IPV6_ADDR to the PACK -void PackAddIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index, UINT total) +ELEMENT *PackAddIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index, UINT total) { // Validate arguments if (p == NULL || name == NULL || addr == NULL) { - return; + return NULL; } - PackAddDataEx(p, name, addr, sizeof(IPV6_ADDR), index, total); + return PackAddDataEx(p, name, addr, sizeof(IPV6_ADDR), index, total); } -void PackAddIp6Addr(PACK *p, char *name, IPV6_ADDR *addr) +ELEMENT *PackAddIp6Addr(PACK *p, char *name, IPV6_ADDR *addr) { - PackAddIp6AddrEx(p, name, addr, 0, 1); + return PackAddIp6AddrEx(p, name, addr, 0, 1); } // Get an IPV6_ADDR from the PACK @@ -1098,6 +1159,10 @@ // Add the IP to the PACK void PackAddIp32Ex(PACK *p, char *name, UINT ip32, UINT index, UINT total) { + PackAddIp32Ex2(p, name, ip32, index, total, false); +} +void PackAddIp32Ex2(PACK *p, char *name, UINT ip32, UINT index, UINT total, bool is_single) +{ IP ip; // Validate arguments if (p == NULL || name == NULL) @@ -1107,32 +1172,45 @@ UINTToIP(&ip, ip32); - PackAddIpEx(p, name, &ip, index, total); + PackAddIpEx2(p, name, &ip, index, total, is_single); } void PackAddIp32(PACK *p, char *name, UINT ip32) { - PackAddIp32Ex(p, name, ip32, 0, 1); + PackAddIp32Ex2(p, name, ip32, 0, 1, true); } void PackAddIpEx(PACK *p, char *name, IP *ip, UINT index, UINT total) { + PackAddIpEx2(p, name, ip, index, total, false); +} +void PackAddIpEx2(PACK *p, char *name, IP *ip, UINT index, UINT total, bool is_single) +{ UINT i; bool b = false; char tmp[MAX_PATH]; + ELEMENT *e; // Validate arguments if (p == NULL || name == NULL || ip == NULL) { return; } + if (total >= 2) + { + is_single = false; + } b = IsIP6(ip); Format(tmp, sizeof(tmp), "%s@ipv6_bool", name); - PackAddBoolEx(p, tmp, b, index, total); + e = PackAddBoolEx(p, tmp, b, index, total); + if (e != NULL && is_single) e->JsonHint_IsArray = false; + if (e != NULL) e->JsonHint_IsIP = true; Format(tmp, sizeof(tmp), "%s@ipv6_array", name); if (b) { - PackAddDataEx(p, tmp, ip->ipv6_addr, sizeof(ip->ipv6_addr), index, total); + e = PackAddDataEx(p, tmp, ip->ipv6_addr, sizeof(ip->ipv6_addr), index, total); + if (e != NULL && is_single) e->JsonHint_IsArray = false; + if (e != NULL) e->JsonHint_IsIP = true; } else { @@ -1140,17 +1218,23 @@ Zero(dummy, sizeof(dummy)); - PackAddDataEx(p, tmp, dummy, sizeof(dummy), index, total); + e = PackAddDataEx(p, tmp, dummy, sizeof(dummy), index, total); + if (e != NULL && is_single) e->JsonHint_IsArray = false; + if (e != NULL) e->JsonHint_IsIP = true; } Format(tmp, sizeof(tmp), "%s@ipv6_scope_id", name); if (b) { - PackAddIntEx(p, tmp, ip->ipv6_scope_id, index, total); + e = PackAddIntEx(p, tmp, ip->ipv6_scope_id, index, total); + if (e != NULL && is_single) e->JsonHint_IsArray = false; + if (e != NULL) e->JsonHint_IsIP = true; } else { - PackAddIntEx(p, tmp, 0, index, total); + e = PackAddIntEx(p, tmp, 0, index, total); + if (e != NULL && is_single) e->JsonHint_IsArray = false; + if (e != NULL) e->JsonHint_IsIP = true; } i = IPToUINT(ip); @@ -1160,11 +1244,13 @@ i = Swap32(i); } - PackAddIntEx(p, name, i, index, total); + e = PackAddIntEx(p, name, i, index, total); + if (e != NULL && is_single) e->JsonHint_IsArray = false; + if (e != NULL) e->JsonHint_IsIP = true; } void PackAddIp(PACK *p, char *name, IP *ip) { - PackAddIpEx(p, name, ip, 0, 1); + PackAddIpEx2(p, name, ip, 0, 1, true); } // Get an IP from the PACK @@ -1344,34 +1430,35 @@ } // Add the buffer to the PACK (array) -void PackAddBufEx(PACK *p, char *name, BUF *b, UINT index, UINT total) +ELEMENT *PackAddBufEx(PACK *p, char *name, BUF *b, UINT index, UINT total) { // Validate arguments if (p == NULL || name == NULL || b == NULL || total == 0) { - return; + return NULL; } - PackAddDataEx(p, name, b->Buf, b->Size, index, total); + return PackAddDataEx(p, name, b->Buf, b->Size, index, total); } // Add the data to the PACK (array) -void PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT total) +ELEMENT *PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT total) { VALUE *v; ELEMENT *e; // Validate arguments if (p == NULL || data == NULL || name == NULL || total == 0) { - return; + return NULL; } v = NewDataValue(data, size); e = GetElement(p, name, VALUE_DATA); if (e != NULL) { - if (e->num_value <= total) + if (e->num_value >= total) { + FreeValue(e->values[index], VALUE_DATA); e->values[index] = v; } else @@ -1387,53 +1474,68 @@ e->type = VALUE_DATA; e->values = ZeroMallocEx(sizeof(VALUE *) * total, true); e->values[index] = v; - AddElement(p, e); + if (AddElement(p, e) == false) + { + return NULL; + } } + + e->JsonHint_IsArray = true; + + return e; } // Add the buffer to the PACK -void PackAddBuf(PACK *p, char *name, BUF *b) +ELEMENT *PackAddBuf(PACK *p, char *name, BUF *b) { // Validate arguments if (p == NULL || name == NULL || b == NULL) { - return; + return NULL; } - PackAddData(p, name, b->Buf, b->Size); + return PackAddData(p, name, b->Buf, b->Size); } // Add the data to the PACK -void PackAddData(PACK *p, char *name, void *data, UINT size) +ELEMENT *PackAddData(PACK *p, char *name, void *data, UINT size) { VALUE *v; + ELEMENT *e; // Validate arguments if (p == NULL || data == NULL || name == NULL) { - return; + return NULL; } v = NewDataValue(data, size); - AddElement(p, NewElement(name, VALUE_DATA, 1, &v)); + e = NewElement(name, VALUE_DATA, 1, &v); + if (AddElement(p, e) == false) + { + return NULL; + } + + return e; } // Add a 64 bit integer (array) to the PACK -void PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total) +ELEMENT *PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total) { VALUE *v; ELEMENT *e; // Validate arguments if (p == NULL || name == NULL || total == 0) { - return; + return NULL; } v = NewInt64Value(i); e = GetElement(p, name, VALUE_INT64); if (e != NULL) { - if (e->num_value <= total) + if (e->num_value >= total) { + FreeValue(e->values[index], VALUE_INT64); e->values[index] = v; } else @@ -1449,27 +1551,36 @@ e->type = VALUE_INT64; e->values = ZeroMallocEx(sizeof(VALUE *) * total, true); e->values[index] = v; - AddElement(p, e); + + if (AddElement(p, e) == false) + { + return NULL; + } } + + e->JsonHint_IsArray = true; + + return e; } // Add an integer to the PACK (array) -void PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total) +ELEMENT *PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total) { VALUE *v; ELEMENT *e; // Validate arguments if (p == NULL || name == NULL || total == 0) { - return; + return NULL; } v = NewIntValue(i); e = GetElement(p, name, VALUE_INT); if (e != NULL) { - if (e->num_value <= total) + if (e->num_value >= total) { + FreeValue(e->values[index], VALUE_INT); e->values[index] = v; } else @@ -1485,61 +1596,103 @@ e->type = VALUE_INT; e->values = ZeroMallocEx(sizeof(VALUE *) * total, true); e->values[index] = v; - AddElement(p, e); + + if (AddElement(p, e) == false) + { + return NULL; + } + } + + e->JsonHint_IsArray = true; + + return e; +} + +// Add 64 bit integer time value to the PACK +ELEMENT *PackAddTime64(PACK *p, char *name, UINT64 i) +{ + ELEMENT *e = PackAddInt64(p, name, i); + if (e != NULL) + { + e->JsonHint_IsDateTime = true; + } + return e; +} +ELEMENT *PackAddTime64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total) +{ + ELEMENT *e = PackAddInt64Ex(p, name, i, index, total); + if (e != NULL) + { + e->JsonHint_IsDateTime = true; } + return e; } + // Add a 64 bit integer to the PACK -void PackAddInt64(PACK *p, char *name, UINT64 i) +ELEMENT *PackAddInt64(PACK *p, char *name, UINT64 i) { VALUE *v; + ELEMENT *e; // Validate arguments if (p == NULL || name == NULL) { - return; + return NULL; } v = NewInt64Value(i); - AddElement(p, NewElement(name, VALUE_INT64, 1, &v)); + e = NewElement(name, VALUE_INT64, 1, &v); + if (AddElement(p, e) == false) + { + return NULL; + } + return e; } // Add the number of items to the PACK -void PackAddNum(PACK *p, char *name, UINT num) +ELEMENT *PackAddNum(PACK *p, char *name, UINT num) { - PackAddInt(p, name, num); + return PackAddInt(p, name, num); } // Add an integer to the PACK -void PackAddInt(PACK *p, char *name, UINT i) +ELEMENT *PackAddInt(PACK *p, char *name, UINT i) { VALUE *v; + ELEMENT *e = NULL; // Validate arguments if (p == NULL || name == NULL) { - return; + return NULL; } v = NewIntValue(i); - AddElement(p, NewElement(name, VALUE_INT, 1, &v)); + e = NewElement(name, VALUE_INT, 1, &v); + if (AddElement(p, e) == false) + { + return NULL; + } + return e; } // Add a Unicode string (array) to the PACK -void PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT total) +ELEMENT *PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT total) { VALUE *v; ELEMENT *e; // Validate arguments if (p == NULL || name == NULL || unistr == NULL || total == 0) { - return; + return NULL; } v = NewUniStrValue(unistr); e = GetElement(p, name, VALUE_UNISTR); if (e != NULL) { - if (e->num_value <= total) + if (e->num_value >= total) { + FreeValue(e->values[index], VALUE_UNISTR); e->values[index] = v; } else @@ -1555,41 +1708,55 @@ e->type = VALUE_UNISTR; e->values = ZeroMallocEx(sizeof(VALUE *) * total, true); e->values[index] = v; - AddElement(p, e); + if (AddElement(p, e) == false) + { + return NULL; + } } + + e->JsonHint_IsArray = true; + + return e; } // Add a Unicode string to the PACK -void PackAddUniStr(PACK *p, char *name, wchar_t *unistr) +ELEMENT *PackAddUniStr(PACK *p, char *name, wchar_t *unistr) { VALUE *v; + ELEMENT *e = NULL; // Validate arguments if (p == NULL || name == NULL || unistr == NULL) { - return; + return NULL; } v = NewUniStrValue(unistr); - AddElement(p, NewElement(name, VALUE_UNISTR, 1, &v)); + e = NewElement(name, VALUE_UNISTR, 1, &v); + if (AddElement(p, e) == false) + { + return NULL; + } + return e; } // Add a string to the PACK (array) -void PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total) +ELEMENT *PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total) { VALUE *v; ELEMENT *e; // Validate arguments if (p == NULL || name == NULL || str == NULL || total == 0) { - return; + return NULL; } v = NewStrValue(str); e = GetElement(p, name, VALUE_STR); if (e != NULL) { - if (e->num_value <= total) + if (e->num_value >= total) { + FreeValue(e->values[index], VALUE_STR); e->values[index] = v; } else @@ -1605,22 +1772,701 @@ e->type = VALUE_STR; e->values = ZeroMallocEx(sizeof(VALUE *) * total, true); e->values[index] = v; - AddElement(p, e); + if (AddElement(p, e) == false) + { + return NULL; + } } + + e->JsonHint_IsArray = true; + + return e; } // Add a string to the PACK -void PackAddStr(PACK *p, char *name, char *str) +ELEMENT *PackAddStr(PACK *p, char *name, char *str) { VALUE *v; + ELEMENT *e = NULL; // Validate arguments if (p == NULL || name == NULL || str == NULL) { - return; + return NULL; } v = NewStrValue(str); - AddElement(p, NewElement(name, VALUE_STR, 1, &v)); + e = NewElement(name, VALUE_STR, 1, &v); + if (AddElement(p, e) == false) + { + return NULL; + } + return e; } +// Add an element of PACK array to JSON Array +void PackArrayElementToJsonArray(JSON_ARRAY *ja, PACK *p, ELEMENT *e, UINT index) +{ + if (ja == NULL || p == NULL || e == NULL || index >= e->num_value) + { + return; + } + + switch (e->type) + { + case VALUE_INT: + if (e->JsonHint_IsIP) + { + if (InStr(e->name, "@") == false) + { + IP ip; + if (PackGetIpEx(p, e->name, &ip, index)) + { + char ip_str[64]; + IPToStr(ip_str, sizeof(ip_str), &ip); + JsonArrayAddStr(ja, ip_str); + } + } + } + else if (e->JsonHint_IsBool) + { + JsonArrayAddBool(ja, PackGetBoolEx(p, e->name, index)); + } + else + { + JsonArrayAddNumber(ja, PackGetIntEx(p, e->name, index)); + } + break; + case VALUE_INT64: + if (e->JsonHint_IsIP == false) + { + if (e->JsonHint_IsDateTime == false) + { + JsonArrayAddNumber(ja, PackGetInt64Ex(p, e->name, index)); + } + else + { + char dtstr[64]; + + SystemTime64ToJsonStr(dtstr, sizeof(dtstr), PackGetInt64Ex(p, e->name, index)); + JsonArrayAddStr(ja, dtstr); + } + } + break; + case VALUE_DATA: + if (e->JsonHint_IsIP == false) + { + BUF *buf = PackGetBufEx(p, e->name, index); + if (buf != NULL) + { + JsonArrayAddData(ja, buf->Buf, buf->Size); + FreeBuf(buf); + } + else + { + UCHAR zero = 0; + JsonArrayAddData(ja, &zero, 0); + } + } + break; + case VALUE_STR: + if (e->JsonHint_IsIP == false) + { + if (e->values[index] != NULL) + { + JsonArrayAddStr(ja, e->values[index]->Str); + } + else + { + JsonArrayAddStr(ja, ""); + } + } + break; + case VALUE_UNISTR: + if (e->JsonHint_IsIP == false) + { + if (e->values[index] != NULL) + { + JsonArrayAddUniStr(ja, e->values[index]->UniStr); + } + else + { + JsonArrayAddUniStr(ja, L""); + } + } + break; + } +} + +// Add an element of PACK to JSON Object +void PackElementToJsonObject(JSON_OBJECT *o, PACK *p, ELEMENT *e, UINT index) +{ + char *suffix; + char name[MAX_PATH]; + if (o == NULL || p == NULL || e == NULL) + { + return; + } + + suffix = DetermineJsonSuffixForPackElement(e); + + if (suffix == NULL) + { + return; + } + + StrCpy(name, sizeof(name), e->name); + StrCat(name, sizeof(name), suffix); + + switch (e->type) + { + case VALUE_INT: + if (e->JsonHint_IsIP) + { + if (InStr(e->name, "@") == false) + { + IP ip; + if (PackGetIpEx(p, e->name, &ip, index)) + { + char ip_str[64]; + IPToStr(ip_str, sizeof(ip_str), &ip); + JsonSetStr(o, name, ip_str); + } + } + } + else if (e->JsonHint_IsBool) + { + JsonSetBool(o, name, PackGetBoolEx(p, e->name, index)); + } + else + { + JsonSetNumber(o, name, PackGetIntEx(p, e->name, index)); + } + break; + case VALUE_INT64: + if (e->JsonHint_IsIP == false) + { + if (e->JsonHint_IsDateTime == false) + { + JsonSetNumber(o, name, PackGetInt64Ex(p, e->name, index)); + } + else + { + char dtstr[64]; + + SystemTime64ToJsonStr(dtstr, sizeof(dtstr), PackGetInt64Ex(p, e->name, index)); + JsonSetStr(o, name, dtstr); + } + } + break; + case VALUE_DATA: + if (e->JsonHint_IsIP == false) + { + BUF *buf = PackGetBufEx(p, e->name, index); + if (buf != NULL) + { + JsonSetData(o, name, buf->Buf, buf->Size); + FreeBuf(buf); + } + else + { + UCHAR zero = 0; + JsonSetData(o, name, &zero, 0); + } + } + break; + case VALUE_STR: + if (e->JsonHint_IsIP == false) + { + if (e->values[index] != NULL) + { + JsonSetStr(o, name, e->values[index]->Str); + } + else + { + JsonSetStr(o, name, ""); + } + } + break; + case VALUE_UNISTR: + if (e->JsonHint_IsIP == false) + { + if (e->values[index] != NULL) + { + JsonSetUniStr(o, name, e->values[index]->UniStr); + } + else + { + JsonSetUniStr(o, name, L""); + } + } + break; + } +} + +// Determine JSON element suffix for PACK element +char *DetermineJsonSuffixForPackElement(ELEMENT *e) +{ + switch (e->type) + { + case VALUE_INT: + if (e->JsonHint_IsIP) + { + if (InStr(e->name, "@") == false) + { + return "_ip"; + } + } + else if (e->JsonHint_IsBool) + { + return "_bool"; + } + else + { + return "_u32"; + } + break; + case VALUE_INT64: + if (e->JsonHint_IsIP == false) + { + if (e->JsonHint_IsDateTime == false) + { + return "_u64"; + } + else + { + return "_dt"; + } + } + break; + case VALUE_DATA: + if (e->JsonHint_IsIP == false) + { + return "_bin"; + } + break; + case VALUE_STR: + if (e->JsonHint_IsIP == false) + { + return "_str"; + } + break; + case VALUE_UNISTR: + if (e->JsonHint_IsIP == false) + { + return "_utf"; + } + break; + } + + return NULL; +} + +// Convert JSON to PACK +PACK *JsonToPack(JSON_VALUE *v) +{ + PACK *p = NULL; + JSON_OBJECT *jo; + if (v == NULL) + { + return NULL; + } + + p = NewPack(); + + jo = JsonValueGetObject(v); + + if (jo != NULL) + { + UINT i; + for (i = 0;i < jo->count;i++) + { + char *name = jo->names[i]; + JSON_VALUE *value = jo->values[i]; + + if (value->type == JSON_TYPE_ARRAY) + { + UINT j; + JSON_ARRAY *ja = value->value.array; + + for (j = 0;j < ja->count;j++) + { + if (ja->items[j]->type != JSON_TYPE_OBJECT) + { + JsonTryParseValueAddToPack(p, ja->items[j], name, j, ja->count, false); + } + else + { + JSON_VALUE *v = ja->items[j]; + JSON_OBJECT *o = v->value.object; + UINT k; + + for (k = 0;k < o->count;k++) + { + char *name2 = o->names[k]; + JSON_VALUE *value2 = o->values[k]; + + PackSetCurrentJsonGroupName(p, name); + JsonTryParseValueAddToPack(p, value2, name2, j, ja->count, false); + PackSetCurrentJsonGroupName(p, NULL); + } + } + } + } + else + { + JsonTryParseValueAddToPack(p, value, name, 0, 1, true); + } + } + } + + return p; +} + +ELEMENT *ElementNullSafe(ELEMENT *p) +{ + static ELEMENT dummy; + if (p == NULL) + { + Zero(&dummy, sizeof(dummy)); + return &dummy; + } + return p; +} + +bool JsonTryParseValueAddToPack(PACK *p, JSON_VALUE *v, char *v_name, UINT index, UINT total, bool is_single) +{ + char name[MAX_PATH]; + bool ok = true; + if (p == NULL || v == NULL) + { + return false; + } + + if (TrimEndWith(name, sizeof(name), v_name, "_bool")) + { + if (v->type == JSON_TYPE_BOOL) + { + ElementNullSafe(PackAddBoolEx(p, name, MAKEBOOL(v->value.boolean), index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_NUMBER) + { + ElementNullSafe(PackAddBoolEx(p, name, MAKEBOOL(v->value.number), index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_STRING) + { + ElementNullSafe(PackAddBoolEx(p, name, ToBool(v->value.string), index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + } + else if (TrimEndWith(name, sizeof(name), v_name, "_u32")) + { + if (v->type == JSON_TYPE_BOOL) + { + ElementNullSafe(PackAddIntEx(p, name, MAKEBOOL(v->value.boolean), index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_NUMBER) + { + ElementNullSafe(PackAddIntEx(p, name, (UINT)v->value.number, index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_STRING) + { + ElementNullSafe(PackAddIntEx(p, name, ToInt(v->value.string), index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + } + else if (TrimEndWith(name, sizeof(name), v_name, "_u64")) + { + if (v->type == JSON_TYPE_BOOL) + { + ElementNullSafe(PackAddInt64Ex(p, name, MAKEBOOL(v->value.boolean), index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_NUMBER) + { + ElementNullSafe(PackAddInt64Ex(p, name, v->value.number, index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_STRING) + { + ElementNullSafe(PackAddInt64Ex(p, name, ToInt64(v->value.string), index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + } + else if (TrimEndWith(name, sizeof(name), v_name, "_str")) + { + if (v->type == JSON_TYPE_BOOL) + { + ElementNullSafe(PackAddStrEx(p, name, MAKEBOOL(v->value.boolean) ? "true" : "false", index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_NUMBER) + { + char tmp[64]; + ToStr64(tmp, v->value.number); + ElementNullSafe(PackAddStrEx(p, name, tmp, index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_STRING) + { + ElementNullSafe(PackAddStrEx(p, name, v->value.string, index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + } + else if (TrimEndWith(name, sizeof(name), v_name, "_utf")) + { + if (v->type == JSON_TYPE_BOOL) + { + ElementNullSafe(PackAddUniStrEx(p, name, MAKEBOOL(v->value.boolean) ? L"true" : L"false", index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_NUMBER) + { + char tmp[64]; + wchar_t tmp2[64]; + ToStr64(tmp, v->value.number); + StrToUni(tmp2, sizeof(tmp2), tmp); + ElementNullSafe(PackAddUniStrEx(p, name, tmp2, index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_STRING) + { + wchar_t *uni = CopyUtfToUni(v->value.string); + ElementNullSafe(PackAddUniStrEx(p, name, uni, index, total))->JsonHint_IsArray = !is_single; + Free(uni); + ok = true; + } + } + else if (TrimEndWith(name, sizeof(name), v_name, "_bin")) + { + if (v->type == JSON_TYPE_STRING) + { + UINT len = StrLen(v->value.string); + UCHAR *data = ZeroMalloc(len * 4 + 64); + UINT size = B64_Decode(data, v->value.string, len); + ElementNullSafe(PackAddDataEx(p, name, data, size, index, total))->JsonHint_IsArray = !is_single; + Free(data); + ok = true; + } + } + else if (TrimEndWith(name, sizeof(name), v_name, "_dt")) + { + if (v->type == JSON_TYPE_NUMBER) + { + ElementNullSafe(PackAddInt64Ex(p, name, v->value.number, index, total))->JsonHint_IsArray = !is_single; + ok = true; + } + else if (v->type == JSON_TYPE_STRING) + { + UINT64 time = DateTimeStrRFC3339ToSystemTime64(v->value.string); + ELEMENT *e = PackAddInt64Ex(p, name, time, index, total); + if (e != NULL) + { + e->JsonHint_IsArray = !is_single; + e->JsonHint_IsDateTime = true; + } + ok = true; + } + } + else if (TrimEndWith(name, sizeof(name), v_name, "_ip")) + { + if (v->type == JSON_TYPE_STRING) + { + IP ip; + if (StrToIP(&ip, v->value.string)) + { + PackAddIpEx2(p, name, &ip, index, total, is_single); + ok = true; + } + } + } + + return ok; +} + +// Convert JSON string to PACK +PACK *JsonStrToPack(char *str) +{ + JSON_VALUE *v = StrToJson(str); + PACK *ret; + + if (v == NULL) + { + return NULL; + } + + ret = JsonToPack(v); + + JsonFree(v); + + return ret; +} + +// Convert PACK to JSON string +char *PackToJsonStr(PACK *p) +{ + char *ret; + JSON_VALUE *json = PackToJson(p); + + ret = JsonToStr(json); + + JsonFree(json); + + return ret; +} + +// Convert PACK to JSON +JSON_VALUE *PackToJson(PACK *p) +{ + JSON_VALUE *v; + JSON_OBJECT *o; + UINT i, j, k; + LIST *json_group_id_list; + if (p == NULL) + { + return JsonNewObject(); + } + + json_group_id_list = NewStrList(); + + for (i = 0;i < LIST_NUM(p->elements);i++) + { + ELEMENT *e = LIST_DATA(p->elements, i); + + if (e->num_value >= 2 || e->JsonHint_IsArray) + { + if (IsEmptyStr(e->JsonHint_GroupName) == false) + { + AddStrToStrListDistinct(json_group_id_list, e->JsonHint_GroupName); + } + } + } + + for (i = 0;i < LIST_NUM(p->json_subitem_names);i++) + { + char *group_name = LIST_DATA(p->json_subitem_names, i); + + if (IsEmptyStr(group_name) == false) + { + AddStrToStrListDistinct(json_group_id_list, group_name); + } + } + + v = JsonNewObject(); + o = JsonValueGetObject(v); + + for (k = 0;k < LIST_NUM(json_group_id_list);k++) + { + char *group_name = LIST_DATA(json_group_id_list, k); + UINT array_count = INFINITE; + bool ok = true; + + for (i = 0;i < LIST_NUM(p->elements);i++) + { + ELEMENT *e = LIST_DATA(p->elements, i); + + if (e->num_value >= 2 || e->JsonHint_IsArray) + { + if (StrCmpi(e->JsonHint_GroupName, group_name) == 0) + { + if (array_count == INFINITE) + { + array_count = e->num_value; + } + else + { + if (array_count != e->num_value) + { + ok = false; + } + } + } + } + } + + if (array_count == INFINITE) + { + array_count = 0; + } + + if (ok) + { + JSON_VALUE **json_objects = ZeroMalloc(sizeof(void *) * array_count); + JSON_VALUE *jav = JsonNewArray(); + JSON_ARRAY *ja = JsonArray(jav); + + JsonSet(o, group_name, jav); + + for (j = 0;j < array_count;j++) + { + json_objects[j] = JsonNewObject(); + + JsonArrayAdd(ja, json_objects[j]); + } + + for (i = 0;i < LIST_NUM(p->elements);i++) + { + ELEMENT *e = LIST_DATA(p->elements, i); + + if (e->num_value >= 2 || e->JsonHint_IsArray) + { + if (StrCmpi(e->JsonHint_GroupName, group_name) == 0) + { + for (j = 0;j < e->num_value;j++) + { + PackElementToJsonObject(JsonValueGetObject(json_objects[j]), + p, e, j); + } + } + } + } + + Free(json_objects); + } + } + + for (i = 0;i < LIST_NUM(p->elements);i++) + { + ELEMENT *e = LIST_DATA(p->elements, i); + + if (e->num_value >= 2 || e->JsonHint_IsArray) + { + if (IsEmptyStr(e->JsonHint_GroupName)) + { + char *suffix = DetermineJsonSuffixForPackElement(e); + + if (suffix != NULL) + { + JSON_VALUE *jav = JsonNewArray(); + JSON_ARRAY *ja = JsonArray(jav); + char name[MAX_PATH]; + + for (j = 0;j < e->num_value;j++) + { + PackArrayElementToJsonArray(ja, p, e, j); + } + + StrCpy(name, sizeof(name), e->name); + StrCat(name, sizeof(name), suffix); + + JsonSet(o, name, jav); + } + } + } + else if (e->num_value == 1) + { + PackElementToJsonObject(o, p, e, 0); + } + } + + ReleaseStrList(json_group_id_list); + + return v; +} + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Pack.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Pack.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Pack.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Pack.h 2019-07-23 21:37:12.000000000 +0000 @@ -55,12 +55,38 @@ UINT num_value; // Number of values (>=1) UINT type; // Type VALUE **values; // List of pointers to the value + bool JsonHint_IsArray; + bool JsonHint_IsBool; + bool JsonHint_IsDateTime; + bool JsonHint_IsIP; + char JsonHint_GroupName[MAX_ELEMENT_NAME_LEN + 1]; }; // PACK object struct PACK { LIST *elements; // Element list + LIST *json_subitem_names; // JSON sub-item names + char CurrentJsonHint_GroupName[MAX_ELEMENT_NAME_LEN + 1]; +}; + + +#define MAX_JSONPACK_HINT_ITEMS 64 +#define JSONPACK_HINT_TYPE_ARRAY 1 + +// JSON/PACK converter hint element +struct JSONPACKHINT_ITEM +{ + UINT Type; + char ArrayNumNameInPack[MAX_ELEMENT_NAME_LEN + 1]; + char ArrayMembersInPack[MAX_SIZE + 1]; +}; + +// JSON/PACK converter hint +struct JSONPACKHINT +{ + UINT NumHints; + JSONPACKHINT_ITEM Hints[MAX_JSONPACK_HINT_ITEMS]; }; @@ -100,21 +126,23 @@ X *PackGetX(PACK *p, char *name); K *PackGetK(PACK *p, char *name); -void PackAddX(PACK *p, char *name, X *x); -void PackAddK(PACK *p, char *name, K *k); -void PackAddStr(PACK *p, char *name, char *str); -void PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total); -void PackAddUniStr(PACK *p, char *name, wchar_t *unistr); -void PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT total); -void PackAddInt(PACK *p, char *name, UINT i); -void PackAddNum(PACK *p, char *name, UINT num); -void PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total); -void PackAddInt64(PACK *p, char *name, UINT64 i); -void PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total); -void PackAddData(PACK *p, char *name, void *data, UINT size); -void PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT total); -void PackAddBuf(PACK *p, char *name, BUF *b); -void PackAddBufEx(PACK *p, char *name, BUF *b, UINT index, UINT total); +ELEMENT *PackAddX(PACK *p, char *name, X *x); +ELEMENT *PackAddK(PACK *p, char *name, K *k); +ELEMENT *PackAddStr(PACK *p, char *name, char *str); +ELEMENT *PackAddStrEx(PACK *p, char *name, char *str, UINT index, UINT total); +ELEMENT *PackAddUniStr(PACK *p, char *name, wchar_t *unistr); +ELEMENT *PackAddUniStrEx(PACK *p, char *name, wchar_t *unistr, UINT index, UINT total); +ELEMENT *PackAddInt(PACK *p, char *name, UINT i); +ELEMENT *PackAddNum(PACK *p, char *name, UINT num); +ELEMENT *PackAddIntEx(PACK *p, char *name, UINT i, UINT index, UINT total); +ELEMENT *PackAddInt64(PACK *p, char *name, UINT64 i); +ELEMENT *PackAddInt64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total); +ELEMENT *PackAddTime64(PACK *p, char *name, UINT64 i); +ELEMENT *PackAddTime64Ex(PACK *p, char *name, UINT64 i, UINT index, UINT total); +ELEMENT *PackAddData(PACK *p, char *name, void *data, UINT size); +ELEMENT *PackAddDataEx(PACK *p, char *name, void *data, UINT size, UINT index, UINT total); +ELEMENT *PackAddBuf(PACK *p, char *name, BUF *b); +ELEMENT *PackAddBufEx(PACK *p, char *name, BUF *b, UINT index, UINT total); bool PackGetStr(PACK *p, char *name, char *str, UINT size); bool PackGetStrEx(PACK *p, char *name, char *str, UINT size, UINT index); bool PackGetUniStr(PACK *p, char *name, wchar_t *unistr, UINT size); @@ -133,23 +161,38 @@ BUF *PackGetBuf(PACK *p, char *name); BUF *PackGetBufEx(PACK *p, char *name, UINT index); bool PackGetBool(PACK *p, char *name); -void PackAddBool(PACK *p, char *name, bool b); -void PackAddBoolEx(PACK *p, char *name, bool b, UINT index, UINT total); +ELEMENT *PackAddBool(PACK *p, char *name, bool b); +ELEMENT *PackAddBoolEx(PACK *p, char *name, bool b, UINT index, UINT total); bool PackGetBoolEx(PACK *p, char *name, UINT index); void PackAddIp(PACK *p, char *name, IP *ip); void PackAddIpEx(PACK *p, char *name, IP *ip, UINT index, UINT total); +void PackAddIpEx2(PACK *p, char *name, IP *ip, UINT index, UINT total, bool is_single); bool PackGetIp(PACK *p, char *name, IP *ip); bool PackGetIpEx(PACK *p, char *name, IP *ip, UINT index); UINT PackGetIp32(PACK *p, char *name); UINT PackGetIp32Ex(PACK *p, char *name, UINT index); void PackAddIp32(PACK *p, char *name, UINT ip32); void PackAddIp32Ex(PACK *p, char *name, UINT ip32, UINT index, UINT total); -void PackAddIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index, UINT total); +void PackAddIp32Ex2(PACK *p, char *name, UINT ip32, UINT index, UINT total, bool is_single); +ELEMENT *PackAddIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index, UINT total); bool PackGetIp6AddrEx(PACK *p, char *name, IPV6_ADDR *addr, UINT index); -void PackAddIp6Addr(PACK *p, char *name, IPV6_ADDR *addr); +ELEMENT *PackAddIp6Addr(PACK *p, char *name, IPV6_ADDR *addr); bool PackGetIp6Addr(PACK *p, char *name, IPV6_ADDR *addr); bool PackGetData2(PACK *p, char *name, void *data, UINT size); bool PackGetDataEx2(PACK *p, char *name, void *data, UINT size, UINT index); bool PackIsValueExists(PACK *p, char *name); +void PackSetCurrentJsonGroupName(PACK *p, char *json_group_name); +ELEMENT *ElementNullSafe(ELEMENT *p); + +JSON_VALUE *PackToJson(PACK *p); +char *PackToJsonStr(PACK *p); + +PACK *JsonToPack(JSON_VALUE *v); +PACK *JsonStrToPack(char *str); + +void PackArrayElementToJsonArray(JSON_ARRAY *ja, PACK *p, ELEMENT *e, UINT index); +void PackElementToJsonObject(JSON_OBJECT *o, PACK *p, ELEMENT *e, UINT index); +char *DetermineJsonSuffixForPackElement(ELEMENT *e); +bool JsonTryParseValueAddToPack(PACK *p, JSON_VALUE *v, char *v_name, UINT index, UINT total, bool is_single); #endif // PACK_H diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Str.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Str.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Str.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Str.c 2019-07-23 21:37:12.000000000 +0000 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,60 @@ {0, "Bytes"}, }; +// Decode URL string +char *UrlDecode(char *url_str) +{ + UINT i, len; + BUF *b; + char *ret; + if (url_str == NULL) + { + return NULL; + } + + len = StrLen(url_str); + + b = NewBuf(); + + for (i = 0;i < len;i++) + { + char c = url_str[i]; + + if (c == '%' && ((i + 2) < len)) + { + char hex_str[8]; + UINT value; + + hex_str[0] = url_str[i + 1]; + hex_str[1] = url_str[i + 2]; + hex_str[2] = 0; + + value = HexToInt(hex_str); + + WriteBufChar(b, (UCHAR)value); + + i += 2; + continue; + } + else + { + if (c == '+') + { + c = ' '; + } + WriteBufChar(b, c); + } + } + + WriteBufChar(b, 0); + + ret = CopyStr(b->Buf); + + FreeBuf(b); + + return ret; +} + // Change the case of the string by the bit array void SetStrCaseAccordingToBits(char *str, UINT bits) { @@ -1408,6 +1463,74 @@ return ret; } + +UINT64 Json_ToInt64Ex(char *str, char **endptr, bool *error) +{ + UINT i; + UINT64 ret = 0; + if (error != NULL) *error = true; + // Validate arguments + if (str == NULL) + { + if (endptr != NULL) + { + *endptr = NULL; + } + return 0; + } + + for (i = 0;;i++) + { + char c = str[i]; + if (endptr != NULL) + { + *endptr = &str[i]; + } + if (c == 0) + { + break; + } + if ('0' <= c && c <= '9') + { + ret = ret * (UINT64)10 + (UINT64)(c - '0'); + if (error != NULL) *error = false; + } + else + { + break; + } + } + + return ret; +} + +// Trim EndWith +bool TrimEndWith(char *dst, UINT dst_size, char *str, char *key) +{ + if (dst == NULL || str == NULL) + { + ClearStr(dst, dst_size); + return false; + } + + StrCpy(dst, dst_size, str); + + if (EndWith(str, key)) + { + UINT src_len = StrLen(str); + UINT key_len = StrLen(key); + + if (src_len >= key_len) + { + dst[src_len - key_len] = 0; + } + + return true; + } + + return false; +} + // Check whether the str ends with the key bool EndWith(char *str, char *key) { @@ -3021,3 +3144,1996 @@ } + + + + +// *** JSON strings support +// Original source code from Parson ( http://kgabis.github.com/parson/ ) +// Modified by dnobori +/* +Parson ( http://kgabis.github.com/parson/ ) +Copyright (c) 2012 - 2017 Krzysztof Gabis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + + +/* Apparently sscanf is not implemented in some "standard" libraries, so don't use it, if you +* don't have to. */ +#define sscanf THINK_TWICE_ABOUT_USING_SSCANF + +#define STARTING_CAPACITY 16 +#define MAX_NESTING 2048 +#define FLOAT_FORMAT "%1.17g" + +#define SIZEOF_TOKEN(a) (sizeof(a) - 1) +#define SKIP_CHAR(str) ((*str)++) +#define SKIP_WHITESPACES(str) while (isspace((unsigned char)(**str))) { SKIP_CHAR(str); } + +static JSON_Malloc_Function parson_malloc = Malloc; +static JSON_Free_Function parson_free = Free; + +#define IS_CONT(b) (((unsigned char)(b) & 0xC0) == 0x80) /* is utf-8 continuation byte */ + +/* Various */ +static void remove_comments(char *string, char *start_token, char *end_token); +static char * parson_strndup(char *string, UINT n); +static char * parson_strdup(char *string); +static int hex_char_to_int(char c); +static int parse_utf16_hex(char *string, unsigned int *result); +static int num_bytes_in_utf8_sequence(unsigned char c); +static int verify_utf8_sequence(unsigned char *string, int *len); +static int is_valid_utf8(char *string, UINT string_len); +static int is_decimal(char *string, UINT length); + +/* JSON Object */ +static JSON_OBJECT * json_object_init(JSON_VALUE *wrapping_value); +static UINT json_object_add(JSON_OBJECT *object, char *name, JSON_VALUE *value); +static UINT json_object_resize(JSON_OBJECT *object, UINT new_capacity); +static JSON_VALUE * json_object_nget_value(JSON_OBJECT *object, char *name, UINT n); +static void json_object_free(JSON_OBJECT *object); + +/* JSON Array */ +static JSON_ARRAY * json_array_init(JSON_VALUE *wrapping_value); +static UINT json_array_add(JSON_ARRAY *array, JSON_VALUE *value); +static UINT json_array_resize(JSON_ARRAY *array, UINT new_capacity); +static void json_array_free(JSON_ARRAY *array); + +/* JSON Value */ +static JSON_VALUE * json_value_init_string_no_copy(char *string); + +/* Parser */ +static UINT skip_quotes(char **string); +static int parse_utf16(char **unprocessed, char **processed); +static char * process_string(char *input, UINT len); +static char * get_quoted_string(char **string); +static JSON_VALUE * parse_object_value(char **string, UINT nesting); +static JSON_VALUE * parse_array_value(char **string, UINT nesting); +static JSON_VALUE * parse_string_value(char **string); +static JSON_VALUE * parse_boolean_value(char **string); +static JSON_VALUE * parse_number_value(char **string); +static JSON_VALUE * parse_null_value(char **string); +static JSON_VALUE * parse_value(char **string, UINT nesting); + +/* Serialization */ +static int json_serialize_to_buffer_r(JSON_VALUE *value, char *buf, int level, int is_pretty, char *num_buf); +static int json_serialize_string(char *string, char *buf); +static int append_indent(char *buf, int level); +static int append_string(char *buf, char *string); + +/* Various */ +static char * parson_strndup(char *string, UINT n) { + char *output_string = (char*)parson_malloc(n + 1); + if (!output_string) { + return NULL; + } + output_string[n] = '\0'; + strncpy(output_string, string, n); + return output_string; +} + +static char * parson_strdup(char *string) { + return parson_strndup(string, StrLen(string)); +} + +static int hex_char_to_int(char c) { + if (c >= '0' && c <= '9') { + return c - '0'; + } + else if (c >= 'a' && c <= 'f') { + return c - 'a' + 10; + } + else if (c >= 'A' && c <= 'F') { + return c - 'A' + 10; + } + return -1; +} + +static int parse_utf16_hex(char *s, unsigned int *result) { + int x1, x2, x3, x4; + if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0' || s[3] == '\0') { + return 0; + } + x1 = hex_char_to_int(s[0]); + x2 = hex_char_to_int(s[1]); + x3 = hex_char_to_int(s[2]); + x4 = hex_char_to_int(s[3]); + if (x1 == -1 || x2 == -1 || x3 == -1 || x4 == -1) { + return 0; + } + *result = (unsigned int)((x1 << 12) | (x2 << 8) | (x3 << 4) | x4); + return 1; +} + +static int num_bytes_in_utf8_sequence(unsigned char c) { + if (c == 0xC0 || c == 0xC1 || c > 0xF4 || IS_CONT(c)) { + return 0; + } + else if ((c & 0x80) == 0) { /* 0xxxxxxx */ + return 1; + } + else if ((c & 0xE0) == 0xC0) { /* 110xxxxx */ + return 2; + } + else if ((c & 0xF0) == 0xE0) { /* 1110xxxx */ + return 3; + } + else if ((c & 0xF8) == 0xF0) { /* 11110xxx */ + return 4; + } + return 0; /* won't happen */ +} + +static int verify_utf8_sequence(unsigned char *string, int *len) { + unsigned int cp = 0; + *len = num_bytes_in_utf8_sequence(string[0]); + + if (*len == 1) { + cp = string[0]; + } + else if (*len == 2 && IS_CONT(string[1])) { + cp = string[0] & 0x1F; + cp = (cp << 6) | (string[1] & 0x3F); + } + else if (*len == 3 && IS_CONT(string[1]) && IS_CONT(string[2])) { + cp = ((unsigned char)string[0]) & 0xF; + cp = (cp << 6) | (string[1] & 0x3F); + cp = (cp << 6) | (string[2] & 0x3F); + } + else if (*len == 4 && IS_CONT(string[1]) && IS_CONT(string[2]) && IS_CONT(string[3])) { + cp = string[0] & 0x7; + cp = (cp << 6) | (string[1] & 0x3F); + cp = (cp << 6) | (string[2] & 0x3F); + cp = (cp << 6) | (string[3] & 0x3F); + } + else { + return 0; + } + + /* overlong encodings */ + if ((cp < 0x80 && *len > 1) || + (cp < 0x800 && *len > 2) || + (cp < 0x10000 && *len > 3)) { + return 0; + } + + /* invalid unicode */ + if (cp > 0x10FFFF) { + return 0; + } + + /* surrogate halves */ + if (cp >= 0xD800 && cp <= 0xDFFF) { + return 0; + } + + return 1; +} + +static int is_valid_utf8(char *string, UINT string_len) { + int len = 0; + char *string_end = string + string_len; + while (string < string_end) { + if (!verify_utf8_sequence((unsigned char*)string, &len)) { + return 0; + } + string += len; + } + return 1; +} + +static int is_decimal(char *string, UINT length) { + if (length > 1 && string[0] == '0' && string[1] != '.') { + return 0; + } + if (length > 2 && !strncmp(string, "-0", 2) && string[2] != '.') { + return 0; + } + while (length--) { + if (strchr("xX", string[length])) { + return 0; + } + } + return 1; +} + +static void remove_comments(char *string, char *start_token, char *end_token) { + int in_string = 0, escaped = 0; + UINT i; + char *ptr = NULL, current_char; + UINT start_token_len = StrLen(start_token); + UINT end_token_len = StrLen(end_token); + if (start_token_len == 0 || end_token_len == 0) { + return; + } + while ((current_char = *string) != '\0') { + if (current_char == '\\' && !escaped) { + escaped = 1; + string++; + continue; + } + else if (current_char == '\"' && !escaped) { + in_string = !in_string; + } + else if (!in_string && strncmp(string, start_token, start_token_len) == 0) { + for (i = 0; i < start_token_len; i++) { + string[i] = ' '; + } + string = string + start_token_len; + ptr = strstr(string, end_token); + if (!ptr) { + return; + } + for (i = 0; i < (ptr - string) + end_token_len; i++) { + string[i] = ' '; + } + string = ptr + end_token_len - 1; + } + escaped = 0; + string++; + } +} + +/* JSON Object */ +static JSON_OBJECT * json_object_init(JSON_VALUE *wrapping_value) { + JSON_OBJECT *new_obj = (JSON_OBJECT*)parson_malloc(sizeof(JSON_OBJECT)); + if (new_obj == NULL) { + return NULL; + } + new_obj->wrapping_value = wrapping_value; + new_obj->names = (char**)NULL; + new_obj->values = (JSON_VALUE**)NULL; + new_obj->capacity = 0; + new_obj->count = 0; + return new_obj; +} + +static UINT json_object_add(JSON_OBJECT *object, char *name, JSON_VALUE *value) { + UINT index = 0; + if (object == NULL || name == NULL || value == NULL) { + return JSON_RET_ERROR; + } + if (JsonGet(object, name) != NULL) { + return JSON_RET_ERROR; + } + if (object->count >= object->capacity) { + UINT new_capacity = MAX(object->capacity * 2, STARTING_CAPACITY); + if (json_object_resize(object, new_capacity) == JSON_RET_ERROR) { + return JSON_RET_ERROR; + } + } + index = object->count; + object->names[index] = parson_strdup(name); + if (object->names[index] == NULL) { + return JSON_RET_ERROR; + } + value->parent = JsonGetWrappingValue(object); + object->values[index] = value; + object->count++; + return JSON_RET_OK; +} + +static UINT json_object_resize(JSON_OBJECT *object, UINT new_capacity) { + char **temp_names = NULL; + JSON_VALUE **temp_values = NULL; + + if ((object->names == NULL && object->values != NULL) || + (object->names != NULL && object->values == NULL) || + new_capacity == 0) { + return JSON_RET_ERROR; /* Shouldn't happen */ + } + temp_names = (char**)parson_malloc(new_capacity * sizeof(char*)); + if (temp_names == NULL) { + return JSON_RET_ERROR; + } + temp_values = (JSON_VALUE**)parson_malloc(new_capacity * sizeof(JSON_VALUE*)); + if (temp_values == NULL) { + parson_free(temp_names); + return JSON_RET_ERROR; + } + if (object->names != NULL && object->values != NULL && object->count > 0) { + memcpy(temp_names, object->names, object->count * sizeof(char*)); + memcpy(temp_values, object->values, object->count * sizeof(JSON_VALUE*)); + } + parson_free(object->names); + parson_free(object->values); + object->names = temp_names; + object->values = temp_values; + object->capacity = new_capacity; + return JSON_RET_OK; +} + +static JSON_VALUE * json_object_nget_value(JSON_OBJECT *object, char *name, UINT n) { + UINT i, name_length; + for (i = 0; i < JsonGetCount(object); i++) { + name_length = StrLen(object->names[i]); + if (name_length != n) { + continue; + } + if (strncmp(object->names[i], name, n) == 0) { + return object->values[i]; + } + } + return NULL; +} + +static void json_object_free(JSON_OBJECT *object) { + UINT i; + for (i = 0; i < object->count; i++) { + parson_free(object->names[i]); + JsonFree(object->values[i]); + } + parson_free(object->names); + parson_free(object->values); + parson_free(object); +} + +/* JSON Array */ +static JSON_ARRAY * json_array_init(JSON_VALUE *wrapping_value) { + JSON_ARRAY *new_array = (JSON_ARRAY*)parson_malloc(sizeof(JSON_ARRAY)); + if (new_array == NULL) { + return NULL; + } + new_array->wrapping_value = wrapping_value; + new_array->items = (JSON_VALUE**)NULL; + new_array->capacity = 0; + new_array->count = 0; + return new_array; +} + +static UINT json_array_add(JSON_ARRAY *array, JSON_VALUE *value) { + if (array->count >= array->capacity) { + UINT new_capacity = MAX(array->capacity * 2, STARTING_CAPACITY); + if (json_array_resize(array, new_capacity) == JSON_RET_ERROR) { + return JSON_RET_ERROR; + } + } + value->parent = JsonArrayGetWrappingValue(array); + array->items[array->count] = value; + array->count++; + return JSON_RET_OK; +} + +static UINT json_array_resize(JSON_ARRAY *array, UINT new_capacity) { + JSON_VALUE **new_items = NULL; + if (new_capacity == 0) { + return JSON_RET_ERROR; + } + new_items = (JSON_VALUE**)parson_malloc(new_capacity * sizeof(JSON_VALUE*)); + if (new_items == NULL) { + return JSON_RET_ERROR; + } + if (array->items != NULL && array->count > 0) { + memcpy(new_items, array->items, array->count * sizeof(JSON_VALUE*)); + } + parson_free(array->items); + array->items = new_items; + array->capacity = new_capacity; + return JSON_RET_OK; +} + +static void json_array_free(JSON_ARRAY *array) { + UINT i; + for (i = 0; i < array->count; i++) { + JsonFree(array->items[i]); + } + parson_free(array->items); + parson_free(array); +} + +/* JSON Value */ +static JSON_VALUE * json_value_init_string_no_copy(char *string) { + JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE)); + if (!new_value) { + return NULL; + } + new_value->parent = NULL; + new_value->type = JSON_TYPE_STRING; + new_value->value.string = string; + return new_value; +} + +/* Parser */ +static UINT skip_quotes(char **string) { + if (**string != '\"') { + return JSON_RET_ERROR; + } + SKIP_CHAR(string); + while (**string != '\"') { + if (**string == '\0') { + return JSON_RET_ERROR; + } + else if (**string == '\\') { + SKIP_CHAR(string); + if (**string == '\0') { + return JSON_RET_ERROR; + } + } + SKIP_CHAR(string); + } + SKIP_CHAR(string); + return JSON_RET_OK; +} + +static int parse_utf16(char **unprocessed, char **processed) { + unsigned int cp, lead, trail; + int parse_succeeded = 0; + char *processed_ptr = *processed; + char *unprocessed_ptr = *unprocessed; + unprocessed_ptr++; /* skips u */ + parse_succeeded = parse_utf16_hex(unprocessed_ptr, &cp); + if (!parse_succeeded) { + return JSON_RET_ERROR; + } + if (cp < 0x80) { + processed_ptr[0] = (char)cp; /* 0xxxxxxx */ + } + else if (cp < 0x800) { + processed_ptr[0] = ((cp >> 6) & 0x1F) | 0xC0; /* 110xxxxx */ + processed_ptr[1] = ((cp) & 0x3F) | 0x80; /* 10xxxxxx */ + processed_ptr += 1; + } + else if (cp < 0xD800 || cp > 0xDFFF) { + processed_ptr[0] = ((cp >> 12) & 0x0F) | 0xE0; /* 1110xxxx */ + processed_ptr[1] = ((cp >> 6) & 0x3F) | 0x80; /* 10xxxxxx */ + processed_ptr[2] = ((cp) & 0x3F) | 0x80; /* 10xxxxxx */ + processed_ptr += 2; + } + else if (cp >= 0xD800 && cp <= 0xDBFF) { /* lead surrogate (0xD800..0xDBFF) */ + lead = cp; + unprocessed_ptr += 4; /* should always be within the buffer, otherwise previous sscanf would fail */ + if (*unprocessed_ptr++ != '\\' || *unprocessed_ptr++ != 'u') { + return JSON_RET_ERROR; + } + parse_succeeded = parse_utf16_hex(unprocessed_ptr, &trail); + if (!parse_succeeded || trail < 0xDC00 || trail > 0xDFFF) { /* valid trail surrogate? (0xDC00..0xDFFF) */ + return JSON_RET_ERROR; + } + cp = ((((lead - 0xD800) & 0x3FF) << 10) | ((trail - 0xDC00) & 0x3FF)) + 0x010000; + processed_ptr[0] = (((cp >> 18) & 0x07) | 0xF0); /* 11110xxx */ + processed_ptr[1] = (((cp >> 12) & 0x3F) | 0x80); /* 10xxxxxx */ + processed_ptr[2] = (((cp >> 6) & 0x3F) | 0x80); /* 10xxxxxx */ + processed_ptr[3] = (((cp) & 0x3F) | 0x80); /* 10xxxxxx */ + processed_ptr += 3; + } + else { /* trail surrogate before lead surrogate */ + return JSON_RET_ERROR; + } + unprocessed_ptr += 3; + *processed = processed_ptr; + *unprocessed = unprocessed_ptr; + return JSON_RET_OK; +} + + +/* Copies and processes passed string up to supplied length. +Example: "\u006Corem ipsum" -> lorem ipsum */ +static char* process_string(char *input, UINT len) { + char *input_ptr = input; + UINT initial_size = (len + 1) * sizeof(char); + UINT final_size = 0; + char *output = NULL, *output_ptr = NULL, *resized_output = NULL; + output = (char*)parson_malloc(initial_size); + if (output == NULL) { + goto error; + } + output_ptr = output; + while ((*input_ptr != '\0') && (UINT)(input_ptr - input) < len) { + if (*input_ptr == '\\') { + input_ptr++; + switch (*input_ptr) { + case '\"': *output_ptr = '\"'; break; + case '\\': *output_ptr = '\\'; break; + case '/': *output_ptr = '/'; break; + case 'b': *output_ptr = '\b'; break; + case 'f': *output_ptr = '\f'; break; + case 'n': *output_ptr = '\n'; break; + case 'r': *output_ptr = '\r'; break; + case 't': *output_ptr = '\t'; break; + case 'u': + if (parse_utf16(&input_ptr, &output_ptr) == JSON_RET_ERROR) { + goto error; + } + break; + default: + goto error; + } + } + else if ((unsigned char)*input_ptr < 0x20) { + goto error; /* 0x00-0x19 are invalid characters for json string (http://www.ietf.org/rfc/rfc4627.txt) */ + } + else { + *output_ptr = *input_ptr; + } + output_ptr++; + input_ptr++; + } + *output_ptr = '\0'; + /* resize to new length */ + final_size = (UINT)(output_ptr - output) + 1; + /* todo: don't resize if final_size == initial_size */ + resized_output = (char*)parson_malloc(final_size); + if (resized_output == NULL) { + goto error; + } + memcpy(resized_output, output, final_size); + parson_free(output); + return resized_output; +error: + parson_free(output); + return NULL; +} + +/* Return processed contents of a string between quotes and +skips passed argument to a matching quote. */ +static char * get_quoted_string(char **string) { + char *string_start = *string; + UINT string_len = 0; + UINT status = skip_quotes(string); + if (status != JSON_RET_OK) { + return NULL; + } + string_len = (UINT)(*string - string_start - 2); /* length without quotes */ + return process_string(string_start + 1, string_len); +} + +static JSON_VALUE * parse_value(char **string, UINT nesting) { + if (nesting > MAX_NESTING) { + return NULL; + } + SKIP_WHITESPACES(string); + switch (**string) { + case '{': + return parse_object_value(string, nesting + 1); + case '[': + return parse_array_value(string, nesting + 1); + case '\"': + return parse_string_value(string); + case 'f': case 't': + return parse_boolean_value(string); + case '-': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return parse_number_value(string); + case 'n': + return parse_null_value(string); + default: + return NULL; + } +} + +static JSON_VALUE * parse_object_value(char **string, UINT nesting) { + JSON_VALUE *output_value = JsonNewObject(), *new_value = NULL; + JSON_OBJECT *output_object = JsonValueGetObject(output_value); + char *new_key = NULL; + if (output_value == NULL || **string != '{') { + return NULL; + } + SKIP_CHAR(string); + SKIP_WHITESPACES(string); + if (**string == '}') { /* empty object */ + SKIP_CHAR(string); + return output_value; + } + while (**string != '\0') { + new_key = get_quoted_string(string); + if (new_key == NULL) { + JsonFree(output_value); + return NULL; + } + SKIP_WHITESPACES(string); + if (**string != ':') { + parson_free(new_key); + JsonFree(output_value); + return NULL; + } + SKIP_CHAR(string); + new_value = parse_value(string, nesting); + if (new_value == NULL) { + parson_free(new_key); + JsonFree(output_value); + return NULL; + } + if (json_object_add(output_object, new_key, new_value) == JSON_RET_ERROR) { + parson_free(new_key); + JsonFree(new_value); + JsonFree(output_value); + return NULL; + } + parson_free(new_key); + SKIP_WHITESPACES(string); + if (**string != ',') { + break; + } + SKIP_CHAR(string); + SKIP_WHITESPACES(string); + } + SKIP_WHITESPACES(string); + if (**string != '}' || /* Trim object after parsing is over */ + json_object_resize(output_object, JsonGetCount(output_object)) == JSON_RET_ERROR) { + JsonFree(output_value); + return NULL; + } + SKIP_CHAR(string); + return output_value; +} + +static JSON_VALUE * parse_array_value(char **string, UINT nesting) { + JSON_VALUE *output_value = JsonNewArray(), *new_array_value = NULL; + JSON_ARRAY *output_array = JsonValueGetArray(output_value); + if (!output_value || **string != '[') { + return NULL; + } + SKIP_CHAR(string); + SKIP_WHITESPACES(string); + if (**string == ']') { /* empty array */ + SKIP_CHAR(string); + return output_value; + } + while (**string != '\0') { + new_array_value = parse_value(string, nesting); + if (new_array_value == NULL) { + JsonFree(output_value); + return NULL; + } + if (json_array_add(output_array, new_array_value) == JSON_RET_ERROR) { + JsonFree(new_array_value); + JsonFree(output_value); + return NULL; + } + SKIP_WHITESPACES(string); + if (**string != ',') { + break; + } + SKIP_CHAR(string); + SKIP_WHITESPACES(string); + } + SKIP_WHITESPACES(string); + if (**string != ']' || /* Trim array after parsing is over */ + json_array_resize(output_array, JsonArrayGetCount(output_array)) == JSON_RET_ERROR) { + JsonFree(output_value); + return NULL; + } + SKIP_CHAR(string); + return output_value; +} + +static JSON_VALUE * parse_string_value(char **string) { + JSON_VALUE *value = NULL; + char *new_string = get_quoted_string(string); + if (new_string == NULL) { + return NULL; + } + value = json_value_init_string_no_copy(new_string); + if (value == NULL) { + parson_free(new_string); + return NULL; + } + return value; +} + +static JSON_VALUE * parse_boolean_value(char **string) { + UINT true_token_size = SIZEOF_TOKEN("true"); + UINT false_token_size = SIZEOF_TOKEN("false"); + if (strncmp("true", *string, true_token_size) == 0) { + *string += true_token_size; + return JsonNewBool(1); + } + else if (strncmp("false", *string, false_token_size) == 0) { + *string += false_token_size; + return JsonNewBool(0); + } + return NULL; +} + +static JSON_VALUE * parse_number_value(char **string) { + char *end; + bool error = false; + UINT64 number = 0; + number = Json_ToInt64Ex(*string, &end, &error); + + if (error) + { + return NULL; + } + *string = end; + return JsonNewNumber(number); +} + +static JSON_VALUE * parse_null_value(char **string) { + UINT token_size = SIZEOF_TOKEN("null"); + if (strncmp("null", *string, token_size) == 0) { + *string += token_size; + return JsonNewNull(); + } + return NULL; +} + +/* Serialization */ +#define APPEND_STRING(str) do { written = append_string(buf, (str));\ + if (written < 0) { return -1; }\ + if (buf != NULL) { buf += written; }\ + written_total += written; } while(0) + +#define APPEND_INDENT(level) do { written = append_indent(buf, (level));\ + if (written < 0) { return -1; }\ + if (buf != NULL) { buf += written; }\ + written_total += written; } while(0) + +static int json_serialize_to_buffer_r(JSON_VALUE *value, char *buf, int level, int is_pretty, char *num_buf) +{ + char *key = NULL, *string = NULL; + JSON_VALUE *temp_value = NULL; + JSON_ARRAY *array = NULL; + JSON_OBJECT *object = NULL; + UINT i = 0, count = 0; + UINT64 num = 0; + int written = -1, written_total = 0; + char tmp[32]; + + switch (JsonValueGetType(value)) { + case JSON_TYPE_ARRAY: + array = JsonValueGetArray(value); + count = JsonArrayGetCount(array); + APPEND_STRING("["); + if (count > 0 && is_pretty) { + APPEND_STRING("\n"); + } + for (i = 0; i < count; i++) { + if (is_pretty) { + APPEND_INDENT(level + 1); + } + temp_value = JsonArrayGet(array, i); + written = json_serialize_to_buffer_r(temp_value, buf, level + 1, is_pretty, num_buf); + if (written < 0) { + return -1; + } + if (buf != NULL) { + buf += written; + } + written_total += written; + if (i < (count - 1)) { + APPEND_STRING(","); + } + if (is_pretty) { + APPEND_STRING("\n"); + } + } + if (count > 0 && is_pretty) { + APPEND_INDENT(level); + } + APPEND_STRING("]"); + return written_total; + case JSON_TYPE_OBJECT: + object = JsonValueGetObject(value); + count = JsonGetCount(object); + APPEND_STRING("{"); + if (count > 0 && is_pretty) { + APPEND_STRING("\n"); + } + for (i = 0; i < count; i++) { + key = JsonGetName(object, i); + if (key == NULL) { + return -1; + } + if (is_pretty) { + APPEND_INDENT(level + 1); + } + written = json_serialize_string(key, buf); + if (written < 0) { + return -1; + } + if (buf != NULL) { + buf += written; + } + written_total += written; + APPEND_STRING(":"); + if (is_pretty) { + APPEND_STRING(" "); + } + temp_value = JsonGet(object, key); + written = json_serialize_to_buffer_r(temp_value, buf, level + 1, is_pretty, num_buf); + if (written < 0) { + return -1; + } + if (buf != NULL) { + buf += written; + } + written_total += written; + if (i < (count - 1)) { + APPEND_STRING(","); + } + if (is_pretty) { + APPEND_STRING("\n"); + } + } + if (count > 0 && is_pretty) { + APPEND_INDENT(level); + } + APPEND_STRING("}"); + return written_total; + case JSON_TYPE_STRING: + string = JsonValueGetStr(value); + if (string == NULL) { + return -1; + } + written = json_serialize_string(string, buf); + if (written < 0) { + return -1; + } + if (buf != NULL) { + buf += written; + } + written_total += written; + return written_total; + case JSON_TYPE_BOOL: + if (JsonValueGetBool(value)) { + APPEND_STRING("true"); + } + else { + APPEND_STRING("false"); + } + return written_total; + case JSON_TYPE_NUMBER: + num = JsonValueGetNumber(value); + if (buf != NULL) { + num_buf = buf; + } + ToStr64(tmp, num); + Copy(num_buf, tmp, StrLen(tmp)); + written = StrLen(tmp); + if (buf != NULL) { + buf += written; + } + written_total += written; + return written_total; + case JSON_TYPE_NULL: + APPEND_STRING("null"); + return written_total; + case JSON_TYPE_ERROR: + return -1; + default: + return -1; + } +} + +static int json_serialize_string(char *string, char *buf) { + UINT i = 0, len = StrLen(string); + char c = '\0'; + int written = -1, written_total = 0; + APPEND_STRING("\""); + for (i = 0; i < len; i++) { + c = string[i]; + switch (c) { + case '\"': APPEND_STRING("\\\""); break; + case '\\': APPEND_STRING("\\\\"); break; + case '/': APPEND_STRING("\\/"); break; /* to make json embeddable in xml\/html */ + case '\b': APPEND_STRING("\\b"); break; + case '\f': APPEND_STRING("\\f"); break; + case '\n': APPEND_STRING("\\n"); break; + case '\r': APPEND_STRING("\\r"); break; + case '\t': APPEND_STRING("\\t"); break; + case '\x00': APPEND_STRING("\\u0000"); break; + case '\x01': APPEND_STRING("\\u0001"); break; + case '\x02': APPEND_STRING("\\u0002"); break; + case '\x03': APPEND_STRING("\\u0003"); break; + case '\x04': APPEND_STRING("\\u0004"); break; + case '\x05': APPEND_STRING("\\u0005"); break; + case '\x06': APPEND_STRING("\\u0006"); break; + case '\x07': APPEND_STRING("\\u0007"); break; + /* '\x08' duplicate: '\b' */ + /* '\x09' duplicate: '\t' */ + /* '\x0a' duplicate: '\n' */ + case '\x0b': APPEND_STRING("\\u000b"); break; + /* '\x0c' duplicate: '\f' */ + /* '\x0d' duplicate: '\r' */ + case '\x0e': APPEND_STRING("\\u000e"); break; + case '\x0f': APPEND_STRING("\\u000f"); break; + case '\x10': APPEND_STRING("\\u0010"); break; + case '\x11': APPEND_STRING("\\u0011"); break; + case '\x12': APPEND_STRING("\\u0012"); break; + case '\x13': APPEND_STRING("\\u0013"); break; + case '\x14': APPEND_STRING("\\u0014"); break; + case '\x15': APPEND_STRING("\\u0015"); break; + case '\x16': APPEND_STRING("\\u0016"); break; + case '\x17': APPEND_STRING("\\u0017"); break; + case '\x18': APPEND_STRING("\\u0018"); break; + case '\x19': APPEND_STRING("\\u0019"); break; + case '\x1a': APPEND_STRING("\\u001a"); break; + case '\x1b': APPEND_STRING("\\u001b"); break; + case '\x1c': APPEND_STRING("\\u001c"); break; + case '\x1d': APPEND_STRING("\\u001d"); break; + case '\x1e': APPEND_STRING("\\u001e"); break; + case '\x1f': APPEND_STRING("\\u001f"); break; + default: + if (buf != NULL) { + buf[0] = c; + buf += 1; + } + written_total += 1; + break; + } + } + APPEND_STRING("\""); + return written_total; +} + +static int append_indent(char *buf, int level) { + int i; + int written = -1, written_total = 0; + for (i = 0; i < level; i++) { + APPEND_STRING(" "); + } + return written_total; +} + +static int append_string(char *buf, char *string) { + if (buf == NULL) { + return (int)strlen(string); + } + return sprintf(buf, "%s", string); +} + +#undef APPEND_STRING +#undef APPEND_INDENT + +JSON_VALUE * JsonParseString(char *string) { + if (string == NULL) { + return NULL; + } + if (string[0] == '\xEF' && string[1] == '\xBB' && string[2] == '\xBF') { + string = string + 3; /* Support for UTF-8 BOM */ + } + return parse_value((char**)&string, 0); +} + +JSON_VALUE * JsonParseStringWithComments(char *string) { + JSON_VALUE *result = NULL; + char *string_mutable_copy = NULL, *string_mutable_copy_ptr = NULL; + string_mutable_copy = parson_strdup(string); + if (string_mutable_copy == NULL) { + return NULL; + } + remove_comments(string_mutable_copy, "/*", "*/"); + remove_comments(string_mutable_copy, "//", "\n"); + string_mutable_copy_ptr = string_mutable_copy; + result = parse_value((char**)&string_mutable_copy_ptr, 0); + parson_free(string_mutable_copy); + return result; +} + +/* JSON Object API */ + +JSON_VALUE * JsonGet(JSON_OBJECT *object, char *name) { + if (object == NULL || name == NULL) { + return NULL; + } + return json_object_nget_value(object, name, StrLen(name)); +} + +char * JsonGetStr(JSON_OBJECT *object, char *name) { + return JsonValueGetStr(JsonGet(object, name)); +} + +UINT64 JsonGetNumber(JSON_OBJECT *object, char *name) { + return JsonValueGetNumber(JsonGet(object, name)); +} + +JSON_OBJECT * JsonGetObj(JSON_OBJECT *object, char *name) { + return JsonValueGetObject(JsonGet(object, name)); +} + +JSON_ARRAY * JsonGetArray(JSON_OBJECT *object, char *name) { + return JsonValueGetArray(JsonGet(object, name)); +} + +bool JsonGetBool(JSON_OBJECT *object, char *name) { + return JsonValueGetBool(JsonGet(object, name)); +} + +JSON_VALUE * JsonDotGet(JSON_OBJECT *object, char *name) { + char *dot_position = strchr(name, '.'); + if (!dot_position) { + return JsonGet(object, name); + } + object = JsonValueGetObject(json_object_nget_value(object, name, (UINT)(dot_position - name))); + return JsonDotGet(object, dot_position + 1); +} + +char * JsonDotGetStr(JSON_OBJECT *object, char *name) { + return JsonValueGetStr(JsonDotGet(object, name)); +} + +UINT64 JsonDotGetNumber(JSON_OBJECT *object, char *name) { + return JsonValueGetNumber(JsonDotGet(object, name)); +} + +JSON_OBJECT * JsonDotGetObj(JSON_OBJECT *object, char *name) { + return JsonValueGetObject(JsonDotGet(object, name)); +} + +JSON_ARRAY * JsonDotGetArray(JSON_OBJECT *object, char *name) { + return JsonValueGetArray(JsonDotGet(object, name)); +} + +bool JsonDotGetBool(JSON_OBJECT *object, char *name) { + return JsonValueGetBool(JsonDotGet(object, name)); +} + +UINT JsonGetCount(JSON_OBJECT *object) { + return object ? object->count : 0; +} + +char * JsonGetName(JSON_OBJECT *object, UINT index) { + if (object == NULL || index >= JsonGetCount(object)) { + return NULL; + } + return object->names[index]; +} + +JSON_VALUE * JsonGetValueAt(JSON_OBJECT *object, UINT index) { + if (object == NULL || index >= JsonGetCount(object)) { + return NULL; + } + return object->values[index]; +} + +JSON_VALUE *JsonGetWrappingValue(JSON_OBJECT *object) { + return object->wrapping_value; +} + +int JsonIsExists(JSON_OBJECT *object, char *name) { + return JsonGet(object, name) != NULL; +} + +int JsonIsExistsWithValueType(JSON_OBJECT *object, char *name, UINT type) { + JSON_VALUE *val = JsonGet(object, name); + return val != NULL && JsonValueGetType(val) == type; +} + +int JsonDotIsExists(JSON_OBJECT *object, char *name) { + return JsonDotGet(object, name) != NULL; +} + +int JsonDotIsExistsWithValueType(JSON_OBJECT *object, char *name, UINT type) { + JSON_VALUE *val = JsonDotGet(object, name); + return val != NULL && JsonValueGetType(val) == type; +} + +/* JSON Array API */ +JSON_VALUE * JsonArrayGet(JSON_ARRAY *array, UINT index) { + if (array == NULL || index >= JsonArrayGetCount(array)) { + return NULL; + } + return array->items[index]; +} + +char * JsonArrayGetStr(JSON_ARRAY *array, UINT index) { + return JsonValueGetStr(JsonArrayGet(array, index)); +} + +UINT64 JsonArrayGetNumber(JSON_ARRAY *array, UINT index) { + return JsonValueGetNumber(JsonArrayGet(array, index)); +} + +JSON_OBJECT * JsonArrayGetObj(JSON_ARRAY *array, UINT index) { + return JsonValueGetObject(JsonArrayGet(array, index)); +} + +JSON_ARRAY * JsonArrayGetArray(JSON_ARRAY *array, UINT index) { + return JsonValueGetArray(JsonArrayGet(array, index)); +} + +bool JsonArrayGetBool(JSON_ARRAY *array, UINT index) { + return JsonValueGetBool(JsonArrayGet(array, index)); +} + +UINT JsonArrayGetCount(JSON_ARRAY *array) { + return array ? array->count : 0; +} + +JSON_VALUE * JsonArrayGetWrappingValue(JSON_ARRAY *array) { + return array->wrapping_value; +} + +/* JSON Value API */ +UINT JsonValueGetType(JSON_VALUE *value) { + return value ? value->type : JSON_TYPE_ERROR; +} + +JSON_OBJECT * JsonValueGetObject(JSON_VALUE *value) { + if (value == NULL) + { + return NULL; + } + return JsonValueGetType(value) == JSON_TYPE_OBJECT ? value->value.object : NULL; +} + +JSON_ARRAY * JsonValueGetArray(JSON_VALUE *value) { + return JsonValueGetType(value) == JSON_TYPE_ARRAY ? value->value.array : NULL; +} + +char * JsonValueGetStr(JSON_VALUE *value) { + return JsonValueGetType(value) == JSON_TYPE_STRING ? value->value.string : NULL; +} + +UINT64 JsonValueGetNumber(JSON_VALUE *value) { + return JsonValueGetType(value) == JSON_TYPE_NUMBER ? value->value.number : 0; +} + +bool JsonValueGetBool(JSON_VALUE *value) { + return JsonValueGetType(value) == JSON_TYPE_BOOL ? value->value.boolean : 0; +} + +JSON_VALUE * JsonValueGetParent(JSON_VALUE *value) { + return value ? value->parent : NULL; +} + +void JsonFree(JSON_VALUE *value) { + if (value == NULL) + { + return; + } + switch (JsonValueGetType(value)) { + case JSON_TYPE_OBJECT: + json_object_free(value->value.object); + break; + case JSON_TYPE_STRING: + parson_free(value->value.string); + break; + case JSON_TYPE_ARRAY: + json_array_free(value->value.array); + break; + default: + break; + } + parson_free(value); +} + +JSON_VALUE * JsonNewObject(void) { + JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE)); + if (!new_value) { + return NULL; + } + new_value->parent = NULL; + new_value->type = JSON_TYPE_OBJECT; + new_value->value.object = json_object_init(new_value); + if (!new_value->value.object) { + parson_free(new_value); + return NULL; + } + return new_value; +} + +JSON_VALUE * JsonNewArray(void) { + JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE)); + if (!new_value) { + return NULL; + } + new_value->parent = NULL; + new_value->type = JSON_TYPE_ARRAY; + new_value->value.array = json_array_init(new_value); + if (!new_value->value.array) { + parson_free(new_value); + return NULL; + } + return new_value; +} + +JSON_VALUE * JsonNewStr(char *string) { + char *copy = NULL; + JSON_VALUE *value; + UINT string_len = 0; + if (string == NULL) { + return NULL; + } + string_len = StrLen(string); + if (!is_valid_utf8(string, string_len)) { + return NULL; + } + copy = parson_strndup(string, string_len); + if (copy == NULL) { + return NULL; + } + value = json_value_init_string_no_copy(copy); + if (value == NULL) { + parson_free(copy); + } + return value; +} + +JSON_VALUE * JsonNewNumber(UINT64 number) { + JSON_VALUE *new_value = NULL; + new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE)); + if (new_value == NULL) { + return NULL; + } + new_value->parent = NULL; + new_value->type = JSON_TYPE_NUMBER; + new_value->value.number = number; + return new_value; +} + +JSON_VALUE * JsonNewBool(int boolean) { + JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE)); + if (!new_value) { + return NULL; + } + new_value->parent = NULL; + new_value->type = JSON_TYPE_BOOL; + new_value->value.boolean = boolean ? 1 : 0; + return new_value; +} + +JSON_VALUE * JsonNewNull(void) { + JSON_VALUE *new_value = (JSON_VALUE*)parson_malloc(sizeof(JSON_VALUE)); + if (!new_value) { + return NULL; + } + new_value->parent = NULL; + new_value->type = JSON_TYPE_NULL; + return new_value; +} + +JSON_VALUE * JsonDeepCopy(JSON_VALUE *value) { + UINT i = 0; + JSON_VALUE *return_value = NULL, *temp_value_copy = NULL, *temp_value = NULL; + char *temp_string = NULL, *temp_key = NULL; + char *temp_string_copy = NULL; + JSON_ARRAY *temp_array = NULL, *temp_array_copy = NULL; + JSON_OBJECT *temp_object = NULL, *temp_object_copy = NULL; + + switch (JsonValueGetType(value)) { + case JSON_TYPE_ARRAY: + temp_array = JsonValueGetArray(value); + return_value = JsonNewArray(); + if (return_value == NULL) { + return NULL; + } + temp_array_copy = JsonValueGetArray(return_value); + for (i = 0; i < JsonArrayGetCount(temp_array); i++) { + temp_value = JsonArrayGet(temp_array, i); + temp_value_copy = JsonDeepCopy(temp_value); + if (temp_value_copy == NULL) { + JsonFree(return_value); + return NULL; + } + if (json_array_add(temp_array_copy, temp_value_copy) == JSON_RET_ERROR) { + JsonFree(return_value); + JsonFree(temp_value_copy); + return NULL; + } + } + return return_value; + case JSON_TYPE_OBJECT: + temp_object = JsonValueGetObject(value); + return_value = JsonNewObject(); + if (return_value == NULL) { + return NULL; + } + temp_object_copy = JsonValueGetObject(return_value); + for (i = 0; i < JsonGetCount(temp_object); i++) { + temp_key = JsonGetName(temp_object, i); + temp_value = JsonGet(temp_object, temp_key); + temp_value_copy = JsonDeepCopy(temp_value); + if (temp_value_copy == NULL) { + JsonFree(return_value); + return NULL; + } + if (json_object_add(temp_object_copy, temp_key, temp_value_copy) == JSON_RET_ERROR) { + JsonFree(return_value); + JsonFree(temp_value_copy); + return NULL; + } + } + return return_value; + case JSON_TYPE_BOOL: + return JsonNewBool(JsonValueGetBool(value)); + case JSON_TYPE_NUMBER: + return JsonNewNumber(JsonValueGetNumber(value)); + case JSON_TYPE_STRING: + temp_string = JsonValueGetStr(value); + if (temp_string == NULL) { + return NULL; + } + temp_string_copy = parson_strdup(temp_string); + if (temp_string_copy == NULL) { + return NULL; + } + return_value = json_value_init_string_no_copy(temp_string_copy); + if (return_value == NULL) { + parson_free(temp_string_copy); + } + return return_value; + case JSON_TYPE_NULL: + return JsonNewNull(); + case JSON_TYPE_ERROR: + return NULL; + default: + return NULL; + } +} + +UINT JsonGetSerializationSize(JSON_VALUE *value) { + char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */ + int res = json_serialize_to_buffer_r(value, NULL, 0, 0, num_buf); + return res < 0 ? 0 : (UINT)(res + 1); +} + +UINT JsonSerializeToBuffer(JSON_VALUE *value, char *buf, UINT buf_size_in_bytes) { + int written = -1; + UINT needed_size_in_bytes = JsonGetSerializationSize(value); + if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) { + return JSON_RET_ERROR; + } + written = json_serialize_to_buffer_r(value, buf, 0, 0, NULL); + if (written < 0) { + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +char * JsonSerializeToString(JSON_VALUE *value) { + UINT serialization_result = JSON_RET_ERROR; + UINT buf_size_bytes = JsonGetSerializationSize(value); + char *buf = NULL; + if (buf_size_bytes == 0) { + return NULL; + } + buf = (char*)parson_malloc(buf_size_bytes); + if (buf == NULL) { + return NULL; + } + serialization_result = JsonSerializeToBuffer(value, buf, buf_size_bytes); + if (serialization_result == JSON_RET_ERROR) { + JsonFreeString(buf); + return NULL; + } + return buf; +} + +UINT JsonGetSerializationSizePretty(JSON_VALUE *value) { + char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */ + int res = json_serialize_to_buffer_r(value, NULL, 0, 1, num_buf); + return res < 0 ? 0 : (UINT)(res + 1); +} + +UINT JsonSerializeToBufferPretty(JSON_VALUE *value, char *buf, UINT buf_size_in_bytes) { + int written = -1; + UINT needed_size_in_bytes = JsonGetSerializationSizePretty(value); + if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) { + return JSON_RET_ERROR; + } + written = json_serialize_to_buffer_r(value, buf, 0, 1, NULL); + if (written < 0) { + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +JSON_VALUE *StrToJson(char *str) +{ + if (str == NULL) + { + return NULL; + } + + return JsonParseString(str); +} + +char *JsonToStr(JSON_VALUE *v) +{ + return JsonSerializeToStringPretty(v); +} +char * JsonSerializeToStringPretty(JSON_VALUE *value) { + UINT serialization_result = JSON_RET_ERROR; + UINT buf_size_bytes = JsonGetSerializationSizePretty(value); + char *buf = NULL; + if (buf_size_bytes == 0) { + return NULL; + } + buf = (char*)parson_malloc(buf_size_bytes); + if (buf == NULL) { + return NULL; + } + serialization_result = JsonSerializeToBufferPretty(value, buf, buf_size_bytes); + if (serialization_result == JSON_RET_ERROR) { + JsonFreeString(buf); + return NULL; + } + return buf; +} + +void JsonFreeString(char *string) { + parson_free(string); +} + +UINT JsonArrayDelete(JSON_ARRAY *array, UINT ix) { + UINT to_move_bytes = 0; + if (array == NULL || ix >= JsonArrayGetCount(array)) { + return JSON_RET_ERROR; + } + JsonFree(JsonArrayGet(array, ix)); + to_move_bytes = (JsonArrayGetCount(array) - 1 - ix) * sizeof(JSON_VALUE*); + memmove(array->items + ix, array->items + ix + 1, to_move_bytes); + array->count -= 1; + return JSON_RET_OK; +} + +UINT JsonArrayReplace(JSON_ARRAY *array, UINT ix, JSON_VALUE *value) { + if (array == NULL || value == NULL || value->parent != NULL || ix >= JsonArrayGetCount(array)) { + return JSON_RET_ERROR; + } + JsonFree(JsonArrayGet(array, ix)); + value->parent = JsonArrayGetWrappingValue(array); + array->items[ix] = value; + return JSON_RET_OK; +} + +UINT JsonArrayReplaceStr(JSON_ARRAY *array, UINT i, char* string) { + JSON_VALUE *value = JsonNewStr(string); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonArrayReplace(array, i, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonArrayReplaceNumber(JSON_ARRAY *array, UINT i, UINT64 number) { + JSON_VALUE *value = JsonNewNumber(number); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonArrayReplace(array, i, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonArrayReplaceBool(JSON_ARRAY *array, UINT i, int boolean) { + JSON_VALUE *value = JsonNewBool(boolean); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonArrayReplace(array, i, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonArrayReplaceNull(JSON_ARRAY *array, UINT i) { + JSON_VALUE *value = JsonNewNull(); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonArrayReplace(array, i, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonArrayDeleteAll(JSON_ARRAY *array) { + UINT i = 0; + if (array == NULL) { + return JSON_RET_ERROR; + } + for (i = 0; i < JsonArrayGetCount(array); i++) { + JsonFree(JsonArrayGet(array, i)); + } + array->count = 0; + return JSON_RET_OK; +} + +UINT JsonArrayAdd(JSON_ARRAY *array, JSON_VALUE *value) { + if (array == NULL || value == NULL || value->parent != NULL) { + return JSON_RET_ERROR; + } + return json_array_add(array, value); +} + +UINT JsonArrayAddStr(JSON_ARRAY *array, char *string) { + JSON_VALUE *value = JsonNewStr(string); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonArrayAdd(array, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonArrayAddUniStr(JSON_ARRAY *array, wchar_t *string) +{ + UINT ret; + char *utf8 = CopyUniToUtf(string); + + ret = JsonArrayAddStr(array, utf8); + + Free(utf8); + return ret; +} + +UINT JsonArrayAddNumber(JSON_ARRAY *array, UINT64 number) { + JSON_VALUE *value = JsonNewNumber(number); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonArrayAdd(array, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonArrayAddData(JSON_ARRAY *array, void *data, UINT size) +{ + UINT ret; + char *b64 = ZeroMalloc(size * 4 + 32); + B64_Encode(b64, data, size); + + ret = JsonArrayAddStr(array, b64); + + Free(b64); + return ret; +} + +UINT JsonArrayAddBool(JSON_ARRAY *array, int boolean) { + JSON_VALUE *value = JsonNewBool(boolean); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonArrayAdd(array, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonArrayAddNull(JSON_ARRAY *array) { + JSON_VALUE *value = JsonNewNull(); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonArrayAdd(array, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonSet(JSON_OBJECT *object, char *name, JSON_VALUE *value) { + UINT i = 0; + JSON_VALUE *old_value; + if (object == NULL || name == NULL || value == NULL || value->parent != NULL) { + return JSON_RET_ERROR; + } + old_value = JsonGet(object, name); + if (old_value != NULL) { /* free and overwrite old value */ + JsonFree(old_value); + for (i = 0; i < JsonGetCount(object); i++) { + if (strcmp(object->names[i], name) == 0) { + value->parent = JsonGetWrappingValue(object); + object->values[i] = value; + return JSON_RET_OK; + } + } + } + /* add new key value pair */ + return json_object_add(object, name, value); +} + +UINT JsonSetData(JSON_OBJECT *object, char *name, void *data, UINT size) +{ + UINT ret; + char *b64 = ZeroMalloc(size * 4 + 32); + B64_Encode(b64, data, size); + + ret = JsonSetStr(object, name, b64); + + Free(b64); + return ret; +} + +UINT JsonSetStr(JSON_OBJECT *object, char *name, char *string) { + return JsonSet(object, name, JsonNewStr(string)); +} + +UINT JsonSetUniStr(JSON_OBJECT *object, char *name, wchar_t *string) +{ + UINT ret; + char *utf8 = CopyUniToUtf(string); + + ret = JsonSetStr(object, name, utf8); + + Free(utf8); + return ret; +} + +UINT JsonSetNumber(JSON_OBJECT *object, char *name, UINT64 number) { + return JsonSet(object, name, JsonNewNumber(number)); +} + +UINT JsonSetBool(JSON_OBJECT *object, char *name, int boolean) { + return JsonSet(object, name, JsonNewBool(boolean)); +} + +UINT JsonSetNull(JSON_OBJECT *object, char *name) { + return JsonSet(object, name, JsonNewNull()); +} + +UINT JsonDotSet(JSON_OBJECT *object, char *name, JSON_VALUE *value) { + char *dot_pos = NULL; + char *current_name = NULL; + JSON_OBJECT *temp_obj = NULL; + JSON_VALUE *new_value = NULL; + if (object == NULL || name == NULL || value == NULL) { + return JSON_RET_ERROR; + } + dot_pos = strchr(name, '.'); + if (dot_pos == NULL) { + return JsonSet(object, name, value); + } + else { + current_name = parson_strndup(name, (UINT)(dot_pos - name)); + temp_obj = JsonGetObj(object, current_name); + if (temp_obj == NULL) { + new_value = JsonNewObject(); + if (new_value == NULL) { + parson_free(current_name); + return JSON_RET_ERROR; + } + if (json_object_add(object, current_name, new_value) == JSON_RET_ERROR) { + JsonFree(new_value); + parson_free(current_name); + return JSON_RET_ERROR; + } + temp_obj = JsonGetObj(object, current_name); + } + parson_free(current_name); + return JsonDotSet(temp_obj, dot_pos + 1, value); + } +} + +UINT JsonDotSetStr(JSON_OBJECT *object, char *name, char *string) { + JSON_VALUE *value = JsonNewStr(string); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonDotSet(object, name, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonDotSetNumber(JSON_OBJECT *object, char *name, UINT64 number) { + JSON_VALUE *value = JsonNewNumber(number); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonDotSet(object, name, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonDotSetBool(JSON_OBJECT *object, char *name, int boolean) { + JSON_VALUE *value = JsonNewBool(boolean); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonDotSet(object, name, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonDotSetNull(JSON_OBJECT *object, char *name) { + JSON_VALUE *value = JsonNewNull(); + if (value == NULL) { + return JSON_RET_ERROR; + } + if (JsonDotSet(object, name, value) == JSON_RET_ERROR) { + JsonFree(value); + return JSON_RET_ERROR; + } + return JSON_RET_OK; +} + +UINT JsonDelete(JSON_OBJECT *object, char *name) { + UINT i = 0, last_item_index = 0; + if (object == NULL || JsonGet(object, name) == NULL) { + return JSON_RET_ERROR; + } + last_item_index = JsonGetCount(object) - 1; + for (i = 0; i < JsonGetCount(object); i++) { + if (strcmp(object->names[i], name) == 0) { + parson_free(object->names[i]); + JsonFree(object->values[i]); + if (i != last_item_index) { /* Replace key value pair with one from the end */ + object->names[i] = object->names[last_item_index]; + object->values[i] = object->values[last_item_index]; + } + object->count -= 1; + return JSON_RET_OK; + } + } + return JSON_RET_ERROR; /* No execution path should end here */ +} + +UINT JsonDotDelete(JSON_OBJECT *object, char *name) { + char *dot_pos = strchr(name, '.'); + char *current_name = NULL; + JSON_OBJECT *temp_obj = NULL; + if (dot_pos == NULL) { + return JsonDelete(object, name); + } + else { + current_name = parson_strndup(name, (UINT)(dot_pos - name)); + temp_obj = JsonGetObj(object, current_name); + parson_free(current_name); + if (temp_obj == NULL) { + return JSON_RET_ERROR; + } + return JsonDotDelete(temp_obj, dot_pos + 1); + } +} + +UINT JsonDeleteAll(JSON_OBJECT *object) { + UINT i = 0; + if (object == NULL) { + return JSON_RET_ERROR; + } + for (i = 0; i < JsonGetCount(object); i++) { + parson_free(object->names[i]); + JsonFree(object->values[i]); + } + object->count = 0; + return JSON_RET_OK; +} + +UINT JsonValidate(JSON_VALUE *schema, JSON_VALUE *value) { + JSON_VALUE *temp_schema_value = NULL, *temp_value = NULL; + JSON_ARRAY *schema_array = NULL, *value_array = NULL; + JSON_OBJECT *schema_object = NULL, *value_object = NULL; + UINT schema_type = JSON_TYPE_ERROR, value_type = JSON_TYPE_ERROR; + char *key = NULL; + UINT i = 0, count = 0; + if (schema == NULL || value == NULL) { + return JSON_RET_ERROR; + } + schema_type = JsonValueGetType(schema); + value_type = JsonValueGetType(value); + if (schema_type != value_type && schema_type != JSON_TYPE_NULL) { /* null represents all values */ + return JSON_RET_ERROR; + } + switch (schema_type) { + case JSON_TYPE_ARRAY: + schema_array = JsonValueGetArray(schema); + value_array = JsonValueGetArray(value); + count = JsonArrayGetCount(schema_array); + if (count == 0) { + return JSON_RET_OK; /* Empty array allows all types */ + } + /* Get first value from array, rest is ignored */ + temp_schema_value = JsonArrayGet(schema_array, 0); + for (i = 0; i < JsonArrayGetCount(value_array); i++) { + temp_value = JsonArrayGet(value_array, i); + if (JsonValidate(temp_schema_value, temp_value) == JSON_RET_ERROR) { + return JSON_RET_ERROR; + } + } + return JSON_RET_OK; + case JSON_TYPE_OBJECT: + schema_object = JsonValueGetObject(schema); + value_object = JsonValueGetObject(value); + count = JsonGetCount(schema_object); + if (count == 0) { + return JSON_RET_OK; /* Empty object allows all objects */ + } + else if (JsonGetCount(value_object) < count) { + return JSON_RET_ERROR; /* Tested object mustn't have less name-value pairs than schema */ + } + for (i = 0; i < count; i++) { + key = JsonGetName(schema_object, i); + temp_schema_value = JsonGet(schema_object, key); + temp_value = JsonGet(value_object, key); + if (temp_value == NULL) { + return JSON_RET_ERROR; + } + if (JsonValidate(temp_schema_value, temp_value) == JSON_RET_ERROR) { + return JSON_RET_ERROR; + } + } + return JSON_RET_OK; + case JSON_TYPE_STRING: case JSON_TYPE_NUMBER: case JSON_TYPE_BOOL: case JSON_TYPE_NULL: + return JSON_RET_OK; /* equality already tested before switch */ + case JSON_TYPE_ERROR: default: + return JSON_RET_ERROR; + } +} + +int JsonCmp(JSON_VALUE *a, JSON_VALUE *b) { + JSON_OBJECT *a_object = NULL, *b_object = NULL; + JSON_ARRAY *a_array = NULL, *b_array = NULL; + char *a_string = NULL, *b_string = NULL; + char *key = NULL; + UINT a_count = 0, b_count = 0, i = 0; + UINT a_type, b_type; + UINT64 a_num, b_num; + a_type = JsonValueGetType(a); + b_type = JsonValueGetType(b); + if (a_type != b_type) { + return 0; + } + switch (a_type) { + case JSON_TYPE_ARRAY: + a_array = JsonValueGetArray(a); + b_array = JsonValueGetArray(b); + a_count = JsonArrayGetCount(a_array); + b_count = JsonArrayGetCount(b_array); + if (a_count != b_count) { + return 0; + } + for (i = 0; i < a_count; i++) { + if (!JsonCmp(JsonArrayGet(a_array, i), + JsonArrayGet(b_array, i))) { + return 0; + } + } + return 1; + case JSON_TYPE_OBJECT: + a_object = JsonValueGetObject(a); + b_object = JsonValueGetObject(b); + a_count = JsonGetCount(a_object); + b_count = JsonGetCount(b_object); + if (a_count != b_count) { + return 0; + } + for (i = 0; i < a_count; i++) { + key = JsonGetName(a_object, i); + if (!JsonCmp(JsonGet(a_object, key), + JsonGet(b_object, key))) { + return 0; + } + } + return 1; + case JSON_TYPE_STRING: + a_string = JsonValueGetStr(a); + b_string = JsonValueGetStr(b); + if (a_string == NULL || b_string == NULL) { + return 0; /* shouldn't happen */ + } + return strcmp(a_string, b_string) == 0; + case JSON_TYPE_BOOL: + return JsonValueGetBool(a) == JsonValueGetBool(b); + case JSON_TYPE_NUMBER: + a_num = JsonValueGetNumber(a); + b_num = JsonValueGetNumber(b); + return a_num == b_num; + case JSON_TYPE_ERROR: + return 1; + case JSON_TYPE_NULL: + return 1; + default: + return 1; + } +} + +UINT JsonType(JSON_VALUE *value) { + return JsonValueGetType(value); +} + +JSON_OBJECT * JsonObject(JSON_VALUE *value) { + return JsonValueGetObject(value); +} + +JSON_ARRAY * JsonArray(JSON_VALUE *value) { + return JsonValueGetArray(value); +} + +char * JsonString(JSON_VALUE *value) { + return JsonValueGetStr(value); +} + +UINT64 JsonNumber(JSON_VALUE *value) { + return JsonValueGetNumber(value); +} + +int JsonBool(JSON_VALUE *value) { + return JsonValueGetBool(value); +} + +void JsonSetAllocationFunctions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun) { + parson_malloc = malloc_fun; + parson_free = free_fun; +} + +// SYSTEMTIME to JSON string +void SystemTimeToJsonStr(char *dst, UINT size, SYSTEMTIME *t) +{ + if (dst == NULL) + { + return; + } + + if (t == NULL) + { + ClearStr(dst, size); + } + else + { + GetDateTimeStrRFC3339(dst, size, t, 0); + } +} + +// UINT64 System Time to JSON string +void SystemTime64ToJsonStr(char *dst, UINT size, UINT64 t) +{ + SYSTEMTIME st; + if (dst == NULL) + { + return; + } + + if (t == 0) + { + ClearStr(dst, size); + } + + UINT64ToSystem(&st, t); + + SystemTimeToJsonStr(dst, size, &st); +} + + + + + diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Str.h softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Str.h --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/Mayaqua/Str.h 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/Mayaqua/Str.h 2019-07-23 21:37:12.000000000 +0000 @@ -79,7 +79,9 @@ void PrintBin(void *data, UINT size); bool StartWith(char *str, char *key); bool EndWith(char *str, char *key); +bool TrimEndWith(char *dst, UINT dst_size, char *str, char *key); UINT64 ToInt64(char *str); +UINT64 Json_ToInt64Ex(char *str, char **endptr, bool *error); void ToStr64(char *str, UINT64 value); TOKEN_LIST *ParseCmdLine(char *str); TOKEN_LIST *CopyToken(TOKEN_LIST *src); @@ -128,6 +130,259 @@ void NormalizeIntListStr(char *dst, UINT dst_size, char *src, bool sorted, char *separate_str); void ClearStr(char *str, UINT str_size); void SetStrCaseAccordingToBits(char *str, UINT bits); +char *UrlDecode(char *url_str); + + +// *** JSON strings support +// Original source code from Parson ( http://kgabis.github.com/parson/ ) +// Modified by dnobori +/* +Parson ( http://kgabis.github.com/parson/ ) +Copyright (c) 2012 - 2017 Krzysztof Gabis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +/* Type definitions */ +typedef union JSON_VALUE_UNION { + char *string; + UINT64 number; + JSON_OBJECT *object; + JSON_ARRAY *array; + int boolean; + int null; +} JSON_VALUE_UNION; + +struct JSON_VALUE { + JSON_VALUE *parent; + UINT type; + JSON_VALUE_UNION value; +}; + +struct JSON_OBJECT { + JSON_VALUE *wrapping_value; + char **names; + JSON_VALUE **values; + UINT count; + UINT capacity; +}; + +struct JSON_ARRAY { + JSON_VALUE *wrapping_value; + JSON_VALUE **items; + UINT count; + UINT capacity; +}; + + +enum JSON_TYPES { + JSON_TYPE_ERROR = -1, + JSON_TYPE_NULL = 1, + JSON_TYPE_STRING = 2, + JSON_TYPE_NUMBER = 3, + JSON_TYPE_OBJECT = 4, + JSON_TYPE_ARRAY = 5, + JSON_TYPE_BOOL = 6 +}; +typedef unsigned int UINT; + +enum JSON_RETS { + JSON_RET_OK = 0, + JSON_RET_ERROR = -1 +}; + +typedef void * (*JSON_Malloc_Function)(UINT); +typedef void(*JSON_Free_Function)(void *); + +/* Call only once, before calling any other function from parson API. If not called, malloc and free +from stdlib will be used for all allocations */ +void JsonSetAllocationFunctions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun); + +/* Parses first JSON value in a string, returns NULL in case of error */ +JSON_VALUE * JsonParseString(char *string); + +/* Parses first JSON value in a string and ignores comments (/ * * / and //), +returns NULL in case of error */ +JSON_VALUE * JsonParseStringWithComments(char *string); + +/* Serialization */ +UINT JsonGetSerializationSize(JSON_VALUE *value); /* returns 0 on fail */ +UINT JsonSerializeToBuffer(JSON_VALUE *value, char *buf, UINT buf_size_in_bytes); +char * JsonSerializeToString(JSON_VALUE *value); + +/* Pretty serialization */ +UINT JsonGetSerializationSizePretty(JSON_VALUE *value); /* returns 0 on fail */ +UINT JsonSerializeToBufferPretty(JSON_VALUE *value, char *buf, UINT buf_size_in_bytes); +char * JsonSerializeToStringPretty(JSON_VALUE *value); +char *JsonToStr(JSON_VALUE *v); + +void JsonFreeString(char *string); /* frees string from json_serialize_to_string and json_serialize_to_string_pretty */ + + /* Comparing */ +int JsonCmp(JSON_VALUE *a, JSON_VALUE *b); + +/* Validation +This is *NOT* JSON Schema. It validates json by checking if object have identically +named fields with matching types. +For example schema {"name":"", "age":0} will validate +{"name":"Joe", "age":25} and {"name":"Joe", "age":25, "gender":"m"}, +but not {"name":"Joe"} or {"name":"Joe", "age":"Cucumber"}. +In case of arrays, only first value in schema is checked against all values in tested array. +Empty objects ({}) validate all objects, empty arrays ([]) validate all arrays, +null validates values of every type. +*/ +UINT JsonValidate(JSON_VALUE *schema, JSON_VALUE *value); + +/* +* JSON Object +*/ +JSON_VALUE * JsonGet(JSON_OBJECT *object, char *name); +char * JsonGetStr(JSON_OBJECT *object, char *name); +JSON_OBJECT * JsonGetObj(JSON_OBJECT *object, char *name); +JSON_ARRAY * JsonGetArray(JSON_OBJECT *object, char *name); +UINT64 JsonGetNumber(JSON_OBJECT *object, char *name); /* returns 0 on fail */ +bool JsonGetBool(JSON_OBJECT *object, char *name); /* returns 0 on fail */ + + /* dotget functions enable addressing values with dot notation in nested objects, + just like in structs or c++/java/c# objects (e.g. objectA.objectB.value). + Because valid names in JSON can contain dots, some values may be inaccessible + this way. */ +JSON_VALUE * JsonDotGet(JSON_OBJECT *object, char *name); +char * JsonDotGetStr(JSON_OBJECT *object, char *name); +JSON_OBJECT * JsonDotGetObj(JSON_OBJECT *object, char *name); +JSON_ARRAY * JsonDotGetArray(JSON_OBJECT *object, char *name); +UINT64 JsonDotGetNumber(JSON_OBJECT *object, char *name); /* returns 0 on fail */ +bool JsonDotGetBool(JSON_OBJECT *object, char *name); /* returns -1 on fail */ + + /* Functions to get available names */ +UINT JsonGetCount(JSON_OBJECT *object); +char * JsonGetName(JSON_OBJECT *object, UINT index); +JSON_VALUE * JsonGetValueAt(JSON_OBJECT *object, UINT index); +JSON_VALUE * JsonGetWrappingValue(JSON_OBJECT *object); + +/* Functions to check if object has a value with a specific name. Returned value is 1 if object has +* a value and 0 if it doesn't. dothas functions behave exactly like dotget functions. */ +int JsonIsExists(JSON_OBJECT *object, char *name); +int JsonIsExistsWithValueType(JSON_OBJECT *object, char *name, UINT type); + +int JsonDotIsExists(JSON_OBJECT *object, char *name); +int JsonDotIsExistsWithValueType(JSON_OBJECT *object, char *name, UINT type); + +/* Creates new name-value pair or frees and replaces old value with a new one. +* json_object_set_value does not copy passed value so it shouldn't be freed afterwards. */ +UINT JsonSet(JSON_OBJECT *object, char *name, JSON_VALUE *value); +UINT JsonSetStr(JSON_OBJECT *object, char *name, char *string); +UINT JsonSetUniStr(JSON_OBJECT *object, char *name, wchar_t *string); +UINT JsonSetNumber(JSON_OBJECT *object, char *name, UINT64 number); +UINT JsonSetBool(JSON_OBJECT *object, char *name, int boolean); +UINT JsonSetNull(JSON_OBJECT *object, char *name); +UINT JsonSetData(JSON_OBJECT *object, char *name, void *data, UINT size); + +/* Works like dotget functions, but creates whole hierarchy if necessary. +* json_object_dotset_value does not copy passed value so it shouldn't be freed afterwards. */ +UINT JsonDotSet(JSON_OBJECT *object, char *name, JSON_VALUE *value); +UINT JsonDotSetStr(JSON_OBJECT *object, char *name, char *string); +UINT JsonDotSetNumber(JSON_OBJECT *object, char *name, UINT64 number); +UINT JsonDotSetBool(JSON_OBJECT *object, char *name, int boolean); +UINT JsonDotSetNull(JSON_OBJECT *object, char *name); + +/* Frees and removes name-value pair */ +UINT JsonDelete(JSON_OBJECT *object, char *name); + +/* Works like dotget function, but removes name-value pair only on exact match. */ +UINT JsonDotDelete(JSON_OBJECT *object, char *key); + +/* Removes all name-value pairs in object */ +UINT JsonDeleteAll(JSON_OBJECT *object); + +/* +*JSON Array +*/ +JSON_VALUE * JsonArrayGet(JSON_ARRAY *array, UINT index); +char * JsonArrayGetStr(JSON_ARRAY *array, UINT index); +JSON_OBJECT * JsonArrayGetObj(JSON_ARRAY *array, UINT index); +JSON_ARRAY * JsonArrayGetArray(JSON_ARRAY *array, UINT index); +UINT64 JsonArrayGetNumber(JSON_ARRAY *array, UINT index); /* returns 0 on fail */ +bool JsonArrayGetBool(JSON_ARRAY *array, UINT index); /* returns 0 on fail */ +UINT JsonArrayGetCount(JSON_ARRAY *array); +JSON_VALUE * JsonArrayGetWrappingValue(JSON_ARRAY *array); + +/* Frees and removes value at given index, does nothing and returns JSONFailure if index doesn't exist. +* Order of values in array may change during execution. */ +UINT JsonArrayDelete(JSON_ARRAY *array, UINT i); + +/* Frees and removes from array value at given index and replaces it with given one. +* Does nothing and returns JSONFailure if index doesn't exist. +* json_array_replace_value does not copy passed value so it shouldn't be freed afterwards. */ +UINT JsonArrayReplace(JSON_ARRAY *array, UINT i, JSON_VALUE *value); +UINT JsonArrayReplaceStr(JSON_ARRAY *array, UINT i, char* string); +UINT JsonArrayReplaceNumber(JSON_ARRAY *array, UINT i, UINT64 number); +UINT JsonArrayReplaceBool(JSON_ARRAY *array, UINT i, int boolean); +UINT JsonArrayReplaceNull(JSON_ARRAY *array, UINT i); + +/* Frees and removes all values from array */ +UINT JsonArrayDeleteAll(JSON_ARRAY *array); + +/* Appends new value at the end of array. +* json_array_append_value does not copy passed value so it shouldn't be freed afterwards. */ +UINT JsonArrayAdd(JSON_ARRAY *array, JSON_VALUE *value); +UINT JsonArrayAddStr(JSON_ARRAY *array, char *string); +UINT JsonArrayAddUniStr(JSON_ARRAY *array, wchar_t *string); +UINT JsonArrayAddNumber(JSON_ARRAY *array, UINT64 number); +UINT JsonArrayAddData(JSON_ARRAY *array, void *data, UINT size); +UINT JsonArrayAddBool(JSON_ARRAY *array, int boolean); +UINT JsonArrayAddNull(JSON_ARRAY *array); + + +/* +*JSON Value +*/ +JSON_VALUE * JsonNewObject(void); +JSON_VALUE * JsonNewArray(void); +JSON_VALUE * JsonNewStr(char *string); /* copies passed string */ +JSON_VALUE * JsonNewNumber(UINT64 number); +JSON_VALUE * JsonNewBool(int boolean); +JSON_VALUE * JsonNewNull(void); +JSON_VALUE * JsonDeepCopy(JSON_VALUE *value); +void JsonFree(JSON_VALUE *value); + +UINT JsonValueGetType(JSON_VALUE *value); +JSON_OBJECT * JsonValueGetObject(JSON_VALUE *value); +JSON_ARRAY * JsonValueGetArray(JSON_VALUE *value); +char * JsonValueGetStr(JSON_VALUE *value); +UINT64 JsonValueGetNumber(JSON_VALUE *value); +bool JsonValueGetBool(JSON_VALUE *value); +JSON_VALUE * JsonValueGetParent(JSON_VALUE *value); + +/* Same as above, but shorter */ +UINT JsonType(JSON_VALUE *value); +JSON_OBJECT * JsonObject(JSON_VALUE *value); +JSON_ARRAY * JsonArray(JSON_VALUE *value); +char * JsonString(JSON_VALUE *value); +UINT64 JsonNumber(JSON_VALUE *value); +int JsonBool(JSON_VALUE *value); + +void SystemTimeToJsonStr(char *dst, UINT size, SYSTEMTIME *t); +void SystemTime64ToJsonStr(char *dst, UINT size, UINT64 t); + +JSON_VALUE *StrToJson(char *str); #endif // STR_H diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/See/Packet.c softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/See/Packet.c --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/src/See/Packet.c 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/src/See/Packet.c 2019-07-23 21:37:12.000000000 +0000 @@ -668,6 +668,8 @@ PUINT pStats; ULONG Information = 0; + BOOLEAN check_ok; + IF_LOUD(DbgPrint("NPF: IoControl\n");) IrpSp = IoGetCurrentIrpStackLocation(Irp); @@ -686,22 +688,39 @@ EXIT_FAILURE(0); } - pStats = (PUINT)(Irp->UserBuffer); - - pStats[3] = 0; - pStats[0] = 0; - pStats[1] = 0; - pStats[2] = 0; // Not yet supported + check_ok = TRUE; + __try + { + ProbeForWrite(Irp->UserBuffer, IrpSp->Parameters.DeviceIoControl.OutputBufferLength, 1); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + check_ok = FALSE; + } - for(i = 0 ; i < NCpu ; i++) + if (check_ok == FALSE) { + EXIT_FAILURE(0); + } + else + { + pStats = (PUINT)(Irp->UserBuffer); - pStats[3] += Open->CpuData[i].Accepted; - pStats[0] += Open->CpuData[i].Received; - pStats[1] += Open->CpuData[i].Dropped; - pStats[2] += 0; // Not yet supported + pStats[3] = 0; + pStats[0] = 0; + pStats[1] = 0; + pStats[2] = 0; // Not yet supported + + for(i = 0 ; i < NCpu ; i++) + { + + pStats[3] += Open->CpuData[i].Accepted; + pStats[0] += Open->CpuData[i].Received; + pStats[1] += Open->CpuData[i].Dropped; + pStats[2] += 0; // Not yet supported + } + EXIT_SUCCESS(4*sizeof(UINT)); } - EXIT_SUCCESS(4*sizeof(UINT)); break; @@ -711,9 +730,26 @@ EXIT_FAILURE(0); } - RtlCopyMemory(Irp->UserBuffer,(Open->ReadEventName.Buffer)+18,26); + check_ok = TRUE; + __try + { + ProbeForWrite(Irp->UserBuffer, IrpSp->Parameters.DeviceIoControl.OutputBufferLength, 1); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + check_ok = FALSE; + } - EXIT_SUCCESS(26); + if (check_ok == FALSE) + { + EXIT_FAILURE(0); + } + else + { + RtlCopyMemory(Irp->UserBuffer,(Open->ReadEventName.Buffer)+18,26); + + EXIT_SUCCESS(26); + } break; diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/systemd/softether-vpnserver.service softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/systemd/softether-vpnserver.service --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/systemd/softether-vpnserver.service 2019-04-21 08:03:29.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/systemd/softether-vpnserver.service 2019-07-23 21:37:12.000000000 +0000 @@ -5,6 +5,7 @@ [Service] Type=forking +TasksMax=16777216 EnvironmentFile=-${CPACK_PACKAGING_INSTALL_PREFIX}/libexec/softether/vpnserver ExecStart=${CPACK_PACKAGING_INSTALL_PREFIX}/libexec/softether/vpnserver/vpnserver start ExecStop=${CPACK_PACKAGING_INSTALL_PREFIX}/libexec/softether/vpnserver/vpnserver stop diff -Nru softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/.travis.yml softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/.travis.yml --- softether-vpn-5.01.9670~201904081849~ubuntu18.10.1/.travis.yml 2019-04-21 08:03:28.000000000 +0000 +++ softether-vpn-5.01.9671~201907101749~ubuntu18.10.1/.travis.yml 2019-07-23 21:37:11.000000000 +0000 @@ -1,4 +1,5 @@ sudo: required +dist: xenial language: c @@ -38,7 +39,7 @@ os: linux language: csharp mono: none - dotnet: 2.1.300 + dotnet: 2.2.203 before_install: - true script: