mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
SSH: SshHosts error handling improved. Various fixes & cosmetics.
git-svn-id: svn://ultimatepp.org/upp/trunk@12181 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
00e99f14ef
commit
203b2252ae
13 changed files with 278 additions and 429 deletions
|
|
@ -119,7 +119,7 @@ dword Ssh::GetWaitEvents()
|
|||
void Ssh::SetError(int rc, const String& reason)
|
||||
{
|
||||
if(IsNull(reason) && ssh && ssh->session) {
|
||||
Buffer<char*> libmsg(256);
|
||||
Buffer<char*> libmsg(256, 0);
|
||||
rc = libssh2_session_last_error(ssh->session, libmsg, nullptr, 0);
|
||||
throw Error(rc, *libmsg);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,137 +1,147 @@
|
|||
#include "SSH.h"
|
||||
|
||||
namespace Upp {
|
||||
|
||||
bool SshHosts::Add(const String& host, int port, const Info& info, const String& comment)
|
||||
{
|
||||
return Add(Format("[%s]:%d", host, port), info, comment);
|
||||
}
|
||||
|
||||
bool SshHosts::Add(const String& host, const Info& info, const String& comment)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
bool b = handle &&
|
||||
libssh2_knownhost_addc(
|
||||
handle,
|
||||
~host,
|
||||
NULL,
|
||||
~info.key, info.key.GetLength(),
|
||||
~comment, comment.GetLength(),
|
||||
info.type |
|
||||
LIBSSH2_KNOWNHOST_TYPE_PLAIN |
|
||||
LIBSSH2_KNOWNHOST_KEYENC_RAW,
|
||||
NULL
|
||||
) == 0;
|
||||
return b ? b : Error();
|
||||
}
|
||||
|
||||
bool SshHosts::Remove(SshHost* host)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
auto b = handle && libssh2_knownhost_del(handle, host) == 0;
|
||||
return b ? b : Error();
|
||||
}
|
||||
|
||||
bool SshHosts::Load(const String& filename)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
file_path = filename;
|
||||
auto b = libssh2_knownhost_readfile(handle, ~file_path, LIBSSH2_KNOWNHOST_FILE_OPENSSH) >= 0;
|
||||
return b ? b : Error();
|
||||
}
|
||||
|
||||
bool SshHosts::Save()
|
||||
{
|
||||
return SaveAs(file_path);
|
||||
}
|
||||
|
||||
bool SshHosts::SaveAs(const String& filename)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
auto b = handle && libssh2_knownhost_writefile(handle, ~filename, LIBSSH2_KNOWNHOST_FILE_OPENSSH) == 0;
|
||||
return b ? b : Error();
|
||||
}
|
||||
|
||||
SshHosts::Info SshHosts::Check(const String& host, int port)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Info info;
|
||||
if(handle) {
|
||||
int type = 0;
|
||||
size_t length = 0;
|
||||
auto* p = libssh2_session_hostkey(ssh_session, &length, &type);
|
||||
if(!p) {
|
||||
Error();
|
||||
info.status = LIBSSH2_KNOWNHOST_CHECK_FAILURE;
|
||||
return pick(info);
|
||||
}
|
||||
info.status = libssh2_knownhost_checkp(
|
||||
handle,
|
||||
~host,
|
||||
port,
|
||||
p,
|
||||
length,
|
||||
LIBSSH2_KNOWNHOST_TYPE_PLAIN |
|
||||
LIBSSH2_KNOWNHOST_KEYENC_RAW,
|
||||
NULL
|
||||
);
|
||||
info.key.Set(p, length);
|
||||
switch(type) {
|
||||
case LIBSSH2_HOSTKEY_TYPE_RSA:
|
||||
info.type = LIBSSH2_KNOWNHOST_KEY_SSHRSA;
|
||||
break;
|
||||
case LIBSSH2_HOSTKEY_TYPE_DSS:
|
||||
info.type = LIBSSH2_KNOWNHOST_KEY_SSHDSS;
|
||||
break;
|
||||
case LIBSSH2_HOSTKEY_TYPE_UNKNOWN:
|
||||
info.type = LIBSSH2_KNOWNHOST_KEY_UNKNOWN;
|
||||
break;
|
||||
default:
|
||||
NEVER();
|
||||
}
|
||||
}
|
||||
return pick(info);
|
||||
}
|
||||
|
||||
Vector<SshHost*> SshHosts::GetHosts()
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Vector<SshHost*> v;
|
||||
SshHost *prev = NULL, *next = NULL;
|
||||
int rc = libssh2_knownhost_get(handle, &prev, NULL);
|
||||
if(rc >= 0) {
|
||||
v.Add(prev);
|
||||
if(rc == 0)
|
||||
while(rc < 1) {
|
||||
rc = libssh2_knownhost_get(handle, &next, prev);
|
||||
if(rc < 0) break;
|
||||
v.Add(next);
|
||||
prev = next;
|
||||
}
|
||||
}
|
||||
if(rc < 0) Error();
|
||||
return pick(v);
|
||||
}
|
||||
|
||||
bool SshHosts::Error()
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
String msg = !handle ? "Invalid host handle." : "";
|
||||
//_error = ssh_liberror(ssh_session, handle ? 0 : -1, msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
SshHosts::SshHosts(SshSession& session)
|
||||
{
|
||||
ASSERT(session.GetHandle());
|
||||
ssh_session = session.GetHandle();
|
||||
handle = libssh2_knownhost_init(ssh_session);
|
||||
}
|
||||
|
||||
SshHosts::~SshHosts()
|
||||
{
|
||||
if(ssh_session && handle)
|
||||
libssh2_knownhost_free(handle);
|
||||
}
|
||||
|
||||
#include "SSH.h"
|
||||
|
||||
namespace Upp {
|
||||
|
||||
#define LLOG(x) do { if(SSH::sTrace) RLOG("SshHosts: " << x); } while(false)
|
||||
|
||||
bool SshHosts::Add(const String& host, int port, const Info& info, const String& comment)
|
||||
{
|
||||
return Add(Format("[%s]:%d", host, port), info, comment);
|
||||
}
|
||||
|
||||
bool SshHosts::Add(const String& host, const Info& info, const String& comment)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Clear();
|
||||
bool b = handle &&
|
||||
libssh2_knownhost_addc(
|
||||
handle,
|
||||
~host,
|
||||
NULL,
|
||||
~info.key, info.key.GetLength(),
|
||||
~comment, comment.GetLength(),
|
||||
info.type |
|
||||
LIBSSH2_KNOWNHOST_TYPE_PLAIN |
|
||||
LIBSSH2_KNOWNHOST_KEYENC_RAW,
|
||||
NULL
|
||||
) == 0;
|
||||
return b ? b : Error();
|
||||
}
|
||||
|
||||
bool SshHosts::Remove(SshHost* host)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Clear();
|
||||
auto b = handle && libssh2_knownhost_del(handle, host) == 0;
|
||||
return b ? b : Error();
|
||||
}
|
||||
|
||||
bool SshHosts::Load(const String& filename)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Clear();
|
||||
file_path = filename;
|
||||
auto b = libssh2_knownhost_readfile(handle, ~file_path, LIBSSH2_KNOWNHOST_FILE_OPENSSH) >= 0;
|
||||
return b ? b : Error();
|
||||
}
|
||||
|
||||
bool SshHosts::Save()
|
||||
{
|
||||
return SaveAs(file_path);
|
||||
}
|
||||
|
||||
bool SshHosts::SaveAs(const String& filename)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Clear();
|
||||
auto b = handle && libssh2_knownhost_writefile(handle, ~filename, LIBSSH2_KNOWNHOST_FILE_OPENSSH) == 0;
|
||||
return b ? b : Error();
|
||||
}
|
||||
|
||||
SshHosts::Info SshHosts::Check(const String& host, int port)
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Clear();
|
||||
Info info;
|
||||
if(handle) {
|
||||
int type = 0;
|
||||
size_t length = 0;
|
||||
auto* p = libssh2_session_hostkey(ssh_session, &length, &type);
|
||||
if(!p) {
|
||||
Error();
|
||||
info.status = LIBSSH2_KNOWNHOST_CHECK_FAILURE;
|
||||
return pick(info);
|
||||
}
|
||||
info.status = libssh2_knownhost_checkp(
|
||||
handle,
|
||||
~host,
|
||||
port,
|
||||
p,
|
||||
length,
|
||||
LIBSSH2_KNOWNHOST_TYPE_PLAIN |
|
||||
LIBSSH2_KNOWNHOST_KEYENC_RAW,
|
||||
nullptr
|
||||
);
|
||||
info.key.Set(p, length);
|
||||
switch(type) {
|
||||
case LIBSSH2_HOSTKEY_TYPE_RSA:
|
||||
info.type = LIBSSH2_KNOWNHOST_KEY_SSHRSA;
|
||||
break;
|
||||
case LIBSSH2_HOSTKEY_TYPE_DSS:
|
||||
info.type = LIBSSH2_KNOWNHOST_KEY_SSHDSS;
|
||||
break;
|
||||
case LIBSSH2_HOSTKEY_TYPE_UNKNOWN:
|
||||
info.type = LIBSSH2_KNOWNHOST_KEY_UNKNOWN;
|
||||
break;
|
||||
default:
|
||||
NEVER();
|
||||
}
|
||||
}
|
||||
return pick(info);
|
||||
}
|
||||
|
||||
Vector<SshHost*> SshHosts::GetHosts()
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Clear();
|
||||
Vector<SshHost*> v;
|
||||
SshHost *prev = nullptr, *next = nullptr;
|
||||
int rc = libssh2_knownhost_get(handle, &prev, nullptr);
|
||||
if(rc >= 0) {
|
||||
v.Add(prev);
|
||||
if(rc == 0)
|
||||
while(rc < 1) {
|
||||
rc = libssh2_knownhost_get(handle, &next, prev);
|
||||
if(rc < 0) break;
|
||||
v.Add(next);
|
||||
prev = next;
|
||||
}
|
||||
}
|
||||
if(rc < 0) Error();
|
||||
return pick(v);
|
||||
}
|
||||
|
||||
bool SshHosts::Error()
|
||||
{
|
||||
ASSERT(ssh_session);
|
||||
Buffer<char*> libmsg(256, 0);
|
||||
int rc = libssh2_session_last_error(ssh_session, libmsg, nullptr, 0);
|
||||
error.a = rc;
|
||||
error.b = String(*libmsg);
|
||||
LLOG("Failed. " << error.b);
|
||||
return false;
|
||||
}
|
||||
|
||||
SshHosts::SshHosts(SshSession& session)
|
||||
{
|
||||
ASSERT(session.GetHandle());
|
||||
ssh_session = session.GetHandle();
|
||||
handle = libssh2_knownhost_init(ssh_session);
|
||||
}
|
||||
|
||||
SshHosts::~SshHosts()
|
||||
{
|
||||
if(ssh_session && handle)
|
||||
libssh2_knownhost_free(handle);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,42 +1,43 @@
|
|||
class SshHosts {
|
||||
public:
|
||||
struct Info {
|
||||
String key;
|
||||
int type;
|
||||
int status;
|
||||
|
||||
bool IsRSA() const { return type == LIBSSH2_KNOWNHOST_KEY_SSHRSA; }
|
||||
bool IsDSS() const { return type == LIBSSH2_KNOWNHOST_KEY_SSHDSS; }
|
||||
bool IsUnknown() const { return !IsRSA() && !IsDSS(); }
|
||||
|
||||
bool IsFailure() const { return status == LIBSSH2_KNOWNHOST_CHECK_FAILURE; }
|
||||
bool IsNotFound() const { return status == LIBSSH2_KNOWNHOST_CHECK_NOTFOUND; }
|
||||
bool IsMismatch() const { return status == LIBSSH2_KNOWNHOST_CHECK_MISMATCH; }
|
||||
bool IsMatch() const { return status == LIBSSH2_KNOWNHOST_CHECK_MATCH; }
|
||||
};
|
||||
|
||||
public:
|
||||
bool Add(const String& host, int port, const Info& info, const String& comment);
|
||||
bool Add(const String& host, const Info& info, const String& comment);
|
||||
bool Remove(SshHost* host);
|
||||
bool Load(const String& filename);
|
||||
bool Save();
|
||||
bool SaveAs(const String& filename);
|
||||
Info Check(const String& host, int port);
|
||||
|
||||
Vector<SshHost*> GetHosts();
|
||||
|
||||
int GetError() const { return error.Get<int>(); }
|
||||
String GetErrorDesc() const { return error.Get<String>(); }
|
||||
|
||||
SshHosts(SshSession& session);
|
||||
virtual ~SshHosts();
|
||||
|
||||
private:
|
||||
bool Error();
|
||||
|
||||
String file_path;
|
||||
Tuple<int,String> error;
|
||||
LIBSSH2_SESSION* ssh_session;
|
||||
LIBSSH2_KNOWNHOSTS* handle;
|
||||
};
|
||||
class SshHosts {
|
||||
public:
|
||||
struct Info {
|
||||
String key;
|
||||
int type;
|
||||
int status;
|
||||
|
||||
bool IsRSA() const { return type == LIBSSH2_KNOWNHOST_KEY_SSHRSA; }
|
||||
bool IsDSS() const { return type == LIBSSH2_KNOWNHOST_KEY_SSHDSS; }
|
||||
bool IsUnknown() const { return !IsRSA() && !IsDSS(); }
|
||||
|
||||
bool IsFailure() const { return status == LIBSSH2_KNOWNHOST_CHECK_FAILURE; }
|
||||
bool IsNotFound() const { return status == LIBSSH2_KNOWNHOST_CHECK_NOTFOUND; }
|
||||
bool IsMismatch() const { return status == LIBSSH2_KNOWNHOST_CHECK_MISMATCH; }
|
||||
bool IsMatch() const { return status == LIBSSH2_KNOWNHOST_CHECK_MATCH; }
|
||||
};
|
||||
|
||||
public:
|
||||
bool Add(const String& host, int port, const Info& info, const String& comment);
|
||||
bool Add(const String& host, const Info& info, const String& comment);
|
||||
bool Remove(SshHost* host);
|
||||
bool Load(const String& filename);
|
||||
bool Save();
|
||||
bool SaveAs(const String& filename);
|
||||
Info Check(const String& host, int port);
|
||||
|
||||
Vector<SshHost*> GetHosts();
|
||||
|
||||
int GetError() const { return error.a; }
|
||||
String GetErrorDesc() const { return error.b; }
|
||||
|
||||
SshHosts(SshSession& session);
|
||||
virtual ~SshHosts();
|
||||
|
||||
private:
|
||||
bool Error();
|
||||
void Clear() { error.a = 0; error.b = Null; }
|
||||
|
||||
String file_path;
|
||||
Tuple<int,String> error;
|
||||
LIBSSH2_SESSION* ssh_session;
|
||||
LIBSSH2_KNOWNHOSTS* handle;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,11 +1,9 @@
|
|||
SSH package for U++
|
||||
--------------------
|
||||
SSH package is a feautre-rich, flexible yet very easy to use libssh2 wrapper for Ultimate++.
|
||||
SSH package is a flexible and easy-to-use libssh2 wrapper for Ultimate++.
|
||||
It supports both console and GUI-based applications on POSIX-compliant operating systems and
|
||||
MS Windows (tm).
|
||||
|
||||
Currently it is in beta (version 1) stage.
|
||||
|
||||
Classes:
|
||||
--------------------
|
||||
|
||||
|
|
@ -29,208 +27,23 @@ Features and Highlights:
|
|||
interface.
|
||||
- Uses U++ memory allocators (Native allocators is also a compile-time option)
|
||||
- Uses OpenSSL by default.
|
||||
- Supports 3rd-party network proxies. (Such as NetProxy)
|
||||
- Supports 3rd-party network proxies.
|
||||
- Supports known hosts verification mechanism.
|
||||
- Supports password, public key, host-based, and keyboard-interactive authentication methods.
|
||||
- Supports ssh-agents.
|
||||
- Supports real-time interactive command line (shell) interface with both console and GUI integration (works on Windows and Posix-compliant OS'es)
|
||||
- Supports real-time interactive command line (shell) interface with both console and GUI integration
|
||||
(works on both Windows and Posix-compliant OS'es)
|
||||
- Supports multiple X11 connection forwarding.
|
||||
- Supports Tcp/IP and port forwarding.
|
||||
- Supports detailed (full) debug logging.
|
||||
|
||||
Todo:
|
||||
--------------------
|
||||
- Add more high level methods.
|
||||
- Refactor Ssh (core) class.
|
||||
|
||||
- Improve documentation.
|
||||
|
||||
Reference examples:
|
||||
-------------------
|
||||
|
||||
- SFtpGet: Demonstrates basic SFtp file download in blocking mode.
|
||||
- SFtpGetNB: Demonstrates basic SFtp file download in non-blocking mode.
|
||||
- SFtpGetMT: Demonstrates basic SFtp file download, using a worker thread.
|
||||
- SFtpGUI: Demonstrates a basic SFtp browser with GUI (with upload, download, mkdir, rename, delete commands).
|
||||
- SFtpMultiGetMT: Demonstrates SFtp dir listing and concurrent file transfers, using worker threads.
|
||||
- SFtpConsumerGet: Demonstrates the usage of a consumer function for SFtp download in blocking mode.
|
||||
- SFtpConsumerGetMT: Demonstrates the usage of a consumer function for SFtp download, using a worker thread.
|
||||
- SshExec: Demonstrates basic Ssh remote command execution in blocking mode.
|
||||
- SshExecNB: Demonstrates basic Ssh remote command execution in non-blocking mode.
|
||||
- SshExecMT: Demonstrates basic Ssh remote command execution, using a worker thread.
|
||||
- SshKeyboardAuth: Demonstrates basic Ssh interactive (challenge-response) authentication method in blocking mode.
|
||||
- SshLoggingExample: Demonstrates the logging capabilities of SSH package.
|
||||
- SshOverTor: Demonstrates a basic Ssh connection over TOR, using a third-party network proxy adapter.
|
||||
- SshPolymorphismNB: Demonstrates the polymorphism capability of SSH channels in non-blocking mode.
|
||||
- SshShell: Demonstrates a basic, real-time SSH shell console in blocking mode.
|
||||
- SshShellNB: Demonstrates a basic, real-time SSH shell console in non-blocking mode.
|
||||
- SshShellX11: Demonstrates a basic, real-time SSH shell console with multiple X11 forwarding.
|
||||
- SshShellGUI: Demonstrates the basic GUI integration of SshShell class with multiple X11 forwarding, in non-blocking mode.
|
||||
- SshTunnelExample: Demonstrates the basic SSH tunneling (as tunnel/server) in blocking mode.
|
||||
|
||||
|
||||
History:
|
||||
--------------------
|
||||
2018-08-10: SSH package: Third iteration.
|
||||
SSH package is now officially a part of Ultimate++.
|
||||
Full non-blocking mode and MT convenience methods removed in favor of simple an robust blocking interface.
|
||||
Ssh, SFtp and SshSession classes are refactored accordingly.
|
||||
SFtpStream variants are added to the package (Thanks Mirek!).
|
||||
Memory footprint slightly reduced.
|
||||
|
||||
2018-06-15: Critical fix: SshChannel and SFtp data read and write methods fixed: The recently introduced
|
||||
socket wait mechanism was causing a constant I/O blocking. This is now fixed.
|
||||
Cosmetics & cleanup.
|
||||
|
||||
2018-06-06: SshShell: Console loop fixed.
|
||||
|
||||
2018-05-04: Ssh::GetWaitEvents() fixed.
|
||||
SshTunnel::Validate() fixed.
|
||||
SshTunnelExample is added to the reference examples.
|
||||
|
||||
2018-04-21: AsyncConsumerGet() methods are added to SFtp and Scp classes.
|
||||
License file udated.
|
||||
|
||||
2018-04-15: Consumer function support added to SFtp and SshChannel classes.
|
||||
GetWaitStep() method is added to Ssh class.
|
||||
Multithreaded methods rewritten.
|
||||
|
||||
2018-04-06: Blocking and non-blocking behaviour is aligned with TcpSocket.
|
||||
WhenDo replaced with WhenWait, and WaitStep() method is added.
|
||||
|
||||
2018-02-23: SshShell: Console mode is now properly restored on failure.
|
||||
|
||||
2018-01-28: X11 forwarding support added as an operation mode for shell.
|
||||
From now a signle SshShells can forward multiple X11 connections.
|
||||
X11 examples (for both console and GUI) are added to the examples directory.
|
||||
|
||||
2018-01-26: SshChannel::Lock() and SShChannel::Unlock() methods are added.
|
||||
These methods allow serialized access to desired SShChannel methods while keeping
|
||||
their non-blocking state. That is, it is now possible to open multiple non-blocking
|
||||
exec, and shell channels (per-session) concurrently in a single-threaded environment.
|
||||
|
||||
2018-01-25: Stream close correctly handled in ReadString and ReadStream.
|
||||
|
||||
2018-01-19: Alpha version 2.
|
||||
SshChannel reworked. It is now more flexible, and more analogous to a tcp socket.
|
||||
Scp class gained a new Put method (and its corresponding operator overload).
|
||||
NEW: SShShell is added to the package. It allows GUI integration and has a
|
||||
"console mode" that supports both POSIX consoles and Windows command prompt.
|
||||
NEW: SshTunnel class is added to the package. It allows TCP/IP and port forwarding
|
||||
over SSH protocol.
|
||||
Various bug fixes, and improvements.
|
||||
|
||||
2017-12-19: It is now possible to use encryption keys loaded into memory.
|
||||
ssh_session_libtrace() function added: This function allows full-level logging
|
||||
(redirection) of libsssh2 diagnostic messages.
|
||||
Hostbased authentication mechanism added.
|
||||
Documentation updated.
|
||||
|
||||
2017-11-24: Connect() method overload added. This variant takes a secure shell URL string.
|
||||
Multithreaded functions are improved.
|
||||
Documentation updated.
|
||||
|
||||
2017-11-19: GetCurrentDir() and GetParentDir() methods are added to SFtp class.
|
||||
libssh2, session.c (line: 177-8), banner_receive() method patched to
|
||||
prevent a memory leak which is caused by accidentally trying to connect to a
|
||||
non-ssh2 server.
|
||||
|
||||
2017-11-12: Basic multithreading support added for SFtp, Scp, and Exec classes.
|
||||
|
||||
2017-11-10: GetWaitEvents() and AddTo() methods addet to Ssh class.
|
||||
Scp, SshChannel, SshExec, SshHosts classes are added to the package.
|
||||
Documentation added for Ssh, SshSession, SFtp, Scp, SshExec, and SshHosts classes.
|
||||
|
||||
2017-10-21: Ssh agents support added. A ToXml() method added to SFtp::DirEntry class.
|
||||
Timeouts error code is from now on -1000. This is to prevent unnecessary cleanup
|
||||
rounds when the server is not responding.
|
||||
|
||||
2017-10-20: Known hosts support is re-added via SshHosts class. Docs are updated accordingly.
|
||||
|
||||
2017-10-17: Class names finalized:
|
||||
Core class -> Ssh
|
||||
Session class -> SshSession
|
||||
SFtp class -> SFtp
|
||||
Channel class -> SshChannel
|
||||
Scp class -> Scp
|
||||
Exec class -> SshExec
|
||||
Knownhosts class -> SshHosts
|
||||
SshAgents -> (will be added as such)
|
||||
|
||||
CreateSFtp(), CreateExec(), CreateScp(), CreateChannel() methods added to SshSession
|
||||
class.
|
||||
Logging further refined.
|
||||
Error management further refined.
|
||||
|
||||
2017-10-15: Second iteration of SSH package.
|
||||
|
||||
1) This version brings a major redesign of overall components. SSH package's classes
|
||||
are redesigned around a core class named Ssh. Ssh allows a uniform
|
||||
interface for both blocking and non-blocking modes of operation. Visible result
|
||||
of this new design is a single set of methods for both modes of operation for
|
||||
each class. Methods starting with "Start" prefix are removed in favor of a
|
||||
simple "NonBlocking()" switch.
|
||||
|
||||
2) In accordance with this behaviour, a sort of "feature parity" is successfully
|
||||
kept, thanks to the new design. Namely, in non-blocking mode, any result can be
|
||||
gathered using the new GetResult() method, which returns Value.
|
||||
|
||||
3) All SSH package classes now has pick semantics.
|
||||
|
||||
4) New design allows creation of higher-level ("complex") SFTP methods where needed.
|
||||
Unlike the simple SFTP methods, which work on file handles, Complex methods take
|
||||
care of (allocate/free) file handles internally.
|
||||
|
||||
5) Experimental multithreading support is added (using AsyncWork). This is still
|
||||
at a primitive stage.
|
||||
|
||||
6) Network proxy support is added. This new feature uses NetProxy (Http/Socks4/4a/5)
|
||||
package It works through a plugin, provided via SshSession::WhenProxy callback.
|
||||
And it is completely optional.
|
||||
|
||||
7) Cancellation mechanism is added. Any operation can be cancelled at any time using
|
||||
the Cancel() method.
|
||||
|
||||
8) SFtp::DirEntry class now has a ToString() method. (It will also gain an ToXml()
|
||||
method.) This method will give an output similar to Unix ls command.
|
||||
|
||||
9) LibSsh2 configured to use OpenSSL by default (WinCNG will be made a compile-time
|
||||
option in the next release).
|
||||
|
||||
2017-08-11: Initial api reference docs for Ssh, Ssh::SubSystem, SFtp, Scp, Exec, Knownhosts, are added.
|
||||
2017-07-31: It is now possible to query, get, and set the possible transportation methods and exchange
|
||||
algorithms. Added Ssh::Method(), Ssh::Methods(), Ssh::GetMethod(), Ssh::GetMethods() methods.
|
||||
Ssh::Host class is from now on KnownHosts class.
|
||||
|
||||
2017-07-21: Authentication methods (password, public key, keyboard interaction) are properly implemented.
|
||||
From now on it is possible to choose between authentication methods both on initialization,
|
||||
and on-the-fly (i.e. while logging in, using WhenAuth callback).
|
||||
Ssh::Host class is added to the package. This class provides basic known hosts support.
|
||||
It is now possible to verify and trust servers.
|
||||
SshAlloc named as SshMalloc, and made into a general-purpose memory allocator (needed for keyboard callback).
|
||||
SshSubsystem class is now Ssh::Subsystem.
|
||||
|
||||
2017-07-04: Credits should go to Koldo and Tom (Tom1). I am grateful for their feedback. Thanks!
|
||||
Include paths fixes.
|
||||
|
||||
2017-07-03: libssh2 config: Newer diffie-hellman-group-exchange-sha1 syntax enabled.
|
||||
2017-07-02: Initial MSC support added.
|
||||
Due to a name clash on MSC environment, addrinfo changed to ip_addrinfo.
|
||||
|
||||
2017-06-30: The source code of libssh2 is added to the SSH package.
|
||||
Exec::operator()() made inline.
|
||||
|
||||
2017-06-29: SshSubsystem::To(): reinterpret_csst() replaced with dynamic_cast().
|
||||
|
||||
2017-06-28: EAGAIN is now properly handled across the subsystems.
|
||||
WhenWrite and WhenRead callbacks are removed in favour of parametrized gates.
|
||||
|
||||
2017-06-27: SFtp::StartStop: fixed.
|
||||
|
||||
2017-06-27: CleanUp() methods are added to the classes Ssh, SFtp, and Channel.
|
||||
This method utilizes JobQueue's WhenCleanup event.
|
||||
|
||||
2017-06-26: U++ memory [de/re]allocators added and made default.
|
||||
initial support for ssh shell, and terminal added.
|
||||
Subsystems now perform a clean up on failure to prevent possible heap leaks.
|
||||
|
||||
2017-06-22: Initial release.
|
||||
- SshBasics: Demonstrates basic capabilities of SSH package.
|
||||
- SFtpGUI: Demonstrates a simple sftp browser with GUI.
|
||||
|
|
@ -61,13 +61,14 @@ SFtpHandle SFtp::Open(const String& path, dword flags, long mode)
|
|||
return h;
|
||||
}
|
||||
|
||||
bool SFtp::Close(SFtpHandle handle)
|
||||
void SFtp::Close(SFtpHandle handle)
|
||||
{
|
||||
return Run([=] () mutable {
|
||||
if(!handle)
|
||||
return;
|
||||
|
||||
Run([=] () mutable {
|
||||
int rc = libssh2_sftp_close_handle(handle);
|
||||
if(!WouldBlock(rc) && rc < 0)
|
||||
SetError(-1, "Unable to close file handle.");
|
||||
if(rc == 0)
|
||||
if(!rc)
|
||||
LLOG("File handle freed.");
|
||||
return !rc;
|
||||
});
|
||||
|
|
@ -305,7 +306,12 @@ bool SFtp::ListDir(SFtpHandle handle, DirList& list)
|
|||
bool SFtp::ListDir(const String& path, DirList& list)
|
||||
{
|
||||
SFtpHandle h = OpenDir(path);
|
||||
return h && ListDir(h, list) && Close(h);
|
||||
if(h) {
|
||||
bool b = ListDir(h, list);
|
||||
Close(h);
|
||||
if(!b) ssh->status = FAILED;
|
||||
}
|
||||
return !IsError();
|
||||
}
|
||||
|
||||
bool SFtp::SymLink(const String& path, String& target, int type)
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ public:
|
|||
SFtpHandle Open(const String& path, dword flags, long mode);
|
||||
SFtpHandle OpenRead(const String& path) { return Open(path, READ, IRALL); }
|
||||
SFtpHandle OpenWrite(const String& path) { return Open(path, CREATE | WRITE, IRALL | IWUSR); }
|
||||
bool Close(SFtpHandle handle);
|
||||
void Close(SFtpHandle handle);
|
||||
bool Rename(const String& oldpath, const String& newpath);
|
||||
bool Delete(const String& path);
|
||||
bool Sync(SFtpHandle handle);
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ bool Scp::Load(Stream& s, ScpAttrs a, int64 maxsize)
|
|||
int64 size = a.st_size;
|
||||
String msg;
|
||||
|
||||
if(size < 0 && size >= maxsize) {
|
||||
if(size < 0 || size >= maxsize) {
|
||||
msg = "Invald stream size.";
|
||||
}
|
||||
else
|
||||
|
|
@ -73,7 +73,7 @@ bool Scp::Save(Stream& s)
|
|||
Buffer<char> chunk(ssh->chunk_size, 0);
|
||||
|
||||
while(done_ < size && !IsEof() && !IsError()) {
|
||||
int l = s.Get(chunk, min<int64>(size - done_, ssh->chunk_size));
|
||||
int l = s.Get(chunk, (int) min<int64>(size - done_, ssh->chunk_size));
|
||||
int n = Put(chunk, l);
|
||||
if(n > 0) {
|
||||
done_ += n;
|
||||
|
|
|
|||
|
|
@ -188,10 +188,10 @@ bool SshSession::Connect(const String& host, int port, const String& user, const
|
|||
})) goto Bailout;
|
||||
|
||||
if(!Run([=] () mutable {
|
||||
session->fingerprint = libssh2_hostkey_hash(ssh->session, LIBSSH2_HOSTKEY_HASH_SHA1);
|
||||
session->fingerprint = libssh2_hostkey_hash(ssh->session, session->hashtype);
|
||||
if(session->fingerprint.IsEmpty()) LLOG("Warning: Fingerprint is not available!.");
|
||||
LDUMPHEX(session->fingerprint);
|
||||
if(WhenVerify && !WhenVerify())
|
||||
if(WhenVerify && !WhenVerify(host, port))
|
||||
SetError(-1);
|
||||
return true;
|
||||
})) goto Bailout;
|
||||
|
|
@ -201,7 +201,7 @@ bool SshSession::Connect(const String& host, int port, const String& user, const
|
|||
if(session->authmethods.IsEmpty()) { if(!WouldBlock()) SetError(-1); return false; }
|
||||
LLOG("Authentication methods successfully retrieved.");
|
||||
WhenAuth();
|
||||
if(session->phrase.IsEmpty())
|
||||
if(IsNull(session->phrase))
|
||||
session->phrase = password;
|
||||
return true;
|
||||
})) goto Bailout;
|
||||
|
|
@ -409,6 +409,7 @@ SshSession::SshSession()
|
|||
session->authmethod = PASSWORD;
|
||||
session->connected = false;
|
||||
session->keyfile = true;
|
||||
session->hashtype = LIBSSH2_HOSTKEY_HASH_SHA1;
|
||||
}
|
||||
|
||||
SshSession::~SshSession()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
class SshSession : public Ssh {
|
||||
public:
|
||||
enum Methods {
|
||||
enum Methods {
|
||||
METHOD_EXCHANGE = 0,
|
||||
METHOD_HOSTKEY,
|
||||
METHOD_CENCRYPTION,
|
||||
|
|
@ -11,9 +11,14 @@ public:
|
|||
METHOD_SCOMPRESSION
|
||||
};
|
||||
|
||||
enum Hash {
|
||||
HASH_MD5,
|
||||
HASH_SHA1
|
||||
};
|
||||
|
||||
public:
|
||||
SshSession& Timeout(int ms) { ssh->timeout = ms; return *this; }
|
||||
SshSession& WaitStep(int ms) { ssh->waitstep = clamp(ms, 0, INT_MAX); return *this; }
|
||||
SshSession& HashType(Hash h) { session->hashtype = h == HASH_SHA1 ? LIBSSH2_HOSTKEY_HASH_SHA1 : LIBSSH2_HOSTKEY_HASH_MD5; return *this; }
|
||||
|
||||
SshSession& Keys(const String& prikey, const String& pubkey, const String& phrase = Null, bool fromfile = true);
|
||||
SshSession& Method(int type, Value method) { session->iomethods(type) = pick(method); return *this; }
|
||||
|
|
@ -46,7 +51,7 @@ public:
|
|||
|
||||
Event<> WhenConfig;
|
||||
Event<> WhenAuth;
|
||||
Gate<> WhenVerify;
|
||||
Gate<String, int> WhenVerify;
|
||||
Gate<> WhenProxy;
|
||||
Event<SshX11Handle> WhenX11;
|
||||
Function<String(String, String, String)> WhenKeyboard;
|
||||
|
|
@ -66,6 +71,7 @@ private:
|
|||
struct SessionData {
|
||||
TcpSocket socket;
|
||||
String fingerprint;
|
||||
int hashtype;
|
||||
String authmethods;
|
||||
int authmethod;
|
||||
String prikey;
|
||||
|
|
|
|||
|
|
@ -93,11 +93,11 @@ on failure. File handles obtained using this method must be released
|
|||
using the Close() method when finished.&]
|
||||
[s3; &]
|
||||
[s4;%- &]
|
||||
[s5;:Upp`:`:SFtp`:`:Close`(Upp`:`:SFtpHandle`):%- [@(0.0.255) bool]_[* Close]([_^Upp`:`:SFtpHandle^ S
|
||||
[s5;:Upp`:`:SFtp`:`:Close`(Upp`:`:SFtpHandle`):%- [@(0.0.255) void]_[* Close]([_^Upp`:`:SFtpHandle^ S
|
||||
FtpHandle]_[*@3 handle])&]
|
||||
[s2; Closes the file [%-*@3 handle]. Return true on success. File handles
|
||||
obtained with Open() or OpenDir() methods must be released using
|
||||
this method when finished.&]
|
||||
[s2; Closes the file [%-*@3 handle]. File handles obtained with Open()
|
||||
or OpenDir() methods must be released using this method when
|
||||
finished.&]
|
||||
[s3; &]
|
||||
[s4;%- &]
|
||||
[s5;:Upp`:`:SFtp`:`:Rename`(const Upp`:`:String`&`,const Upp`:`:String`&`):%- [@(0.0.255) b
|
||||
|
|
|
|||
|
|
@ -1,22 +1,22 @@
|
|||
TITLE("SFtp")
|
||||
COMPRESSED
|
||||
120,156,221,93,13,115,218,72,210,254,43,83,149,219,61,59,133,137,36,192,96,216,219,178,99,123,29,215,249,171,140,189,201,91,46,108,4,26,204,156,133,196,105,36,39,222,189,205,111,191,238,153,209,23,72,32,64,94,239,189,169,196,96,105,186,167,251,233,158,158,153,158,143,220,177,122,189,213,49,141,70,231,233,159,151,123,29,131,252,237,111,122,69,123,87,107,234,181,86,163,166,215,141,93,248,161,215,116,163,97,212,234,122,203,216,171,183,106,181,150,214,30,218,38,231,189,59,219,104,181,4,145,81,49,222,25,205,134,161,55,235,173,122,75,175,53,91,6,208,26,154,102,104,77,163,161,215,107,45,163,209,182,40,31,246,238,52,40,94,131,58,246,118,107,123,154,174,105,77,93,215,106,70,83,171,53,234,186,94,51,128,133,209,52,116,173,209,166,142,213,187,251,180,219,65,130,58,16,104,141,93,77,211,118,129,91,189,174,1,119,36,171,215,244,154,102,212,26,250,94,99,183,61,160,143,204,233,221,205,171,212,88,170,82,83,107,51,159,78,148,70,102,189,243,126,191,
|
||||
209,209,129,116,183,178,251,174,9,213,214,27,80,217,30,106,84,3,50,195,216,109,236,233,141,58,136,84,215,140,182,71,255,29,48,143,78,168,227,43,14,76,215,13,189,51,208,155,29,16,225,251,247,239,85,189,174,73,164,154,32,139,174,129,220,134,14,207,64,143,166,222,216,211,246,26,45,189,165,213,154,117,163,209,4,213,167,166,103,78,148,38,131,186,209,81,122,180,42,173,119,187,250,46,32,170,181,64,254,198,30,48,208,64,9,248,4,32,27,240,183,214,106,251,138,24,233,144,104,175,178,247,14,64,170,53,180,230,158,214,172,55,27,117,208,196,208,119,117,0,82,67,253,193,12,109,199,245,38,166,221,187,67,2,13,177,94,242,167,125,68,71,102,96,131,186,191,63,252,241,195,241,197,206,109,151,220,145,223,127,215,241,229,254,22,24,178,90,55,170,218,54,185,227,90,135,220,189,223,111,118,234,164,251,139,63,237,245,254,248,227,199,222,29,175,117,126,216,33,248,69,239,180,111,167,211,126,187,223,198,215,248,41,124,171,13,175,239,246,183,180,170,86,5,69,183,
|
||||
107,68,121,92,141,60,244,238,222,215,4,47,130,191,182,225,247,100,185,105,48,176,217,48,44,184,95,235,64,89,62,238,97,85,90,231,157,48,14,185,25,51,46,25,18,234,12,205,41,15,108,211,167,156,152,14,233,118,63,25,192,252,230,138,240,96,192,95,56,56,69,149,156,250,196,180,109,247,43,39,35,215,35,38,241,76,231,145,18,119,68,220,41,245,76,159,185,14,39,174,67,192,3,92,159,146,17,179,41,145,164,196,29,252,139,14,125,94,1,110,195,49,49,185,120,249,193,2,103,25,250,174,247,66,134,30,21,244,21,98,81,155,202,111,30,117,204,9,115,30,43,146,147,15,181,241,17,245,128,73,76,103,51,238,67,17,144,223,31,86,37,24,82,31,80,204,162,30,123,166,22,25,121,238,132,220,221,251,238,148,13,1,215,15,253,15,135,174,71,251,31,64,197,254,7,238,13,251,31,16,248,7,64,167,255,240,209,228,180,255,64,157,254,78,192,251,239,66,131,192,155,208,30,247,2,69,50,128,114,178,166,10,160,101,145,49,168,4,236,159,8,167,19,211,241,217,
|
||||
144,87,147,214,13,61,226,151,45,221,104,109,159,136,159,251,122,232,20,228,74,216,138,156,83,127,236,90,228,12,116,154,115,143,198,156,123,220,176,9,117,3,191,191,197,28,191,191,45,252,228,225,62,81,230,94,250,89,194,41,72,255,199,222,3,84,167,40,123,91,201,119,192,5,95,238,215,200,132,247,182,177,74,163,67,186,212,231,196,151,197,201,179,105,7,20,202,145,9,3,216,233,208,117,44,94,197,34,104,1,226,143,233,76,73,223,37,23,129,109,131,39,34,19,120,45,204,35,61,1,171,115,201,192,118,135,79,72,60,113,45,42,213,21,202,214,243,181,62,28,7,206,83,151,253,70,215,208,59,162,205,211,156,255,54,163,57,8,61,68,34,194,129,10,21,186,251,97,71,21,20,77,192,50,125,104,5,212,180,184,240,130,175,30,4,79,192,228,6,232,44,25,24,146,244,224,147,187,245,127,146,107,234,7,30,180,148,254,123,31,219,31,242,153,72,203,15,199,38,115,0,143,106,49,44,78,168,255,9,170,181,1,139,254,54,152,131,251,10,141,179,211,143,216,126,193,
|
||||
167,161,1,247,31,62,29,92,28,157,29,223,147,204,199,105,160,222,11,160,34,198,189,173,237,135,228,123,81,73,79,65,20,234,97,146,169,11,24,82,15,1,66,200,108,54,224,124,108,16,62,2,123,115,202,57,52,103,104,33,200,16,195,3,132,128,33,197,134,115,113,123,118,134,15,70,38,179,3,143,166,90,204,34,189,47,167,208,64,183,132,44,36,124,229,123,128,91,255,199,126,69,61,176,190,186,158,213,175,216,46,60,205,112,18,169,158,116,21,165,42,42,142,156,211,206,33,53,126,72,80,139,154,128,82,124,102,184,25,184,199,212,244,199,189,74,162,74,33,205,61,17,31,170,204,200,54,31,57,22,74,48,64,105,195,70,8,45,66,58,163,214,145,193,26,101,147,46,153,140,175,232,132,81,52,52,253,208,65,133,4,228,43,243,33,216,10,180,195,23,178,90,225,173,234,137,168,169,154,176,166,224,155,97,46,164,153,53,25,249,37,46,12,177,127,224,131,3,67,200,13,184,12,9,224,222,202,181,39,1,24,107,128,178,219,20,98,103,92,132,146,67,219,229,116,107,
|
||||
59,44,249,117,76,129,63,180,3,62,166,86,85,249,154,250,192,218,84,143,146,165,86,59,81,186,9,99,15,24,31,117,76,24,123,180,15,125,207,22,209,227,248,226,230,248,186,45,6,34,77,3,64,69,242,67,160,191,62,62,56,234,237,252,71,98,44,0,96,142,104,216,2,158,106,46,195,179,227,95,110,34,118,223,211,60,63,95,159,222,28,207,49,21,49,98,9,215,235,211,147,79,185,108,15,174,174,142,47,230,133,53,167,240,235,50,113,111,46,175,242,216,30,2,4,66,220,67,236,138,105,200,120,68,152,79,44,151,114,167,255,119,159,208,111,208,55,165,216,231,112,59,254,114,120,118,219,61,253,85,48,52,3,8,2,68,185,238,191,3,10,158,0,145,2,93,8,249,227,99,232,232,177,163,198,26,77,27,97,127,145,85,65,44,149,114,9,3,75,39,50,109,238,162,39,241,41,29,178,17,3,58,193,4,35,41,150,129,79,168,206,202,199,224,227,229,205,205,229,121,30,12,55,215,183,23,135,7,179,118,67,215,247,189,0,198,72,136,12,19,242,255,70,61,151,108,
|
||||
193,208,110,240,34,130,254,185,242,112,172,93,182,188,132,232,201,136,190,200,143,69,99,228,100,11,198,83,19,38,2,39,223,206,242,234,88,122,248,45,254,129,163,9,212,226,244,250,182,123,93,33,167,159,229,199,23,249,113,253,249,203,45,232,117,203,33,84,39,42,200,180,103,140,200,233,245,201,245,21,242,146,31,95,228,7,240,58,1,94,39,158,27,76,147,204,150,241,186,188,249,132,188,228,199,23,249,1,188,46,129,215,85,204,69,116,138,46,120,134,183,92,186,131,179,51,32,190,198,182,170,176,20,131,83,219,94,70,249,89,82,126,22,13,114,53,210,47,146,244,248,27,29,6,190,57,0,15,25,188,20,161,3,77,15,208,2,142,7,141,192,99,67,159,102,10,189,188,235,71,223,68,149,243,186,193,213,186,60,228,84,86,183,23,14,160,100,235,81,93,85,170,87,66,77,177,141,227,64,231,175,220,237,20,179,130,112,159,114,204,32,88,253,185,118,192,222,72,216,65,0,250,149,193,112,29,208,18,179,49,25,88,231,163,255,255,182,201,4,139,254,214,156,65,148,169,
|
||||
18,112,14,92,215,150,211,6,36,1,179,20,48,35,96,43,53,140,224,23,196,114,216,38,208,82,22,80,165,66,48,177,115,73,66,152,135,150,232,86,208,162,0,2,88,15,191,29,49,47,66,132,231,131,23,227,187,14,106,215,56,21,207,245,242,202,34,231,207,66,84,178,43,193,211,93,219,10,199,218,155,178,114,232,215,84,187,145,50,70,94,158,26,103,203,140,130,180,100,40,66,98,118,24,178,138,155,202,156,121,139,193,126,132,185,144,37,193,37,11,95,73,87,118,36,145,92,19,190,60,51,221,200,87,183,152,182,221,23,103,184,90,203,68,138,117,27,38,210,142,61,215,129,137,121,66,37,57,147,181,176,59,79,183,212,112,110,171,2,41,7,63,48,31,113,150,255,204,134,116,99,205,41,125,202,210,60,156,204,130,76,187,245,213,114,29,200,114,85,104,146,51,86,81,229,61,17,31,161,51,184,156,97,102,46,145,35,161,79,60,225,247,81,1,49,31,73,77,83,115,113,173,150,154,14,185,114,121,190,7,229,234,70,36,229,186,158,20,217,30,179,69,129,231,81,199,
|
||||
143,160,32,91,0,133,152,32,108,203,168,129,133,68,126,30,21,195,212,105,81,156,138,143,72,160,71,40,103,60,2,140,74,141,33,243,153,140,220,212,197,91,141,50,74,24,97,156,155,79,116,129,9,146,41,169,172,152,166,200,75,204,66,45,75,48,225,40,69,205,249,205,92,139,144,94,70,50,105,38,117,180,94,240,187,6,247,127,94,132,216,162,113,132,34,125,173,174,46,106,156,75,29,117,77,229,49,215,47,84,207,15,254,209,96,128,121,88,122,33,32,138,221,38,129,127,166,186,123,162,190,100,163,134,235,47,17,106,10,23,241,76,133,67,23,162,25,132,67,136,115,115,64,38,66,221,146,209,113,198,248,233,38,57,160,197,89,139,151,176,2,125,134,86,43,154,110,162,199,142,43,6,74,58,153,250,47,69,71,97,145,141,22,103,156,215,179,83,233,169,230,13,236,119,249,76,61,219,53,173,106,33,75,22,27,250,149,99,169,162,43,3,24,60,207,152,243,180,212,86,203,99,75,200,170,140,89,138,199,30,211,54,42,64,228,155,222,35,245,51,34,52,127,153,12,92,
|
||||
92,46,180,65,186,112,88,26,78,70,176,38,230,152,98,69,110,126,253,117,243,80,109,90,37,193,27,178,122,149,38,176,58,188,215,148,67,79,50,15,239,236,138,10,192,205,124,14,51,188,111,209,11,197,169,4,108,109,152,139,92,65,53,229,192,27,114,251,11,33,108,75,136,135,238,100,106,211,111,184,194,111,131,171,62,139,217,53,224,142,136,83,43,19,112,58,26,129,255,98,209,114,81,135,145,255,129,239,123,153,179,134,100,96,151,133,22,33,30,114,218,180,239,21,76,100,113,201,47,19,92,83,188,10,177,61,9,23,171,241,49,27,4,24,40,32,80,207,7,128,220,249,5,233,197,211,56,201,187,60,100,151,119,155,43,161,251,42,61,230,235,162,62,59,148,46,27,235,238,34,47,78,195,95,8,237,238,250,190,188,208,58,107,2,221,205,6,58,26,53,22,115,241,94,245,245,96,47,148,23,93,21,250,87,152,255,189,145,73,50,122,209,178,99,205,169,51,114,87,200,122,168,17,242,177,227,123,47,82,245,126,59,122,16,70,28,228,89,246,204,50,78,107,132,181,133,
|
||||
32,249,99,128,9,135,217,38,131,247,12,234,246,38,98,79,28,49,7,184,169,42,133,224,92,30,4,55,90,205,109,165,41,224,192,89,184,205,224,179,204,95,139,192,52,7,121,132,117,38,100,84,188,90,226,108,25,142,230,209,169,71,57,157,105,255,146,91,158,147,109,2,32,56,137,220,139,86,200,241,178,242,142,243,219,209,202,243,49,132,76,108,60,3,176,114,189,167,191,163,175,229,56,139,244,206,202,91,231,56,79,153,250,47,201,95,35,20,243,62,21,238,232,67,156,122,51,64,149,16,151,206,76,238,159,187,22,27,189,224,174,203,130,142,130,69,239,197,54,205,208,77,210,108,94,211,97,108,168,9,19,123,108,196,134,50,252,224,174,78,133,202,28,66,9,76,54,139,67,197,112,74,247,168,162,228,146,224,244,58,192,45,233,85,19,246,203,158,26,225,155,57,79,156,71,62,156,235,64,241,215,242,205,3,65,179,177,111,198,108,94,221,55,85,10,90,128,242,154,222,184,28,153,245,188,177,124,168,94,207,27,19,88,231,69,128,77,253,16,23,108,142,197,94,191,213,
|
||||
243,255,49,237,171,121,29,234,196,102,188,44,26,101,132,171,83,5,85,61,10,19,155,235,234,59,195,224,237,148,142,82,180,133,151,246,39,152,236,91,87,239,20,249,219,105,157,74,13,22,213,220,29,62,81,127,109,197,19,212,111,168,183,144,162,160,194,87,108,186,118,123,142,105,223,78,89,185,21,121,10,146,20,84,248,35,30,98,89,87,227,4,241,219,169,44,142,225,200,253,212,166,189,74,64,235,74,146,77,66,248,28,139,183,131,97,56,54,61,115,136,231,88,214,128,2,198,65,71,174,51,115,18,103,254,144,17,81,229,10,29,172,17,59,227,131,201,0,36,130,78,87,236,34,33,83,207,197,206,21,92,212,10,16,1,12,198,120,8,41,60,29,87,37,167,184,80,103,65,1,95,108,147,31,154,182,29,30,130,251,60,166,206,103,147,193,60,217,13,124,230,20,63,113,131,132,87,158,251,8,96,241,244,112,240,196,244,97,112,129,63,123,63,229,204,190,114,167,101,63,35,32,73,214,33,0,167,35,60,62,133,59,55,42,114,211,198,163,137,91,180,229,209,67,208,84,
|
||||
30,26,3,76,82,170,171,131,87,35,230,129,7,138,195,159,20,141,9,136,61,51,75,109,242,50,39,110,32,87,49,37,41,230,92,240,236,94,120,234,96,64,113,45,82,49,244,168,37,89,202,195,110,9,158,19,243,37,228,43,15,190,185,62,184,203,44,115,129,127,130,89,133,12,2,31,23,53,133,38,145,133,180,112,8,37,246,168,160,155,138,117,82,115,224,122,126,106,83,81,218,208,114,71,77,161,243,133,55,138,70,157,48,228,169,211,133,249,14,157,153,78,126,118,153,213,127,223,175,196,167,239,178,189,124,179,220,49,214,210,123,232,191,151,237,217,247,102,94,39,142,236,225,164,254,161,255,143,135,211,139,155,254,195,249,193,151,184,221,139,83,121,56,163,226,126,114,150,223,83,45,73,160,25,237,201,74,157,169,82,89,75,14,29,31,19,27,161,197,222,151,153,13,129,226,4,163,216,206,21,140,16,219,249,188,179,148,219,247,94,132,97,93,98,185,208,149,70,34,201,35,180,241,41,22,117,120,178,186,176,249,67,124,10,192,123,94,196,198,109,104,231,69,59,229,32,
|
||||
219,152,50,90,23,50,233,85,176,161,73,195,80,190,182,149,67,203,138,109,242,43,152,118,161,125,98,51,174,236,1,127,13,211,118,205,103,138,189,103,216,245,98,47,134,198,92,185,35,86,124,178,251,223,228,35,168,32,54,90,73,187,175,209,98,241,28,212,124,166,115,187,78,20,246,194,180,184,128,182,218,46,148,130,199,191,5,168,115,199,191,51,58,193,251,84,191,69,122,162,131,26,154,78,116,0,12,157,10,59,170,140,160,93,96,199,145,107,90,25,54,157,93,199,72,227,42,246,21,41,194,53,140,152,185,155,53,134,63,209,66,210,144,255,111,33,155,215,90,98,72,169,57,121,197,118,146,52,30,212,36,140,71,241,150,138,172,70,193,156,66,77,2,138,145,236,6,65,254,31,182,136,89,75,85,50,154,72,230,150,187,184,105,172,100,4,188,40,97,105,71,182,114,115,154,55,22,233,137,158,40,220,200,21,44,218,219,242,23,52,222,146,17,232,33,98,230,5,152,51,130,161,189,111,50,187,192,13,23,226,51,50,56,31,119,229,85,2,81,243,124,47,79,63,36,13,
|
||||
26,21,18,247,116,168,239,217,134,85,23,19,196,59,236,98,17,171,228,35,115,172,196,165,21,12,94,153,206,48,117,5,132,34,79,58,240,236,112,124,209,5,48,201,245,230,8,10,193,101,254,38,152,104,37,182,93,240,86,152,120,117,21,158,20,184,25,230,220,125,166,120,140,21,31,254,52,199,225,231,7,117,109,76,226,214,24,135,114,28,22,141,169,61,133,65,76,116,231,10,75,76,62,57,155,76,109,54,146,219,123,97,238,196,213,164,45,227,94,24,178,133,15,19,55,187,48,252,37,149,111,131,223,241,142,151,109,181,127,52,222,56,28,95,250,82,141,215,212,165,64,111,112,43,75,210,84,48,11,186,16,199,230,210,183,115,228,119,223,138,160,120,114,0,10,147,45,140,30,219,11,118,95,44,219,43,80,56,11,48,163,219,45,204,26,178,85,203,90,232,134,210,133,245,10,240,132,58,179,230,198,223,5,21,204,92,210,94,89,189,147,149,212,59,89,65,189,71,113,104,254,173,245,147,11,248,133,21,148,11,245,5,53,12,119,29,100,40,19,158,135,202,215,106,19,165,
|
||||
162,229,94,152,118,229,40,183,96,113,29,136,10,171,152,189,78,190,65,51,220,64,99,185,164,184,162,198,33,209,106,26,207,172,190,254,185,186,170,221,118,89,27,186,10,108,98,75,108,34,221,254,51,170,147,151,162,185,48,44,85,21,206,226,169,174,73,82,103,105,163,173,77,114,20,2,48,137,60,66,54,194,107,33,24,9,244,61,55,77,189,238,6,193,88,217,239,11,253,233,64,230,112,197,51,232,145,67,119,10,143,49,228,66,177,150,190,167,92,78,25,114,116,141,166,6,178,92,177,118,160,86,17,114,252,158,205,172,8,175,42,111,180,192,91,68,232,168,112,105,146,207,46,235,174,42,190,90,167,45,34,188,42,90,154,232,89,107,179,43,139,47,151,125,10,137,47,139,150,38,254,194,181,167,85,245,16,139,138,69,180,16,5,75,211,33,119,25,113,85,249,113,25,184,136,248,88,174,52,233,231,214,125,87,246,30,177,74,94,200,121,68,201,242,92,63,185,60,191,170,212,184,76,130,51,191,34,114,135,101,75,146,220,83,236,214,148,92,44,3,20,21,61,42,92,146,
|
||||
236,152,163,223,64,118,68,242,210,177,11,133,249,176,108,25,146,227,132,24,97,239,239,184,192,81,245,190,107,234,16,95,126,85,68,139,184,116,73,22,160,17,195,181,228,191,113,213,154,72,225,201,121,72,81,120,188,156,220,194,159,115,46,72,12,23,68,33,223,180,112,180,35,238,98,186,12,252,105,160,178,238,241,225,89,248,198,217,132,217,166,184,103,243,214,97,223,136,141,35,169,201,4,70,216,253,191,115,204,25,2,217,154,104,124,153,216,171,64,1,197,75,198,193,33,223,38,118,4,193,117,152,228,145,15,162,155,169,32,218,193,175,192,0,11,251,230,99,37,158,56,139,100,200,130,51,40,92,28,36,244,233,55,191,61,147,171,171,235,181,90,187,209,218,109,254,132,249,173,159,27,245,122,199,254,96,236,122,240,207,255,160,215,7,240,111,95,223,145,137,161,127,96,102,8,47,54,109,227,96,73,102,239,218,109,40,222,128,226,13,40,222,128,226,141,125,131,168,26,228,203,52,175,45,189,217,218,86,220,14,162,193,46,148,84,207,174,92,206,25,94,42,247,43,222,163,
|
||||
187,197,183,243,107,64,113,14,137,255,2,29,97,72,79,238,14,133,254,137,107,146,43,225,233,202,138,234,44,42,162,163,171,200,46,187,191,163,250,236,74,60,12,73,60,19,215,240,245,98,233,176,194,128,89,169,250,14,66,59,69,27,106,196,214,20,71,166,16,228,125,192,51,44,30,55,103,33,150,124,55,228,49,9,231,253,73,62,103,217,115,123,230,144,255,131,63,237,243,115,76,222,30,145,79,159,224,107,187,219,85,77,120,134,179,25,206,175,231,56,39,231,208,171,241,76,92,180,152,98,235,125,253,38,255,206,101,40,11,230,58,215,202,207,39,35,72,244,125,43,74,206,71,41,228,104,246,123,20,222,137,156,72,181,175,19,174,226,202,22,173,114,39,37,40,119,79,89,116,24,223,145,247,19,36,174,44,16,33,33,237,127,169,245,210,98,203,93,171,40,187,236,148,97,249,48,188,210,153,66,64,213,55,211,119,208,44,65,51,181,43,67,29,37,220,104,57,38,153,228,95,108,30,113,197,7,124,197,208,107,209,209,236,200,71,61,78,194,242,171,208,233,158,200,207,228,
|
||||
110,185,5,167,227,126,86,219,190,133,96,225,90,112,74,92,57,7,144,76,195,227,131,136,211,204,26,19,161,182,248,127,25,102,70,123,128,84,175,247,95,149,173,222,115,
|
||||
120,156,221,93,13,83,227,56,210,254,43,170,154,219,61,152,10,25,219,73,72,72,246,182,96,128,101,168,227,171,8,236,204,91,84,32,78,172,16,31,142,157,179,108,102,216,189,157,223,126,221,146,108,203,137,157,56,137,89,246,222,169,25,18,108,117,75,253,116,171,37,181,90,154,59,187,94,111,117,76,163,209,121,250,231,229,94,199,32,127,251,155,94,209,222,213,154,122,173,213,168,233,117,99,23,126,232,53,221,104,24,181,186,222,50,246,234,173,90,173,165,181,135,142,201,88,239,206,49,90,45,78,100,84,140,119,70,179,97,232,205,122,171,222,210,107,205,150,1,180,134,166,25,90,211,104,232,245,90,203,104,180,45,202,134,189,59,13,138,215,160,142,189,221,218,158,166,107,90,83,215,181,154,209,212,106,141,186,174,215,12,96,97,52,13,93,107,180,169,107,245,238,62,237,118,144,160,14,4,90,99,87,211,180,93,224,86,175,107,192,29,201,234,53,189,166,25,181,134,190,215,216,109,15,232,163,237,246,238,230,69,106,44,21,169,169,181,237,128,78,164,68,102,189,243,126,
|
||||
191,209,209,129,116,183,178,251,174,9,213,214,27,80,217,30,74,84,3,50,195,216,109,236,233,141,58,52,169,174,25,109,159,254,59,180,125,58,161,110,32,57,216,186,110,232,157,129,222,236,64,19,190,127,255,94,213,235,154,64,170,9,109,209,53,104,183,161,195,51,144,163,169,55,246,180,189,70,75,111,105,181,102,221,104,52,65,244,169,233,155,19,41,201,160,110,116,164,28,173,74,235,221,174,190,11,136,106,45,104,127,99,15,24,104,32,4,124,2,144,13,248,91,107,181,3,73,140,116,72,180,87,217,123,7,32,213,26,90,115,79,107,214,155,141,58,72,98,232,187,58,0,169,161,252,160,134,182,235,249,19,211,233,221,33,129,134,88,47,249,211,62,162,35,51,116,64,220,223,31,254,248,225,248,98,231,182,75,238,200,239,191,235,248,114,127,11,20,89,173,27,85,109,155,220,49,173,67,238,222,239,55,59,117,210,253,37,152,246,122,127,252,241,99,239,142,213,58,63,236,16,252,162,119,218,183,211,105,191,221,111,227,107,252,228,182,213,134,215,119,251,91,90,85,171,130,
|
||||
160,219,53,34,45,174,70,30,122,119,239,107,156,23,193,95,219,240,187,90,110,26,14,28,123,24,21,220,175,117,160,44,27,247,176,42,173,243,142,43,135,220,140,109,38,24,18,234,14,205,41,11,29,51,160,140,152,46,233,118,63,25,192,252,230,138,176,112,192,94,24,24,69,149,156,6,196,116,28,239,43,35,35,207,39,38,241,77,247,145,18,111,68,188,41,245,205,192,246,92,70,60,151,128,5,120,1,37,35,219,161,68,144,18,111,240,47,58,12,88,5,184,13,199,196,100,252,229,7,11,140,101,24,120,254,11,25,250,148,211,87,136,69,29,42,190,249,212,53,39,182,251,88,17,156,2,168,141,141,168,15,76,18,58,199,102,1,20,129,246,7,195,170,0,67,200,3,130,89,212,183,159,169,69,70,190,55,33,119,247,129,55,181,135,128,235,135,254,135,67,207,167,253,15,32,98,255,3,243,135,253,15,8,252,3,160,211,127,248,104,50,218,127,160,110,127,39,100,253,119,145,66,224,77,164,143,123,142,34,25,64,57,81,83,5,208,178,200,24,68,2,246,79,132,209,137,
|
||||
233,6,246,144,85,85,237,70,22,241,203,150,110,180,182,79,248,207,125,61,50,10,114,197,117,69,206,105,48,246,44,114,6,50,205,153,71,99,206,60,110,236,9,245,194,160,191,101,187,65,127,155,219,201,195,189,82,230,94,216,153,98,20,164,255,99,239,1,170,147,148,189,45,245,29,112,193,151,251,53,50,97,189,109,172,210,232,144,46,13,24,9,68,113,242,108,58,33,133,114,100,98,3,236,116,232,185,22,171,98,17,212,0,9,198,116,166,100,224,145,139,208,113,192,18,145,9,188,230,234,17,150,128,213,121,100,224,120,195,39,36,158,120,22,21,226,114,97,235,249,82,31,142,67,247,169,107,255,70,215,144,59,166,205,147,156,253,54,35,57,52,122,136,68,132,1,21,10,116,247,195,142,44,200,187,128,101,6,208,11,168,105,49,110,5,95,125,112,158,128,201,13,208,89,194,49,168,244,96,147,187,245,127,146,107,26,132,62,244,148,254,251,0,251,31,242,153,8,205,15,199,166,237,2,30,213,98,88,156,208,224,19,84,235,0,22,253,109,80,7,11,36,26,103,167,31,
|
||||
177,255,130,77,67,7,238,63,124,58,184,56,58,59,190,39,153,143,211,64,189,231,64,197,140,123,91,219,15,234,123,94,73,79,66,20,201,97,146,169,7,24,82,31,1,66,200,28,123,192,216,216,32,108,4,250,102,148,49,232,206,208,67,144,33,186,7,112,1,67,138,29,231,226,246,236,12,31,140,76,219,9,125,154,234,49,139,228,190,156,66,7,221,226,109,33,209,171,192,7,220,250,63,246,43,242,129,245,213,243,173,126,197,241,224,105,134,145,8,241,132,169,72,81,81,112,228,156,54,14,33,241,131,66,205,107,2,74,254,153,97,102,96,30,83,51,24,247,42,74,149,188,53,247,132,127,200,50,35,199,124,100,88,72,97,128,173,141,58,33,244,8,97,140,90,71,56,107,108,155,48,73,213,191,162,17,198,222,208,12,34,3,229,45,32,95,237,0,156,45,71,59,122,33,170,229,214,42,159,240,154,170,138,54,57,223,12,117,33,205,172,202,200,47,73,97,240,253,131,0,12,24,92,110,200,132,75,0,243,150,166,61,9,65,89,3,108,187,67,193,119,38,69,40,57,116,
|
||||
60,70,183,182,163,146,95,199,20,248,67,63,96,99,106,85,165,173,201,15,172,77,142,40,89,98,181,149,210,77,152,123,192,252,168,99,194,220,163,125,24,248,14,247,30,199,23,55,199,215,109,62,17,105,26,0,42,146,31,2,253,245,241,193,81,111,231,63,2,99,14,128,237,242,142,205,225,169,230,50,60,59,254,229,38,102,247,61,205,243,243,245,233,205,241,28,83,238,35,150,112,189,62,61,249,148,203,246,224,234,234,248,98,190,177,230,20,126,93,214,220,155,203,171,60,182,135,0,1,111,238,33,14,197,52,98,60,34,118,64,44,143,50,183,255,247,128,208,111,48,54,165,216,231,112,59,254,114,120,118,219,61,253,149,51,52,67,112,2,68,154,238,191,67,10,150,0,158,2,77,8,249,227,99,24,232,113,160,198,26,77,7,97,127,17,85,129,47,21,237,226,10,22,70,100,58,204,67,75,98,83,58,180,71,54,208,113,38,232,73,177,12,124,66,117,86,62,6,31,47,111,110,46,207,243,96,184,185,190,189,56,60,152,213,27,154,126,224,135,48,71,66,100,108,222,254,
|
||||
223,168,239,145,45,152,218,13,94,184,211,63,151,22,142,181,139,158,167,52,93,245,232,139,236,152,119,70,70,182,96,62,53,177,185,227,100,219,89,86,157,180,30,126,75,126,224,108,2,165,56,189,190,237,94,87,200,233,103,241,241,69,124,92,127,254,114,11,114,221,50,112,213,74,5,153,250,76,16,57,189,62,185,190,66,94,226,227,139,248,0,94,39,192,235,196,247,194,169,202,108,25,175,203,155,79,200,75,124,124,17,31,192,235,18,120,93,37,92,248,160,232,129,101,248,203,91,119,112,118,6,196,215,216,87,37,150,124,114,234,56,203,40,63,11,202,207,188,67,174,70,250,69,144,30,127,163,195,48,48,7,96,33,131,151,34,116,32,233,1,106,192,245,161,19,248,246,48,160,153,141,94,62,244,163,109,162,200,121,195,224,106,67,30,114,42,107,216,139,38,80,162,247,200,161,42,53,42,161,164,216,199,113,162,243,87,30,118,138,105,129,155,79,57,106,224,172,254,92,61,224,104,196,245,192,1,253,106,195,116,29,208,226,171,49,225,88,231,189,255,255,182,202,56,139,254,
|
||||
214,156,66,164,170,20,56,159,61,219,18,203,6,36,1,181,20,80,35,96,43,36,140,225,231,196,98,218,198,209,146,26,144,165,242,80,225,195,7,106,14,132,5,45,225,183,35,219,143,37,103,249,32,37,56,174,131,206,53,46,185,115,173,185,178,200,200,21,228,6,158,231,112,228,4,187,18,44,218,115,172,104,78,189,41,43,151,126,77,245,15,209,198,216,154,83,243,105,17,57,16,26,139,154,160,172,2,35,86,73,151,128,57,130,218,19,170,164,24,236,71,24,243,88,226,68,178,240,21,116,101,123,12,193,85,177,217,153,101,69,190,184,197,164,237,190,184,195,66,61,48,150,19,41,214,237,128,72,59,246,61,23,22,224,138,72,98,197,106,225,176,157,238,145,209,26,86,58,76,6,118,96,62,226,106,254,217,30,210,141,37,167,244,41,75,242,104,209,10,109,218,173,175,22,211,64,150,171,66,163,174,76,121,149,247,132,127,68,198,224,49,27,35,112,74,44,132,62,49,197,238,227,2,124,221,145,90,142,230,226,90,45,53,236,113,229,177,124,11,202,149,141,8,202,117,45,
|
||||
41,214,61,70,133,66,223,167,110,16,67,65,182,0,10,190,16,216,22,94,3,11,241,56,60,10,134,33,210,162,56,21,159,121,192,136,80,206,188,3,24,149,234,67,230,35,22,185,33,138,183,154,77,148,48,147,56,55,159,232,2,21,168,161,167,44,159,38,201,75,140,54,45,11,36,225,108,68,174,237,205,92,141,144,94,70,208,104,38,68,180,158,243,187,6,243,127,94,132,216,162,121,132,36,125,173,161,46,238,156,75,13,117,77,225,49,166,207,69,207,119,254,241,100,192,246,177,244,66,64,36,187,77,28,255,76,117,247,68,126,201,70,13,247,89,98,212,36,46,252,153,116,135,30,120,51,112,135,224,231,230,128,84,92,93,238,44,56,119,254,116,163,78,104,113,117,226,43,90,160,207,208,107,121,215,85,70,236,164,98,160,164,147,105,240,82,116,22,22,235,104,113,100,121,61,61,149,30,82,222,64,127,151,207,212,119,60,211,170,22,210,100,177,169,95,57,154,42,186,3,128,206,243,204,118,159,150,234,106,185,111,137,88,149,177,74,241,237,199,180,142,10,16,5,166,255,
|
||||
72,131,12,15,205,94,38,3,15,183,5,29,104,93,52,45,141,22,35,88,147,237,154,124,231,109,126,159,117,115,87,109,90,37,193,27,177,122,149,46,176,58,188,215,148,193,72,50,15,239,236,206,9,192,109,7,12,86,120,223,226,23,146,83,9,216,58,176,22,185,130,106,202,129,55,226,246,23,66,216,17,16,15,189,201,212,161,223,112,39,223,1,83,125,230,171,107,192,29,17,167,86,38,224,116,52,2,251,197,162,229,162,14,51,255,131,32,240,51,87,13,170,99,23,133,22,33,30,113,218,116,236,229,76,68,113,193,47,19,92,147,191,138,176,61,137,54,165,241,177,61,8,209,81,128,163,158,119,0,185,235,11,210,75,150,113,130,119,121,200,46,31,54,87,66,247,85,70,204,215,69,125,118,42,93,54,214,221,69,86,156,134,191,16,218,221,245,109,121,161,118,214,4,186,155,13,116,60,107,44,102,226,189,234,235,193,94,40,46,186,42,244,175,176,254,123,35,149,100,140,162,101,251,154,83,119,228,173,16,245,144,51,228,99,55,240,95,132,232,253,118,252,32,242,56,200,
|
||||
179,236,149,101,18,214,136,106,139,64,10,198,0,19,78,179,77,27,222,219,80,183,63,225,185,111,196,28,96,242,84,10,193,185,56,8,38,84,205,165,204,20,48,224,44,220,102,240,89,102,175,69,96,154,131,60,198,58,19,50,202,95,45,49,182,12,67,243,233,212,167,140,206,244,127,193,45,207,200,54,1,16,140,68,228,156,21,50,188,172,184,227,124,218,89,121,54,134,144,241,4,51,0,43,215,122,250,59,250,90,134,179,72,238,172,184,117,142,241,148,41,255,146,248,53,66,49,111,83,81,230,30,226,212,155,1,170,4,191,116,102,178,224,220,179,236,209,11,102,87,22,52,20,44,122,207,211,49,35,51,73,179,121,77,131,113,160,38,12,236,217,35,123,40,220,15,102,111,74,84,230,16,82,48,217,204,15,21,195,41,61,162,242,146,75,156,211,235,0,183,100,84,85,244,151,189,52,194,55,115,150,56,143,124,180,214,129,226,175,101,155,7,156,102,99,219,76,216,188,186,109,202,16,52,7,229,53,173,113,57,50,235,89,99,249,80,189,158,53,42,88,231,121,128,77,237,
|
||||
16,55,108,142,121,78,223,234,241,255,132,246,213,172,14,101,178,103,172,44,158,101,68,187,83,5,69,61,138,2,155,235,202,59,195,224,237,132,142,67,180,133,183,246,39,24,236,91,87,238,20,249,219,73,157,10,13,22,149,220,27,62,209,96,109,193,21,234,55,148,155,183,162,160,192,87,246,116,237,254,156,208,190,157,176,34,229,120,10,45,41,40,240,71,60,172,178,174,196,10,241,219,137,204,143,219,136,188,105,211,89,197,161,117,5,201,38,46,124,142,197,219,193,48,28,155,190,57,196,243,42,107,64,1,243,160,35,207,157,57,113,51,127,152,136,200,114,133,14,208,240,12,248,112,50,128,22,193,160,203,179,72,200,212,247,112,112,5,19,181,66,68,0,157,49,30,54,138,78,193,85,201,41,110,212,89,80,32,224,233,240,67,211,113,162,195,110,159,199,212,253,108,218,176,78,246,194,192,118,139,159,172,65,194,43,223,123,4,176,88,122,58,120,98,6,48,185,192,159,189,159,114,86,95,185,203,178,159,17,16,149,117,4,192,233,8,143,73,97,230,70,69,36,109,60,154,
|
||||
152,138,45,142,24,130,164,226,112,24,96,146,18,93,30,176,26,217,62,88,32,63,228,73,81,153,128,216,179,109,201,36,47,115,226,133,98,23,83,144,98,204,5,207,232,69,167,11,6,20,247,34,37,67,159,90,130,165,56,212,166,240,156,152,47,17,95,113,192,205,11,192,92,102,153,115,252,21,102,21,50,8,3,220,212,228,146,196,26,210,162,41,20,207,81,65,51,229,251,164,230,192,243,131,84,82,81,90,209,34,163,166,208,57,194,27,73,35,79,18,178,212,41,194,124,131,206,12,39,99,250,107,255,125,191,146,156,178,203,182,242,205,98,199,34,201,182,255,94,244,231,192,159,121,173,28,205,195,69,253,67,255,31,15,167,23,55,253,135,243,131,47,73,191,231,167,239,112,69,197,2,117,149,223,147,61,137,163,25,231,100,165,206,78,201,168,37,131,129,207,230,9,207,60,247,101,38,33,144,159,84,228,233,92,225,8,177,157,143,59,139,118,7,254,11,87,172,71,44,15,134,210,184,73,226,168,108,114,90,69,30,146,172,46,236,254,224,159,66,176,158,23,158,160,13,253,
|
||||
188,232,160,28,102,43,83,120,235,66,42,189,10,55,84,105,228,202,215,214,114,164,89,158,14,191,130,106,23,234,39,81,227,202,22,240,215,80,109,215,124,166,56,122,70,67,47,142,98,168,204,149,7,98,201,39,123,252,85,31,65,5,137,210,74,202,190,70,141,37,107,80,243,153,206,101,157,72,236,185,106,113,3,109,181,44,148,130,199,188,57,168,115,199,188,51,6,193,251,212,184,69,122,124,128,26,154,110,124,208,11,141,10,7,170,12,167,93,32,227,200,51,173,12,157,206,238,99,164,113,229,121,69,146,112,13,37,102,102,179,38,240,43,61,36,13,249,255,22,178,121,189,37,129,148,154,147,87,236,39,170,242,160,38,174,60,138,183,81,100,117,10,219,45,212,37,160,24,201,238,16,228,255,97,143,152,213,84,37,163,139,100,166,220,37,93,99,37,37,224,133,8,75,7,178,149,187,211,188,178,72,143,143,68,81,34,87,184,40,183,229,47,168,188,37,51,208,67,196,204,15,49,102,4,83,251,192,180,157,2,55,89,240,207,88,225,108,220,21,87,6,196,221,243,189,56,
|
||||
253,160,42,52,46,196,239,227,144,223,179,21,43,47,32,72,50,236,146,38,86,201,71,219,181,148,203,41,108,120,101,186,195,212,85,15,146,92,53,224,217,233,248,162,139,94,212,253,230,24,10,206,101,254,198,151,120,39,182,93,240,246,151,100,119,21,158,20,184,1,230,220,123,166,120,92,21,31,254,52,199,225,231,7,121,61,140,114,59,140,75,25,78,139,198,212,153,194,36,38,190,91,197,86,22,159,204,158,76,29,123,36,210,123,97,237,196,228,162,45,227,254,23,178,133,15,149,27,92,108,252,37,21,111,131,223,241,46,151,109,153,63,154,36,14,39,151,187,84,147,61,117,209,160,55,184,125,69,85,21,172,130,46,248,177,185,244,45,28,249,195,183,36,40,30,28,128,194,100,11,189,199,246,130,236,139,101,185,2,133,163,0,51,178,221,194,170,33,91,180,172,141,110,40,93,88,174,16,79,162,219,214,220,252,187,160,128,153,91,218,43,139,119,178,146,120,39,43,136,247,200,15,199,191,181,124,98,3,191,176,128,98,163,190,160,132,81,214,65,134,48,209,121,168,124,169,
|
||||
54,17,42,222,238,133,101,87,142,112,11,54,215,129,168,176,136,217,251,228,27,116,195,13,36,22,91,138,43,74,28,17,173,38,241,204,238,235,159,43,171,204,182,203,74,232,42,144,196,166,36,145,110,255,25,213,137,203,207,60,152,150,202,10,103,241,148,215,33,201,179,180,113,106,147,152,133,0,76,60,142,144,141,240,90,8,198,13,250,158,27,166,94,55,65,48,17,246,251,66,123,58,16,49,92,254,12,70,228,200,156,162,99,12,185,80,172,37,239,41,19,75,134,28,89,227,165,129,40,87,172,31,200,93,132,28,187,183,103,118,132,87,109,111,188,193,91,164,209,113,225,210,90,62,187,173,187,106,243,229,62,109,145,198,203,162,165,53,61,107,111,118,229,230,139,109,159,66,205,23,69,75,107,254,194,189,167,85,229,224,155,138,69,164,224,5,75,147,33,119,27,113,213,246,227,54,112,145,230,99,185,210,90,63,183,239,187,178,245,240,93,242,66,198,195,75,150,103,250,234,246,252,170,173,198,109,18,92,249,21,105,119,84,182,164,150,251,146,221,154,45,231,219,0,69,155,
|
||||
30,23,46,169,237,24,163,223,160,237,136,228,165,235,20,114,243,81,217,50,90,142,11,98,132,189,191,227,1,71,57,250,174,41,67,114,201,85,17,41,146,210,37,105,128,198,12,215,106,255,141,39,247,68,10,47,206,35,138,194,243,101,53,133,63,231,92,16,159,46,240,66,129,105,225,108,135,223,185,116,25,6,211,80,70,221,147,195,179,240,141,217,19,219,49,249,125,154,183,174,253,141,56,56,147,154,76,96,134,221,255,59,195,152,33,144,173,137,198,151,137,179,10,20,80,188,100,28,92,242,109,226,196,16,92,71,65,30,241,32,190,129,10,188,29,252,10,12,176,112,96,62,86,146,133,51,15,134,44,56,131,194,248,65,194,128,126,11,218,51,177,186,186,94,171,181,27,173,221,230,79,24,223,250,185,81,175,119,156,15,198,174,15,255,130,15,122,125,0,255,246,245,29,17,24,250,7,70,134,240,2,211,54,78,150,68,244,174,221,134,226,13,40,222,128,226,13,40,222,216,55,136,172,65,188,76,243,218,210,155,173,109,201,237,32,158,236,66,73,249,236,202,99,204,198,203,
|
||||
227,126,197,251,114,183,216,118,126,13,216,156,67,18,188,192,64,24,209,147,187,67,46,191,114,29,114,37,58,93,89,145,131,69,133,15,116,21,49,100,247,119,228,152,93,73,166,33,202,51,126,221,94,47,105,29,86,24,218,86,170,190,131,72,79,113,66,13,79,77,113,69,8,65,220,251,59,195,226,113,115,22,124,203,119,67,30,147,104,221,175,242,57,203,94,219,219,46,249,63,248,211,62,63,199,224,237,17,249,244,9,190,182,187,93,217,133,103,56,155,209,250,122,142,179,186,134,94,141,167,114,161,98,138,173,255,245,155,248,59,23,161,44,24,235,92,43,62,175,122,144,248,251,86,28,156,143,67,200,241,234,247,40,186,251,88,9,181,175,227,174,146,202,22,237,114,171,45,40,55,167,44,62,140,239,138,251,9,148,43,11,184,75,72,219,95,106,191,180,216,118,215,42,194,46,59,101,88,62,12,175,116,166,16,80,13,204,244,29,52,75,208,76,101,101,200,163,132,27,109,199,168,65,254,197,234,225,87,124,192,87,116,189,22,29,205,206,124,228,99,21,150,95,185,76,247,
|
||||
68,124,170,217,114,11,78,199,253,44,211,190,121,195,162,189,224,84,115,197,26,64,48,141,142,15,34,78,51,123,76,132,58,252,255,95,152,153,237,1,82,189,222,127,1,43,73,213,181,
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,13 @@ to Null puts the SshSession object into blocking mode. Returns
|
|||
inherit their default timeout values from their session.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Upp`:`:SshSession`:`:HashType`(Hash`): [_^Upp`:`:SshSession^ SshSession][@(0.0.255) `&
|
||||
]_[* HashType](Hash_[*@3 h])&]
|
||||
[s2;%% Sets the requested hash type for server fingerprint. Can be
|
||||
[C HASH`_MD5 ]or [C HASH`_SHA1]. SHA1 is the default hash algorithm.
|
||||
Returns `*this for method chaining.&]
|
||||
[s3;%% &]
|
||||
[s4; &]
|
||||
[s5;:Upp`:`:SshSession`:`:Keys`(const Upp`:`:String`&`,const Upp`:`:String`&`,const Upp`:`:String`&`,bool`): [_^Upp`:`:SshSession^ S
|
||||
shSession][@(0.0.255) `&]_[* Keys]([@(0.0.255) const]_[_^Upp`:`:String^ String][@(0.0.255) `&
|
||||
]_[*@3 prikey], [@(0.0.255) const]_[_^Upp`:`:String^ String][@(0.0.255) `&]_[*@3 pubkey],
|
||||
|
|
@ -109,7 +116,10 @@ onst]&]
|
|||
[s5;:Upp`:`:SshSession`:`:GetFingerprint`(`)const: [_^Upp`:`:String^ String]_[* GetFinger
|
||||
print]()_[@(0.0.255) const]&]
|
||||
[s2;%% Returns the computed digest of the server`'s host key (in
|
||||
raw bytes) on success, or an empty String on failure.&]
|
||||
raw bytes) on success, or an empty String on failure (e.g. requested
|
||||
hash algorithm might not be available). Hash type can be set
|
||||
using the [^topic`:`/`/Core`/SSH`/src`/Upp`_Ssh`_Session`_en`-us`#Upp`:`:SshSession`:`:HashType`(Hash`)^ H
|
||||
ashType()] method.&]
|
||||
[s3; &]
|
||||
[s4; &]
|
||||
[s5;:Upp`:`:SshSession`:`:GetSocket`(`): [_^Upp`:`:TcpSocket^ TcpSocket][@(0.0.255) `&]_[* G
|
||||
|
|
@ -191,10 +201,12 @@ authentication phase to allow user to query or set the authentication
|
|||
method(s)&]
|
||||
[s3; &]
|
||||
[s4; &]
|
||||
[s5;:Upp`:`:SshSession`:`:WhenVerify: [_^Upp`:`:Gate^ Gate]<>_[* WhenVerify]&]
|
||||
[s5;:Upp`:`:SshSession`:`:WhenVerify: [_^Upp`:`:Gate^ Gate]<[_^Upp`:`:String^ String],
|
||||
[@(0.0.255) int]>_[* WhenVerify]&]
|
||||
[s0;l288;%% This gate is invoked after a successful protocol handshake
|
||||
to allow user to verify the host against a list of known (trusted)
|
||||
hosts. Returning false halts the connection process.&]
|
||||
hosts. Passes the target hostname and port number as its parameters.
|
||||
Returning false halts the connection process.&]
|
||||
[s3; &]
|
||||
[s4; &]
|
||||
[s5;:Upp`:`:SshSession`:`:WhenProxy: [_^Upp`:`:Gate^ Gate]<>_[* WhenProxy]&]
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
TITLE("Session")
|
||||
COMPRESSED
|
||||
120,156,197,26,13,115,218,198,242,175,220,36,109,31,100,0,235,3,1,134,190,55,78,92,39,206,52,95,83,220,190,116,24,217,58,196,1,170,133,164,234,78,118,120,109,243,219,223,238,221,73,58,108,136,77,156,180,25,7,208,105,111,111,191,111,119,239,38,81,183,59,24,81,199,27,93,254,248,246,112,228,144,111,190,177,91,214,99,183,111,187,3,207,181,187,78,15,62,108,215,118,60,199,237,218,3,231,176,59,112,221,129,53,12,99,202,185,63,137,157,193,64,78,114,90,206,99,167,239,57,118,191,59,232,14,108,183,63,112,96,174,99,89,142,213,119,60,187,235,14,28,111,56,99,60,244,39,22,128,187,176,198,97,207,61,180,108,203,234,219,182,229,58,125,203,245,186,182,237,58,128,194,233,59,182,229,13,89,50,243,39,167,189,17,78,232,194,4,203,235,89,150,213,3,108,221,174,5,216,113,90,215,181,93,203,113,61,251,208,235,13,167,108,17,37,254,228,54,75,222,157,44,245,173,97,36,216,74,115,68,187,163,39,71,222,200,134,169,189,86,239,113,31,150,237,122,
|
||||
176,216,33,114,228,194,52,199,233,121,135,182,215,5,146,186,150,51,204,217,239,69,148,179,21,75,132,198,16,217,182,99,143,166,118,127,4,36,124,252,248,177,99,119,45,37,169,62,208,98,91,64,183,99,195,24,240,209,183,189,67,235,208,27,216,3,203,237,119,29,175,15,172,103,52,167,43,205,201,180,235,140,52,31,131,214,224,113,207,238,129,68,173,1,208,239,29,2,2,11,152,128,111,16,164,7,127,238,96,40,244,100,156,135,147,14,91,135,143,65,72,174,103,245,15,173,126,183,239,117,129,19,199,238,217,32,72,11,249,7,53,12,147,52,95,209,216,159,224,4,11,101,125,199,191,225,15,108,78,139,24,216,253,227,226,47,50,33,127,252,97,227,240,81,3,84,216,233,58,29,171,73,38,220,26,125,251,45,153,60,57,234,143,186,100,204,151,99,198,121,148,38,190,255,215,95,223,249,19,238,142,8,126,217,163,225,207,89,22,12,131,97,13,130,79,210,194,134,100,114,212,176,58,86,7,152,109,186,68,91,157,75,46,252,201,19,215,196,137,99,67,24,53,161,179,98,
|
||||
26,71,97,9,126,228,142,228,12,31,23,181,70,143,165,154,128,190,179,101,196,21,98,194,146,144,102,188,136,169,96,156,80,194,89,88,228,140,240,37,139,99,210,184,98,57,174,68,156,38,64,71,160,105,120,47,215,238,144,151,130,0,142,156,241,44,77,120,52,141,25,153,167,57,97,92,80,32,128,47,163,100,209,34,180,16,75,152,20,133,84,168,231,100,70,86,52,161,96,177,11,88,43,204,215,153,72,23,57,205,150,0,18,199,107,189,250,76,47,175,215,34,240,71,19,50,30,159,58,36,76,87,89,28,81,73,72,14,212,117,12,121,104,134,128,170,25,203,163,43,64,51,207,211,21,153,156,139,52,139,66,16,239,65,112,112,156,230,44,56,0,84,193,1,207,195,224,0,181,112,1,40,130,139,103,148,179,224,130,37,65,187,224,193,227,90,59,149,90,206,165,32,201,20,224,212,74,138,159,37,229,4,208,95,2,65,192,26,240,202,59,181,162,75,19,121,222,176,157,65,243,133,252,60,178,107,43,33,239,164,186,200,107,38,150,233,140,188,138,184,184,97,41,222,14,75,
|
||||
57,139,86,44,45,68,208,136,18,17,52,193,100,46,206,111,193,157,111,24,75,109,37,36,248,206,191,128,197,53,14,191,97,190,3,124,248,242,200,37,43,238,55,145,4,7,105,29,51,193,137,80,19,200,21,141,11,6,144,100,21,129,174,89,152,38,51,222,65,16,84,51,1,157,223,128,20,41,121,83,128,66,179,2,145,192,107,67,105,233,244,55,22,10,92,54,37,211,56,13,47,17,197,42,157,177,14,249,137,137,34,79,56,9,158,8,180,87,180,175,149,18,84,184,164,81,2,128,29,242,38,21,128,127,73,193,32,248,146,240,98,202,215,28,98,26,151,186,1,176,36,97,49,216,68,178,4,147,16,184,118,148,131,121,72,55,222,36,146,43,107,81,16,165,149,43,69,0,251,248,163,251,105,141,252,200,214,60,104,128,44,184,32,37,128,200,129,200,224,187,160,181,223,240,52,77,227,207,85,42,146,177,169,81,185,8,188,171,145,201,133,0,145,252,222,130,4,148,159,229,209,37,91,251,45,242,112,76,197,244,75,97,90,230,224,124,254,69,240,239,11,52,167,77,140,40,
|
||||
51,13,135,138,156,71,177,130,52,97,68,94,176,91,54,13,230,72,249,122,5,150,149,131,39,66,56,196,168,132,150,9,84,115,52,221,41,35,5,135,104,2,63,141,128,198,228,204,42,28,78,190,109,27,36,146,16,2,150,49,111,198,194,40,3,19,148,115,64,180,87,56,31,240,67,24,157,235,57,24,183,146,20,204,56,3,216,121,196,102,45,176,230,12,130,29,96,200,32,218,92,167,249,140,92,71,224,69,37,222,8,68,200,232,108,95,63,185,6,14,36,29,154,228,74,90,68,238,161,76,0,153,128,5,101,213,170,216,82,214,32,157,170,28,82,106,37,92,42,140,87,164,137,156,1,115,51,144,41,65,172,128,84,44,165,24,113,73,220,46,192,219,33,56,35,247,18,0,2,135,220,141,34,165,138,210,55,167,108,73,175,162,180,128,8,255,22,198,243,107,136,51,8,176,222,182,208,138,173,210,124,77,166,197,124,14,27,22,26,151,80,124,43,237,134,162,160,177,84,231,94,14,173,130,178,138,176,45,13,241,11,134,138,207,117,77,133,112,87,184,21,235,140,161,151,84,
|
||||
136,229,90,231,68,126,149,33,89,97,216,98,194,89,206,128,119,220,59,69,78,19,216,148,115,81,26,1,218,3,130,232,71,173,63,185,28,200,190,130,214,227,26,202,175,141,97,69,215,165,72,49,65,0,177,198,37,178,22,1,220,148,192,38,32,72,58,215,131,176,49,94,71,98,169,214,76,225,77,77,155,70,142,240,165,137,228,0,128,102,133,208,49,163,27,224,0,0,27,173,184,151,133,239,175,89,136,214,166,164,95,211,236,97,138,197,176,187,169,60,64,169,245,7,191,54,84,120,123,107,221,174,7,14,42,210,216,149,148,249,50,45,226,89,165,15,48,234,160,173,54,217,140,130,44,91,232,222,57,83,177,43,103,32,74,142,89,91,150,114,149,163,105,169,161,242,117,254,162,55,191,26,182,82,49,10,25,92,49,202,98,118,203,168,26,188,185,91,203,255,180,122,223,233,112,249,20,162,117,208,248,92,165,154,88,252,198,182,93,195,200,110,97,187,40,69,155,98,138,8,59,73,21,180,55,225,246,224,246,94,188,202,4,18,54,253,7,50,107,162,217,143,91,85,113,200,
|
||||
120,254,85,57,61,5,35,195,36,253,129,106,221,64,179,31,167,75,52,115,204,255,191,178,78,65,13,211,148,62,212,126,77,44,251,241,121,169,103,6,109,216,157,88,78,213,134,221,0,78,226,152,37,11,118,160,171,62,214,252,186,114,120,186,0,212,15,19,66,133,194,148,192,73,2,53,42,196,188,130,203,58,52,193,210,33,104,83,4,149,20,239,98,106,119,118,37,51,24,61,170,251,34,188,116,12,140,126,70,202,87,166,148,58,220,238,33,142,23,76,156,2,178,152,85,226,120,245,242,25,86,197,80,193,158,140,199,47,223,190,57,39,55,71,54,101,242,68,202,164,194,83,201,164,226,144,194,78,33,117,94,38,108,113,52,5,225,56,85,41,190,148,19,177,34,231,69,24,50,44,130,223,252,252,234,21,14,204,105,20,67,241,190,31,67,207,176,64,203,145,33,89,17,108,40,121,179,34,208,148,171,9,64,249,197,237,114,162,82,112,173,48,166,251,4,28,252,22,39,146,104,78,232,21,80,138,22,176,31,169,207,129,10,150,131,38,33,29,188,63,189,198,172,61,136,198,
|
||||
54,71,129,123,232,44,90,48,149,91,213,188,4,255,226,42,20,97,200,133,236,148,228,244,154,76,215,130,241,230,134,98,208,146,19,194,86,153,88,107,162,62,91,77,99,168,203,153,184,233,134,103,97,166,94,156,147,234,231,54,39,172,16,152,78,88,155,156,204,7,160,238,98,165,209,149,198,198,229,164,253,40,173,82,187,77,82,183,167,99,164,158,160,73,179,70,101,139,172,166,175,204,110,177,28,131,12,104,75,138,205,55,228,142,14,95,9,94,77,174,197,78,198,21,22,51,23,35,52,103,117,14,6,47,167,107,18,60,194,112,17,60,210,24,75,171,53,178,236,101,20,46,203,82,179,74,219,184,86,181,153,152,235,34,173,181,125,25,149,2,6,143,204,42,17,66,125,153,26,226,28,176,178,56,189,102,121,136,149,106,204,4,132,136,253,138,41,144,52,134,225,93,234,129,162,48,205,65,57,242,219,255,126,167,87,253,71,107,205,192,181,151,230,160,112,190,25,223,75,121,214,113,190,82,222,149,36,103,67,125,103,75,108,116,198,32,12,20,242,28,10,212,29,232,164,216,
|
||||
194,2,18,221,68,96,103,179,36,97,8,2,47,83,67,212,45,60,201,125,2,51,121,249,136,174,45,147,12,245,184,117,51,6,93,41,225,87,98,122,46,192,182,149,30,110,143,237,82,202,177,44,161,17,238,214,14,43,231,226,167,244,147,26,208,116,97,53,42,229,197,231,34,43,219,109,178,49,65,193,159,247,240,92,133,234,88,33,216,178,221,235,55,114,187,215,191,13,194,202,145,109,180,17,216,214,25,118,118,30,76,221,201,7,22,110,33,13,135,37,93,248,195,32,74,62,110,151,22,131,87,15,167,103,28,222,86,91,136,90,11,55,148,22,238,212,89,248,5,84,118,86,236,208,152,122,33,5,163,126,26,52,233,129,173,234,18,192,85,59,202,84,218,132,33,22,18,174,107,176,127,116,183,135,139,12,207,21,182,101,147,56,174,114,73,252,101,138,79,62,111,165,52,103,43,12,151,234,172,226,33,164,165,48,51,20,187,122,199,205,225,214,62,39,209,211,190,64,175,183,200,99,163,29,161,241,202,60,149,170,83,23,149,119,212,173,73,220,54,140,14,34,206,55,178,228,
|
||||
188,48,19,196,14,169,43,143,117,34,232,135,50,153,249,249,167,87,216,244,195,46,129,140,167,120,238,117,12,216,130,9,166,227,127,130,117,194,7,132,149,224,79,116,151,192,31,30,28,4,19,140,223,195,42,124,30,5,62,70,203,96,50,68,75,9,124,127,114,76,58,254,62,219,210,29,178,111,201,222,223,94,205,251,175,175,46,100,249,70,59,189,238,34,162,32,190,68,175,29,5,253,69,122,246,90,87,123,26,24,173,250,96,146,219,141,198,51,114,184,219,220,246,209,254,15,17,15,75,3,184,169,184,171,52,154,73,197,213,64,102,24,168,71,235,131,35,147,151,61,252,255,191,144,61,128,76,230,209,194,140,74,39,87,144,56,156,19,249,229,127,47,243,158,26,176,174,26,100,229,201,16,8,157,137,173,34,33,148,248,144,30,121,55,64,246,193,181,207,101,121,42,210,48,141,101,29,199,151,244,18,134,150,152,210,161,42,208,9,85,130,4,79,191,23,44,95,99,18,201,153,194,117,43,231,221,147,67,204,216,238,193,159,172,213,55,243,185,253,88,44,139,135,27,89,217,
|
||||
125,217,220,154,204,53,120,115,63,102,127,129,140,99,190,54,217,125,1,155,198,57,193,79,131,89,5,182,141,221,5,118,11,240,84,36,185,74,47,145,219,57,22,229,180,180,242,121,17,111,211,229,45,246,174,228,2,146,49,89,49,210,5,197,13,202,72,141,47,147,244,58,33,13,240,34,236,217,54,37,88,149,10,203,20,151,198,32,184,37,141,69,89,154,74,171,151,50,205,83,195,229,238,43,155,119,121,250,225,110,209,72,168,218,204,95,206,85,247,165,148,203,140,205,163,4,207,192,68,117,30,84,138,42,143,22,75,60,63,130,188,65,157,209,69,73,36,34,26,235,114,210,96,160,188,196,176,98,120,161,160,22,158,136,226,232,127,234,244,40,202,241,244,45,135,90,32,104,67,166,30,23,11,204,195,131,71,36,97,2,194,218,37,202,224,195,154,208,25,205,176,36,130,64,20,180,103,120,17,96,246,85,101,248,222,182,119,251,18,128,195,123,213,226,169,228,9,35,82,154,189,17,121,247,118,252,242,61,80,26,175,145,70,221,172,130,116,166,80,126,244,222,140,96,55,99,
|
||||
140,20,182,206,200,36,43,128,215,96,167,58,232,43,51,169,42,31,226,186,172,4,243,205,132,156,133,125,50,38,141,109,204,216,125,111,105,232,76,159,111,187,169,161,146,187,141,235,26,42,123,219,83,184,101,227,212,148,240,243,34,145,12,158,147,242,215,39,138,212,198,206,55,173,221,253,162,79,188,106,86,90,44,73,219,22,50,240,6,205,148,134,151,234,90,142,84,107,149,168,125,118,71,87,7,64,85,247,202,16,34,45,32,226,92,238,186,234,144,8,29,173,66,165,110,94,104,2,100,150,172,48,171,235,65,20,27,22,37,168,196,154,151,142,106,176,208,186,117,175,40,157,150,39,186,50,180,149,72,121,75,158,78,26,222,191,82,200,40,222,26,10,89,125,69,199,5,31,157,69,200,18,68,130,234,108,147,147,6,188,211,221,17,76,0,228,201,104,36,98,121,18,139,15,104,191,121,161,140,219,87,232,244,253,136,116,149,97,30,114,134,208,114,220,4,45,201,82,125,4,189,64,25,18,48,72,149,12,84,225,139,97,183,133,138,90,103,40,109,51,136,84,93,9,221,224,
|
||||
145,19,49,166,220,12,41,20,246,71,0,220,231,26,210,113,170,105,79,241,118,12,136,58,190,231,53,36,227,73,101,80,79,204,134,188,153,47,233,115,253,176,94,105,15,183,12,62,222,90,200,76,54,63,250,119,174,59,99,213,178,4,114,140,116,69,133,190,115,22,198,41,103,220,204,29,76,194,172,50,149,180,54,36,249,201,59,127,198,161,122,217,163,210,210,116,70,186,26,34,207,24,110,53,145,217,165,186,117,112,175,58,131,13,236,2,54,213,221,57,221,90,106,168,206,92,211,104,108,129,209,64,188,4,203,14,47,233,130,117,140,197,42,19,232,218,174,59,244,6,189,126,124,224,244,114,248,47,14,236,238,20,254,31,217,109,101,12,255,86,214,0,81,134,156,124,192,138,118,193,124,127,56,4,120,15,224,61,128,247,0,222,59,114,36,52,81,175,54,81,53,236,254,160,89,33,3,76,0,84,61,202,222,43,36,83,91,113,254,217,53,104,56,38,166,1,12,95,159,156,157,190,253,33,184,56,121,127,124,250,244,205,139,19,191,196,138,192,199,100,22,205,161,106,8,218,
|
||||
24,237,97,239,13,218,139,60,45,50,59,104,67,90,100,87,176,228,94,147,186,127,223,172,160,205,180,148,191,192,108,199,235,249,219,20,114,67,183,120,252,137,90,249,251,212,106,223,173,214,211,183,227,179,31,79,126,189,161,85,121,42,55,227,124,151,88,228,251,156,211,251,176,125,172,174,95,53,142,213,45,86,112,166,3,8,117,99,153,232,52,255,78,97,220,67,26,199,39,111,142,127,250,245,221,25,30,223,169,200,243,73,240,177,1,190,41,32,202,56,88,69,208,14,69,78,118,9,17,96,236,67,71,194,60,12,68,173,52,13,73,35,143,126,75,102,148,197,242,49,56,138,215,156,98,216,141,163,162,3,9,198,157,171,76,195,79,129,56,131,79,130,184,16,231,31,6,16,82,46,238,90,133,230,33,118,254,239,120,13,88,118,65,36,144,58,221,199,108,95,63,61,38,167,84,222,166,254,231,109,183,127,15,211,5,130,239,101,179,8,183,41,146,229,138,134,42,144,5,109,29,203,182,73,206,4,243,108,231,78,176,157,65,181,134,8,218,135,119,44,183,154,121,119,2,220,
|
||||
141,37,143,50,182,154,217,61,139,52,110,12,4,71,105,198,18,136,103,157,48,93,237,244,16,101,52,42,145,144,99,190,255,127,82,206,167,130,
|
||||
120,156,197,26,13,115,26,183,242,175,104,146,182,15,50,128,239,131,3,12,237,27,39,196,137,51,249,156,226,246,165,195,156,125,226,16,112,245,125,189,147,206,14,175,109,126,251,219,149,116,31,216,96,155,56,105,51,14,112,186,213,106,191,181,187,210,52,232,118,7,35,106,57,163,139,215,239,15,71,22,249,238,59,179,101,60,182,251,166,61,112,108,179,107,245,224,195,180,77,203,177,236,174,57,176,14,187,3,219,30,24,67,63,164,156,187,211,208,26,12,228,36,171,101,61,182,250,142,101,246,187,131,238,192,180,251,3,11,230,90,134,97,25,125,203,49,187,246,192,114,134,115,198,125,119,106,0,184,13,107,28,246,236,67,195,52,140,190,105,26,182,213,55,108,167,107,154,182,5,40,172,190,101,26,206,144,197,115,119,122,210,27,225,132,46,76,48,156,158,97,24,61,192,214,237,26,128,29,167,117,109,211,54,44,219,49,15,157,222,112,198,150,65,236,78,111,178,228,220,201,82,223,24,6,130,69,154,35,218,29,61,57,114,70,38,76,237,181,122,143,251,176,108,215,129,197,
|
||||
14,145,35,27,166,89,86,207,57,52,157,46,144,212,53,172,97,198,254,155,7,25,139,88,44,52,134,192,52,45,115,52,51,251,35,32,225,243,231,207,29,179,107,40,73,245,129,22,211,0,186,45,19,198,128,143,190,233,28,26,135,206,192,28,24,118,191,107,57,125,96,61,165,25,141,52,39,179,174,53,210,124,12,90,131,199,61,179,7,18,53,6,64,191,115,8,8,12,96,2,190,65,144,14,252,217,131,161,208,147,113,30,78,58,108,29,62,6,33,217,142,209,63,52,250,221,190,211,5,78,44,179,103,130,32,13,228,31,212,48,140,147,44,162,161,59,197,9,6,202,250,142,127,195,231,108,65,243,16,216,253,227,252,47,50,37,127,252,97,226,240,81,3,84,216,233,90,29,163,73,166,220,24,125,255,61,153,62,57,234,143,186,100,194,87,19,198,121,144,196,174,251,215,95,63,184,83,110,143,8,126,153,163,225,47,105,234,13,189,97,5,130,79,210,194,134,100,122,212,48,58,70,7,152,109,218,68,91,157,77,206,221,233,19,187,142,19,199,134,48,90,135,78,243,89,24,
|
||||
248,5,248,145,61,146,51,92,92,212,24,61,150,106,2,250,78,87,1,87,136,9,139,125,154,242,60,164,130,113,66,9,103,126,158,49,194,87,44,12,73,227,146,101,184,18,177,154,0,29,128,166,225,189,92,187,67,94,9,2,56,50,198,211,36,230,193,44,100,100,145,100,132,113,65,129,0,190,10,226,101,139,208,92,172,96,82,224,83,161,158,227,57,137,104,76,193,98,151,176,150,159,173,83,145,44,51,154,174,0,36,12,215,122,245,185,94,94,175,69,224,143,198,100,50,57,177,136,159,68,105,24,80,73,72,6,212,117,106,242,208,12,1,85,115,150,5,151,128,102,145,37,17,153,158,137,36,13,124,16,239,129,119,48,78,50,230,29,0,42,239,128,103,190,119,128,90,56,7,20,222,249,51,202,153,119,206,98,175,157,115,239,113,165,157,82,45,103,82,144,100,6,112,106,37,197,207,138,114,2,232,47,128,32,96,13,120,229,157,74,209,133,137,188,104,152,214,160,249,82,126,30,153,149,149,144,15,82,93,228,45,19,171,100,78,222,4,92,92,179,20,103,135,165,156,6,
|
||||
17,75,114,225,53,130,88,120,77,48,153,243,179,27,112,103,27,198,82,89,9,241,126,112,207,97,113,141,195,109,212,223,1,62,124,121,100,147,136,187,77,36,193,66,90,39,76,112,34,212,4,114,73,195,156,1,36,137,2,208,53,243,147,120,206,59,8,130,106,38,160,243,107,144,34,33,239,114,80,104,154,35,18,120,93,83,90,50,251,157,249,2,151,77,200,44,76,252,11,68,17,37,115,214,33,63,51,145,103,49,39,222,19,129,246,138,246,21,41,65,249,43,26,196,0,216,33,239,18,1,248,87,20,12,130,175,8,207,103,124,205,33,166,113,169,27,0,139,99,22,130,77,196,43,48,9,129,107,7,25,152,135,116,227,77,34,185,178,22,5,81,88,185,82,4,176,143,63,186,183,107,228,132,242,213,233,58,101,94,3,127,125,169,78,10,44,174,196,162,20,177,186,161,7,16,33,134,95,240,54,38,45,112,69,4,204,145,18,82,126,65,22,32,29,150,165,25,200,181,67,198,224,62,51,70,166,99,114,242,20,76,255,252,237,115,135,184,0,91,14,76,78,158,154,46,104,
|
||||
16,190,208,127,16,127,33,36,137,157,134,203,4,228,183,138,238,165,148,125,164,246,154,173,185,215,0,11,226,130,20,0,2,168,94,122,63,120,173,253,134,103,73,18,126,169,216,145,140,77,63,144,139,192,187,10,153,92,8,16,201,239,45,72,64,83,32,239,11,182,118,91,228,225,152,242,217,215,194,180,202,32,100,185,231,222,79,231,232,132,155,24,81,102,26,14,205,127,17,132,10,178,14,35,178,156,109,179,64,202,215,17,168,62,131,248,5,155,8,198,114,244,103,160,154,163,195,131,189,229,28,172,19,126,214,182,1,38,103,150,155,200,244,251,118,141,68,226,43,59,45,230,205,153,31,164,224,184,114,14,136,246,18,231,3,126,216,124,22,122,14,90,107,156,128,243,167,0,187,8,216,188,5,49,32,133,45,2,48,164,16,163,175,146,108,78,174,2,136,61,5,222,0,68,200,232,124,223,232,114,5,28,72,58,52,201,165,180,136,204,60,152,0,50,209,115,64,86,173,146,45,101,13,50,20,21,67,74,173,132,75,133,241,146,52,145,49,138,190,12,155,9,98,5,164,98,
|
||||
37,197,168,92,29,217,19,176,165,33,247,18,0,194,173,220,195,175,57,235,140,173,232,101,144,228,176,47,190,135,241,236,10,162,51,2,172,183,45,20,177,40,201,214,100,150,47,22,176,205,163,113,9,197,183,210,174,47,114,26,74,117,238,229,208,106,43,83,251,82,75,67,252,138,1,246,75,93,83,33,220,181,73,97,220,67,47,41,17,203,181,206,136,252,42,54,50,133,97,139,9,167,25,3,222,49,227,16,25,141,33,149,201,68,97,4,104,15,8,162,31,181,254,228,114,32,251,18,90,143,107,40,183,50,134,136,174,11,145,98,90,5,98,13,11,100,45,2,184,41,129,173,83,144,100,161,7,33,157,184,130,8,171,214,76,224,77,69,155,70,142,240,133,137,100,0,128,102,133,208,33,163,27,224,0,0,233,137,248,234,161,90,41,2,162,117,93,210,111,105,250,48,197,98,216,221,84,30,160,212,250,131,95,27,42,188,153,144,108,215,3,7,21,105,236,74,202,124,149,228,225,188,212,7,24,181,215,86,169,73,74,65,150,45,116,239,140,169,216,149,49,16,37,199,92,55,
|
||||
77,184,202,108,181,212,80,249,58,235,211,41,67,5,91,170,24,133,12,174,24,164,33,187,97,84,13,222,220,173,229,127,90,189,31,116,184,124,10,209,218,107,124,169,82,235,88,220,198,182,93,163,86,19,192,118,81,136,54,193,196,26,118,146,50,104,111,194,237,193,237,189,120,149,105,55,108,250,15,100,182,142,102,63,110,85,157,38,227,249,55,229,244,4,140,12,75,155,7,170,117,3,205,126,156,174,208,204,177,106,250,198,58,5,53,204,18,250,80,251,173,99,217,143,207,11,61,211,107,195,238,196,50,170,54,236,6,112,18,134,12,146,241,3,93,43,179,230,183,149,195,211,37,160,126,152,16,74,20,117,9,28,199,80,217,67,204,203,185,172,222,99,44,184,188,54,69,80,73,241,46,166,118,103,87,50,131,209,163,186,155,196,11,199,192,232,87,75,249,138,148,82,135,219,61,196,241,146,137,19,64,22,178,82,28,111,94,61,195,94,2,84,61,199,147,201,171,247,239,206,200,245,145,77,153,60,145,50,41,241,148,50,41,57,164,176,83,72,157,23,9,91,24,204,64,56,
|
||||
86,217,192,88,201,137,216,199,224,185,239,51,108,29,188,251,229,205,27,28,88,208,32,204,51,182,31,67,207,176,172,205,144,33,89,17,108,40,121,179,34,208,148,171,9,64,249,249,205,114,162,84,112,165,48,166,171,72,14,126,139,19,73,176,32,244,18,40,69,11,216,143,212,23,85,29,186,7,189,181,89,123,16,141,205,161,28,247,208,121,176,100,42,183,170,120,241,254,197,85,40,194,144,11,217,41,201,232,21,153,173,5,227,205,13,197,160,37,199,132,69,169,88,107,162,106,106,34,13,214,1,195,189,86,123,151,213,49,137,130,229,74,200,130,4,108,181,148,88,179,35,203,122,85,163,235,26,135,51,161,61,73,22,21,247,235,81,21,162,221,210,166,186,165,17,113,86,54,21,26,77,87,251,219,126,74,156,36,254,5,19,215,227,201,169,159,170,23,103,164,252,185,45,154,148,8,234,209,164,242,29,153,216,64,1,201,10,239,41,188,134,203,73,251,81,90,230,168,155,164,110,207,43,73,53,65,147,102,140,138,14,105,69,95,145,166,99,93,9,169,220,150,90,129,111,24,
|
||||
16,70,174,210,130,212,228,202,205,201,164,196,82,79,42,9,205,88,149,76,194,203,217,154,120,143,48,238,121,143,52,198,194,152,106,229,194,42,240,87,133,61,149,249,39,215,54,91,175,48,116,181,217,218,190,140,202,101,189,71,245,114,23,246,172,34,199,197,57,224,46,97,114,197,50,31,75,238,144,9,136,117,251,85,133,32,105,220,79,118,169,7,170,219,36,3,229,200,111,247,199,157,225,225,223,90,107,53,92,123,105,46,135,88,176,125,7,231,213,134,85,42,239,82,146,179,161,190,211,21,118,217,66,16,6,10,121,1,149,246,14,116,82,108,126,14,25,123,44,176,177,93,144,48,4,129,23,57,46,234,22,158,228,134,135,37,137,124,196,24,37,179,37,245,184,53,171,0,93,41,225,151,98,122,33,192,182,149,30,110,142,237,82,202,88,246,2,16,238,70,170,32,231,226,167,244,147,10,176,238,194,106,84,202,139,47,68,90,116,91,101,135,133,130,63,239,225,185,10,213,88,33,216,146,183,232,55,50,111,209,191,107,132,21,35,219,104,35,144,159,48,108,81,61,152,186,
|
||||
227,79,204,223,66,26,14,75,186,240,71,141,40,249,184,93,90,12,94,61,156,158,137,127,83,109,62,106,205,223,80,154,191,83,103,254,87,80,217,105,190,67,99,234,133,20,140,250,89,163,73,15,108,85,151,0,174,218,65,170,242,63,12,177,144,57,94,129,253,163,187,61,92,100,120,172,180,45,45,198,113,149,20,227,175,186,248,228,243,86,74,51,22,97,184,84,71,85,15,33,45,129,153,190,216,213,4,111,14,183,54,108,137,158,246,21,154,214,121,22,214,250,42,26,175,76,184,169,58,116,211,71,10,101,143,21,183,141,90,43,20,231,215,210,253,44,175,103,186,29,82,149,80,235,88,208,79,69,86,246,203,207,111,176,123,137,237,14,25,79,241,216,115,12,216,188,41,214,21,127,130,117,194,7,132,21,239,79,116,23,207,29,30,28,120,83,140,223,195,50,124,30,121,46,70,75,111,58,68,75,241,92,119,58,38,29,119,159,109,233,14,217,183,100,19,115,175,83,136,111,175,46,100,249,218,185,64,213,14,69,65,124,141,67,3,20,244,87,57,124,208,186,218,211,192,104,
|
||||
217,208,147,220,110,116,208,145,195,221,230,182,143,246,159,7,220,47,12,224,186,226,46,147,96,46,21,87,1,213,195,64,53,90,157,27,214,121,217,195,255,255,3,217,3,200,100,17,44,235,81,233,248,18,18,135,51,34,191,220,31,101,222,83,1,86,229,143,44,161,25,2,161,51,177,40,16,66,137,15,233,145,87,67,100,67,95,251,92,154,37,34,241,147,80,22,164,124,69,47,96,104,133,41,29,170,2,157,80,37,72,240,4,245,77,182,38,242,56,81,225,186,145,243,238,201,33,102,108,247,224,79,54,29,54,243,185,253,88,44,138,135,107,89,217,125,217,220,154,204,53,120,115,63,102,127,133,140,99,177,174,179,251,18,54,141,51,130,159,183,100,183,55,157,186,148,139,194,184,77,50,75,236,144,224,73,80,124,153,92,160,96,22,216,136,160,133,67,44,242,112,155,218,111,72,226,82,46,32,101,32,171,100,186,164,184,151,213,178,232,139,56,185,138,73,3,28,14,43,223,166,4,131,240,142,13,95,166,234,111,65,179,37,200,17,95,196,52,98,213,30,30,231,209,12,137,
|
||||
2,42,193,95,202,51,146,50,231,150,185,52,13,65,67,43,26,138,162,152,151,238,37,149,151,37,53,223,190,175,18,62,100,201,167,157,58,40,5,43,161,42,127,122,181,80,253,170,66,170,115,182,8,98,60,53,20,229,9,90,33,232,76,214,250,51,6,9,138,58,213,12,226,64,4,52,212,117,107,141,129,226,178,76,196,240,226,74,37,122,17,132,193,255,84,11,32,200,240,188,50,131,162,195,107,67,73,16,230,75,76,248,189,71,36,102,2,226,231,5,202,224,211,154,208,57,77,81,112,16,241,188,246,28,47,156,204,191,169,12,63,154,230,110,167,5,112,120,175,154,98,165,60,97,68,74,179,55,34,31,222,79,94,125,4,74,195,53,210,168,219,123,144,55,229,202,97,63,214,67,229,245,96,38,133,173,83,63,201,10,224,173,177,83,30,141,22,41,91,153,120,113,93,191,130,241,167,66,206,210,205,26,121,65,229,222,157,22,93,82,240,173,173,22,153,69,110,92,11,82,105,226,158,194,45,90,205,117,9,191,200,99,201,224,25,41,126,221,18,47,26,183,69,146,47,120,
|
||||
213,44,181,88,144,182,45,224,224,77,173,25,245,47,212,245,47,169,214,50,35,252,226,30,120,209,150,146,5,182,12,64,210,2,2,206,229,246,174,142,213,208,209,74,84,234,134,143,38,64,166,227,10,179,186,134,70,177,51,82,128,74,172,89,225,168,53,22,90,55,238,175,37,179,226,12,92,6,198,2,41,111,201,243,220,154,247,71,10,25,197,219,105,62,171,174,130,217,224,163,243,0,89,130,72,80,69,58,210,128,119,186,13,131,153,134,60,75,14,68,40,207,174,241,1,237,55,203,149,113,187,10,157,190,81,146,68,41,38,60,167,8,45,199,235,160,5,89,170,97,161,23,40,66,2,6,169,130,129,50,124,49,108,235,80,81,233,12,165,93,15,34,101,251,67,119,146,228,68,140,41,215,67,10,133,141,24,0,247,185,238,54,78,52,237,9,222,194,2,81,135,247,188,238,86,123,82,169,218,147,250,17,70,61,49,211,55,33,252,106,165,61,220,210,251,124,99,161,122,86,251,217,189,115,221,57,43,151,37,144,204,36,17,21,250,110,163,31,38,197,70,185,121,189,140,40,
|
||||
39,211,57,171,177,33,201,91,239,150,214,174,33,20,205,48,45,77,107,164,203,46,242,140,225,86,19,212,219,97,55,174,58,168,22,100,3,219,141,77,117,71,83,247,176,26,170,5,216,172,117,208,192,104,32,94,130,101,251,23,116,201,58,181,197,74,19,232,154,182,61,116,6,189,126,120,96,245,50,248,47,14,204,238,12,254,31,153,109,101,12,63,41,107,128,40,67,142,63,97,233,188,100,174,59,28,2,188,3,240,14,192,59,0,239,28,89,18,154,168,87,155,168,26,102,127,208,44,145,1,38,0,42,31,101,147,23,178,182,173,56,255,236,214,104,24,147,186,1,12,223,30,159,158,188,127,238,157,31,127,28,159,60,125,247,242,216,45,176,34,240,152,204,131,5,148,39,94,27,163,61,236,189,94,123,153,37,121,106,122,109,72,170,204,18,150,220,107,82,247,239,155,229,181,153,150,242,87,152,109,57,61,119,155,66,174,233,22,15,140,81,43,127,159,90,205,187,213,122,242,126,114,250,250,248,183,107,90,149,231,152,115,206,119,137,69,190,207,56,189,15,219,99,117,97,173,
|
||||
49,86,183,165,193,153,14,32,212,77,100,162,211,252,59,133,113,15,105,140,143,223,141,127,254,237,195,41,30,120,170,200,115,43,248,164,6,190,41,32,202,56,88,133,215,246,69,70,118,9,17,96,204,67,75,194,60,12,68,173,52,243,73,35,11,126,143,231,148,133,242,209,59,10,215,156,98,216,13,131,188,3,9,198,157,171,204,252,219,64,172,193,173,32,54,196,249,135,1,248,148,139,187,86,161,153,143,71,12,119,188,6,44,187,32,98,72,157,238,99,182,111,159,142,229,33,33,238,247,255,184,237,246,239,97,186,64,240,189,108,22,225,54,69,178,138,168,175,2,153,215,214,177,108,155,228,234,96,142,105,221,9,182,51,168,86,16,94,251,240,142,229,162,185,115,39,192,221,88,178,32,101,209,220,236,25,164,113,109,192,59,74,82,22,67,60,235,248,73,180,211,67,148,209,168,68,66,142,185,238,255,1,244,93,122,38,
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue